Mercurial > defr > drupal > core
comparison modules/openid/xrds.inc @ 1:c1f4ac30525a 6.0
Drupal 6.0
| author | Franck Deroche <webmaster@defr.org> |
|---|---|
| date | Tue, 23 Dec 2008 14:28:28 +0100 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 0:5a113a1c4740 | 1:c1f4ac30525a |
|---|---|
| 1 <?php | |
| 2 // $Id: xrds.inc,v 1.2 2007/10/15 09:40:42 goba Exp $ | |
| 3 | |
| 4 // Global variables to track parsing state | |
| 5 $xrds_open_elements = array(); | |
| 6 $xrds_services = array(); | |
| 7 $xrds_current_service = array(); | |
| 8 | |
| 9 /** | |
| 10 * Main entry point for parsing XRDS documents | |
| 11 */ | |
| 12 function xrds_parse($xml) { | |
| 13 global $xrds_services; | |
| 14 | |
| 15 $parser = xml_parser_create_ns(); | |
| 16 xml_set_element_handler($parser, '_xrds_element_start', '_xrds_element_end'); | |
| 17 xml_set_character_data_handler($parser, '_xrds_cdata'); | |
| 18 | |
| 19 xml_parse($parser, $xml); | |
| 20 xml_parser_free($parser); | |
| 21 | |
| 22 return $xrds_services; | |
| 23 } | |
| 24 | |
| 25 /** | |
| 26 * Parser callback functions | |
| 27 */ | |
| 28 function _xrds_element_start(&$parser, $name, $attribs) { | |
| 29 global $xrds_open_elements; | |
| 30 | |
| 31 $xrds_open_elements[] = _xrds_strip_namespace($name); | |
| 32 } | |
| 33 | |
| 34 function _xrds_element_end(&$parser, $name) { | |
| 35 global $xrds_open_elements, $xrds_services, $xrds_current_service; | |
| 36 | |
| 37 $name = _xrds_strip_namespace($name); | |
| 38 if ($name == 'SERVICE') { | |
| 39 if (in_array(OPENID_NS_2_0 .'/signon', $xrds_current_service['types']) || | |
| 40 in_array(OPENID_NS_2_0 .'/server', $xrds_current_service['types'])) { | |
| 41 $xrds_current_service['version'] = 2; | |
| 42 } | |
| 43 elseif (in_array(OPENID_NS_1_1, $xrds_current_service['types']) || | |
| 44 in_array(OPENID_NS_1_0, $xrds_current_service['types'])) { | |
| 45 $xrds_current_service['version'] = 1; | |
| 46 } | |
| 47 if (!empty($xrds_current_service['version'])) { | |
| 48 $xrds_services[] = $xrds_current_service; | |
| 49 } | |
| 50 $xrds_current_service = array(); | |
| 51 } | |
| 52 array_pop($xrds_open_elements); | |
| 53 } | |
| 54 | |
| 55 function _xrds_cdata(&$parser, $data) { | |
| 56 global $xrds_open_elements, $xrds_services, $xrds_current_service; | |
| 57 $path = strtoupper(implode('/', $xrds_open_elements)); | |
| 58 switch ($path) { | |
| 59 case 'XRDS/XRD/SERVICE/TYPE': | |
| 60 $xrds_current_service['types'][] = $data; | |
| 61 break; | |
| 62 case 'XRDS/XRD/SERVICE/URI': | |
| 63 $xrds_current_service['uri'] = $data; | |
| 64 break; | |
| 65 case 'XRDS/XRD/SERVICE/DELEGATE': | |
| 66 $xrds_current_service['delegate'] = $data; | |
| 67 break; | |
| 68 case 'XRDS/XRD/SERVICE/LOCALID': | |
| 69 $xrds_current_service['localid'] = $data; | |
| 70 break; | |
| 71 } | |
| 72 } | |
| 73 | |
| 74 function _xrds_strip_namespace($name) { | |
| 75 // Strip namespacing. | |
| 76 $pos = strrpos($name, ':'); | |
| 77 if ($pos !== FALSE) { | |
| 78 $name = substr($name, $pos + 1, strlen($name)); | |
| 79 } | |
| 80 | |
| 81 return $name; | |
| 82 } |
