xrds.lib.php 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. <?php
  2. /**
  3. * Parsing library for OpenID
  4. */
  5. // Global variables to track parsing state
  6. $xrds_open_elements = array();
  7. $xrds_services = array();
  8. $xrds_current_service = array();
  9. /**
  10. * Main entry point for parsing XRDS documents
  11. */
  12. function xrds_parse($xml) {
  13. global $xrds_services;
  14. $parser = xml_parser_create_ns();
  15. xml_set_element_handler($parser, '_xrds_element_start', '_xrds_element_end');
  16. xml_set_character_data_handler($parser, '_xrds_cdata');
  17. xml_parse($parser, $xml);
  18. xml_parser_free($parser);
  19. return $xrds_services;
  20. }
  21. /**
  22. * Parser callback functions
  23. */
  24. function _xrds_element_start(&$parser, $name, $attribs) {
  25. global $xrds_open_elements;
  26. $xrds_open_elements[] = _xrds_strip_namespace($name);
  27. }
  28. function _xrds_element_end(&$parser, $name) {
  29. global $xrds_open_elements, $xrds_services, $xrds_current_service;
  30. $name = _xrds_strip_namespace($name);
  31. if ($name == 'SERVICE') {
  32. if (in_array(OPENID_NS_2_0 .'/signon', $xrds_current_service['types']) ||
  33. in_array(OPENID_NS_2_0 .'/server', $xrds_current_service['types'])) {
  34. $xrds_current_service['version'] = 2;
  35. }
  36. elseif (in_array(OPENID_NS_1_1, $xrds_current_service['types']) ||
  37. in_array(OPENID_NS_1_0, $xrds_current_service['types'])) {
  38. $xrds_current_service['version'] = 1;
  39. }
  40. if (!empty($xrds_current_service['version'])) {
  41. $xrds_services[] = $xrds_current_service;
  42. }
  43. $xrds_current_service = array();
  44. }
  45. array_pop($xrds_open_elements);
  46. }
  47. function _xrds_cdata(&$parser, $data) {
  48. global $xrds_open_elements, $xrds_services, $xrds_current_service;
  49. $path = strtoupper(implode('/', $xrds_open_elements));
  50. switch ($path) {
  51. case 'XRDS/XRD/SERVICE/TYPE':
  52. $xrds_current_service['types'][] = $data;
  53. break;
  54. case 'XRDS/XRD/SERVICE/URI':
  55. $xrds_current_service['uri'] = $data;
  56. break;
  57. case 'XRDS/XRD/SERVICE/DELEGATE':
  58. $xrds_current_service['delegate'] = $data;
  59. break;
  60. }
  61. }
  62. function _xrds_strip_namespace($name) {
  63. // Strip namespacing.
  64. $pos = strrpos($name, ':');
  65. if ($pos !== FALSE) {
  66. $name = substr($name, $pos + 1, strlen($name));
  67. }
  68. return $name;
  69. }