You are here

function openid_discovery in Drupal 6

Same name and namespace in other branches
  1. 7 modules/openid/openid.module \openid_discovery()

Perform discovery on a claimed ID to determine the OpenID provider endpoint.

Parameters

$claimed_id The OpenID URL to perform discovery on.:

Return value

Array of services discovered (including OpenID version, endpoint URI, etc).

2 calls to openid_discovery()
openid_begin in modules/openid/openid.module
The initial step of OpenID authentication responsible for the following:
openid_complete in modules/openid/openid.module
Completes OpenID authentication by validating returned data from the OpenID Provider.

File

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

Code

function openid_discovery($claimed_id) {
  module_load_include('inc', 'openid');
  module_load_include('inc', 'openid', 'xrds');
  $services = array();
  $xrds_url = $claimed_id;
  if (_openid_is_xri($claimed_id)) {
    $xrds_url = 'http://xri.net/' . $claimed_id;
  }
  $url = @parse_url($xrds_url);
  if ($url['scheme'] == 'http' || $url['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, $headers);
    if (!isset($result->error)) {
      if (isset($result->headers['Content-Type']) && preg_match("/application\\/xrds\\+xml/", $result->headers['Content-Type'])) {

        // Parse XML document to find URL
        $services = 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, $headers);
          if (!isset($xrds_result->error)) {
            $services = 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);
        $delegate = _openid_link_href('openid2.local_id', $result->data);
        $version = 2;

        // 1.0 links
        if (empty($uri)) {
          $uri = _openid_link_href('openid.server', $result->data);
          $delegate = _openid_link_href('openid.delegate', $result->data);
          $version = 1;
        }
        if (!empty($uri)) {
          $services[] = array(
            'uri' => $uri,
            'delegate' => $delegate,
            'version' => $version,
          );
        }
      }
    }
  }
  return $services;
}