function _openid_xrds_parse
_openid_xrds_parse($raw_xml)
Parse an XRDS document.
Parameters
$raw_xml: A string containing the XRDS document.
Return value
An array of service entries.
File
- modules/openid/openid.inc, line 139
- OpenID utility functions.
Code
function _openid_xrds_parse($raw_xml) { $services = array(); // For PHP version >= 5.2.11, we can use this function to protect against // malicious doctype declarations and other unexpected entity loading. // However, we will not rely on it, and reject any XML with a DOCTYPE. $disable_entity_loader = function_exists('libxml_disable_entity_loader'); if ($disable_entity_loader) { $load_entities = libxml_disable_entity_loader(TRUE); } // Load the XML into a DOM document. $dom = new DOMDocument(); @$dom->loadXML($raw_xml); // Since DOCTYPE declarations from an untrusted source could be malicious, we // stop parsing here and treat the XML as invalid since XRDS documents do not // require, and are not expected to have, a DOCTYPE. if (isset($dom->doctype)) { return array(); } // Also stop parsing if there is an unreasonably large number of tags. if ($dom->getElementsByTagName('*')->length > variable_get('openid_xrds_maximum_tag_count', 30000)) { return array(); } // Parse the DOM document for the information we need. if ($xml = simplexml_import_dom($dom)) { foreach ($xml->children(OPENID_NS_XRD)->XRD as $xrd) { foreach ($xrd->children(OPENID_NS_XRD)->Service as $service_element) { $service = array( 'priority' => $service_element->attributes()->priority ? (int) $service_element->attributes()->priority : PHP_INT_MAX, 'types' => array(), 'uri' => (string) $service_element->children(OPENID_NS_XRD)->URI, 'service' => $service_element, 'xrd' => $xrd, ); foreach ($service_element->Type as $type) { $service['types'][] = (string) $type; } if ($service_element->children(OPENID_NS_XRD)->LocalID) { $service['identity'] = (string) $service_element->children(OPENID_NS_XRD)->LocalID; } elseif ($service_element->children(OPENID_NS_OPENID)->Delegate) { $service['identity'] = (string) $service_element->children(OPENID_NS_OPENID)->Delegate; } else { $service['identity'] = FALSE; } $services[] = $service; } } } // Return the LIBXML options to the previous state before returning. if ($disable_entity_loader) { libxml_disable_entity_loader($load_entities); } return $services; }
© 2001–2016 by the original authors
Licensed under the GNU General Public License, version 2 and later.
Drupal is a registered trademark of Dries Buytaert.
https://api.drupal.org/api/drupal/modules!openid!openid.inc/function/_openid_xrds_parse/7.x