function _openid_xrds_parse

Parse an XRDS document.

Parameters

$raw_xml: A string containing the XRDS document.

Return value

An array of service entries.

1 call to _openid_xrds_parse()
_openid_xrds_discovery in modules/openid/openid.module
OpenID discovery method: perform a XRDS discovery.

File

modules/openid/openid.inc, line 139

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.
    // libxml_disable_entity_loader() is deprecated in PHP >= 8.0.
    $disable_entity_loader = function_exists('libxml_disable_entity_loader') && PHP_VERSION_ID < 80000;
    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;
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.