function _openid_xrds_discovery

_openid_xrds_discovery($claimed_id)

OpenID discovery method: perform a XRDS discovery.

Return value

An array of discovered services and claimed identifier or NULL. See openid_discovery() for more specific information.

See also

http://openid.net/specs/openid-authentication-2_0.html#discovery

hook_openid_discovery_method_info()

openid_discovery()

File

modules/openid/openid.module, line 498
Implement OpenID Relying Party support for Drupal

Code

function _openid_xrds_discovery($claimed_id) {
  $services = array();

  $xrds_url = $claimed_id;
  $scheme = @parse_url($xrds_url, PHP_URL_SCHEME);
  if ($scheme == 'http' || $scheme == 'https') {
    // For regular URLs, try Yadis resolution first, then HTML-based discovery
    $headers = array('Accept' => 'application/xrds+xml');
    $result = drupal_http_request($xrds_url, array('headers' => $headers));

    // Check for HTTP error and make sure, that we reach the target. If the
    // maximum allowed redirects are exhausted, final destination URL isn't
    // reached, but drupal_http_request() doesn't return any error.
    // @todo Remove the check for 200 HTTP result code after the following issue
    // will be fixed: http://drupal.org/node/1096890.
    if (!isset($result->error) && $result->code == 200) {

      // Replace the user-entered claimed_id if we received a redirect.
      if (!empty($result->redirect_url)) {
        $claimed_id = openid_normalize($result->redirect_url);
      }

      if (isset($result->headers['content-type']) && preg_match("/application\/xrds\+xml/", $result->headers['content-type'])) {
        // Parse XML document to find URL
        $services = _openid_xrds_parse($result->data);
      }
      else {
        $xrds_url = NULL;
        if (isset($result->headers['x-xrds-location'])) {
          $xrds_url = $result->headers['x-xrds-location'];
        }
        else {
          // Look for meta http-equiv link in HTML head
          $xrds_url = _openid_meta_httpequiv('X-XRDS-Location', $result->data);
        }
        if (!empty($xrds_url)) {
          $headers = array('Accept' => 'application/xrds+xml');
          $xrds_result = drupal_http_request($xrds_url, array('headers' => $headers));
          if (!isset($xrds_result->error)) {
            $services = _openid_xrds_parse($xrds_result->data);
          }
        }
      }

      // Check for HTML delegation
      if (count($services) == 0) {
        // Look for 2.0 links
        $uri = _openid_link_href('openid2.provider', $result->data);
        $identity = _openid_link_href('openid2.local_id', $result->data);
        $type = 'http://specs.openid.net/auth/2.0/signon';

        // 1.x links
        if (empty($uri)) {
          $uri = _openid_link_href('openid.server', $result->data);
          $identity = _openid_link_href('openid.delegate', $result->data);
          $type = 'http://openid.net/signon/1.1';
        }
        if (!empty($uri)) {
          $services[] = array(
            'uri' => $uri,
            'identity' => $identity,
            'types' => array($type),
          );
        }
      }
    }
  }

  if (!empty($services)) {
    return array(
      'services' => $services,
      'claimed_id' => $claimed_id,
    );
  }
}

© 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.module/function/_openid_xrds_discovery/7.x