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