Source for file Discover.php

Documentation is available at Discover.php

  1. <?php
  2. /**
  3.  * OpenID_Discover
  4.  * 
  5.  * PHP Version 5.2.0+
  6.  * 
  7.  * @category  Auth
  8.  * @package   OpenID
  9.  * @author    Rich Schumacher <rich.schu@gmail.com>
  10.  * @copyright 2009 Rich Schumacher
  11.  * @license   http://www.opensource.org/licenses/bsd-license.php FreeBSD
  12.  * @link      http://pearopenid.googlecode.com
  13.  */
  14.  
  15. /**
  16.  * Required files
  17.  */
  18. require_once 'OpenID.php';
  19. require_once 'Services/Yadis.php';
  20. require_once 'Validate.php';
  21. require_once 'OpenID/ServiceEndpoint.php';
  22. require_once 'OpenID/ServiceEndpoints.php';
  23. require_once 'OpenID/Discover/Exception.php';
  24. require_once 'Date.php';
  25.  
  26. /**
  27.  * OpenID_Discover
  28.  *
  29.  * Implements OpenID discovery ({@link }
  30.  * http://openid.net/specs/openid-authentication-2_0.html#discovery 7.3} of the 2.0
  31.  * spec).  Discovery is driver based, and currently supports YADIS discovery
  32.  * (via Services_Yadis), and HTML discovery ({@link OpenID_Discover_HTML}).  Once
  33.  * completed, it will also support {@link }
  34.  * http://www.hueniverse.com/hueniverse/2009/03/the-discovery-protocol-stack.html
  35.  * XRD/LRDD}.
  36.  * 
  37.  * Example usage for determining the OP Endpoint URL:
  38.  * <code>
  39.  * $id = 'http://user.example.com';
  40.  * 
  41.  * $discover = new OpenID_Discover($id);
  42.  * $result   = $discover->discover();
  43.  * 
  44.  * if (!$result) {
  45.  *     echo "Discovery failed\n";
  46.  * } else {
  47.  *     // Grab the highest priority service, and get it's first URI.
  48.  *     $endpoint      = $discover->services[0];
  49.  *     $opEndpointURL = array_shift($serviceEndpoint->getURIs());
  50.  * }
  51.  * </code>
  52.  * 
  53.  * @category  Auth
  54.  * @package   OpenID
  55.  * @author    Bill Shupp <hostmaster@shupp.org>
  56.  * @author    Rich Schumacher <rich.schu@gmail.com>
  57.  * @copyright 2009 Bill Shupp
  58.  * @license   http://www.opensource.org/licenses/bsd-license.php FreeBSD
  59.  * @link      http://pearopenid.googlecode.com
  60.  */
  61. {
  62.     const TYPE_YADIS 'Yadis';
  63.     const TYPE_HTML  'HTML';
  64.  
  65.     /**
  66.      * List of supported discover types
  67.      * 
  68.      * @var array 
  69.      */
  70.     protected $supportedTypes = array(
  71.         self::TYPE_YADIS,
  72.         self::TYPE_HTML
  73.     );
  74.  
  75.     /**
  76.      * Order that discover should be performed
  77.      *
  78.      * @var array 
  79.      */
  80.     static public $discoveryOrder = array(
  81.         0  => OpenID_Discover::TYPE_YADIS,
  82.         10 => OpenID_Discover::TYPE_HTML
  83.     );
  84.  
  85.     /**
  86.      * The normalized version of the user supplied identifier
  87.      * 
  88.      * @var string 
  89.      */
  90.     protected $identifier = null;
  91.  
  92.     /**
  93.      * HTTP_Request2 options
  94.      * 
  95.      * @var array 
  96.      */
  97.     protected $requestOptions = array(
  98.         'adapter'          => 'curl',
  99.         'follow_redirects' => true,
  100.         'timeout'          => 3,
  101.         'connect_timeout'  => 3
  102.     );
  103.  
  104.     /**
  105.      * Instance of OpenID_ServiceEndpoints
  106.      * 
  107.      * @var OpenID_ServiceEndpoints 
  108.      */
  109.     protected $services = null;
  110.  
  111.     /**
  112.      * Constructor.  Enables libxml internal errors, normalized the identifier.
  113.      * 
  114.      * @param mixed $identifier The user supplied identifier
  115.      * 
  116.      * @return void 
  117.      */
  118.     public function __construct($identifier)
  119.     {
  120.         libxml_use_internal_errors(true);
  121.         $this->identifier = OpenID::normalizeIdentifier($identifier);
  122.     }
  123.  
  124.     /**
  125.      * Gets member variables
  126.      * 
  127.      * @param string $name Name of the member variable to get
  128.      * 
  129.      * @return mixed The member variable if it exists
  130.      */
  131.     public function __get($name)
  132.     {
  133.         if (property_exists($this$name)) {
  134.             return $this->$name;
  135.         }
  136.         return null;
  137.     }
  138.  
  139.     /**
  140.      * Sets the HTTP_Request2 options to use
  141.      * 
  142.      * @param array $options Array of HTTP_Request2 options
  143.      * 
  144.      * @return OpenID_Discover for fluent interface
  145.      */
  146.     public function setRequestOptions(array $options)
  147.     {
  148.         $this->requestOptions $options;
  149.         return $this;
  150.     }
  151.  
  152.     /**
  153. /**
  154.      * Performs discovery
  155.      * 
  156.      * @return bool true on success, false on failure
  157.      */
  158.     public function discover()
  159.     {
  160.         // Sort ascending
  161.         ksort(self::$discoveryOrder);
  162.  
  163.         foreach (self::$discoveryOrder as $service{
  164.             try {
  165.                 $discover self::_factory($service$this->identifier);
  166.                 $result   $discover->discover();
  167.             catch (OpenID_Discover_Exception $e{
  168.                 continue;
  169.             }
  170.  
  171.             if ($result instanceof OpenID_ServiceEndpoints && isset($result[0])) {
  172.                 $this->services = $result;
  173.                 return true;
  174.             }
  175.         }
  176.  
  177.         return false;
  178.     }
  179.  
  180.     /**
  181.      * Provides the standard factory pattern for loading discovery drivers.
  182.      * 
  183.      * @param string $discoverType The discovery type (driver) to load
  184.      * @param string $identifier   The user supplied identifier
  185.      * 
  186.      * @return void 
  187.      */
  188.     static private function _factory($discoverType$identifier)
  189.     {
  190.         $file  'OpenID/Discover/' $discoverType '.php';
  191.         $class 'OpenID_Discover_' $discoverType;
  192.  
  193.         include_once $file;
  194.  
  195.         if (!class_exists($class)) {
  196.             throw new OpenID_Discover_Exception(
  197.                 'Unable to load driver: ' $discoverType
  198.             );
  199.         }
  200.  
  201.         $object new $class($identifier);
  202.  
  203.         if (!$object instanceof OpenID_Discover_Interface{
  204.             throw new OpenID_Discover_Exception(
  205.                 'Requested driver does not conform to Discover interface'
  206.             );
  207.         }
  208.  
  209.         return $object;
  210.     }
  211.  
  212.     /**
  213.      * Determines if dicovered information supports a given OpenID extension
  214.      * 
  215.      * @param string $extension The name of the extension to check, (SREG10, AX, etc)
  216.      * 
  217.      * @return bool 
  218.      */
  219.     public function extensionSupported($extension)
  220.     {
  221.         $class 'OpenID_Extension_' $extension;
  222.         $file  str_replace('_''/'$class'.php';
  223.  
  224.         include_once $file;
  225.  
  226.         if (!class_exists($classfalse)) {
  227.             throw new OpenID_Discover_Exception(
  228.                 'Unknown extension: ' $class
  229.             );
  230.         }
  231.  
  232.         $instance new $class(OpenID_Extension::REQUEST);
  233.  
  234.         foreach ($this->services as $service{
  235.             if (in_array($instance->getNamespace()$service->getTypes())) {
  236.                 return true;
  237.             }
  238.         }
  239.  
  240.         return false;
  241.     }
  242.  
  243.     /**
  244.      * Static helper method for retrieving discovered information from cache if it
  245.      * exists, otherwise executing discovery and storing results if they are
  246.      * positive.
  247.      * 
  248.      * @param string       $id    URI Identifier to discover
  249.      * @param OpenID_Store $store Instance of OpenID_Store
  250.      * 
  251.      * @return OpenID_Discover|falseOpenID_Discover on success, false on failure
  252.      */
  253.     static public function getDiscover($idOpenID_Store_Interface $store)
  254.     {
  255.         $discoverCache $store->getDiscover($id);
  256.  
  257.         if ($discoverCache instanceof OpenID_Discover{
  258.             return $discoverCache;
  259.         }
  260.  
  261.         $discover new OpenID_Discover($id);
  262.         $result   $discover->discover();
  263.         if ($result === false{
  264.             // @codeCoverageIgnoreStart
  265.             return false;
  266.             // @codeCoverageIgnoreEnd
  267.         }
  268.  
  269.         $expireTime null;
  270.         if ($discover->services->getExpiresHeader()) {
  271.             $tz  new Date_TimeZone(date_default_timezone_get());
  272.             $now new Date();
  273.             $now->setTZ($tz);
  274.  
  275.             $expireDate new Date(strtotime($discover->services
  276.                                                       ->getExpiresHeader()));
  277.             $span       new Date_Span($now$expireDate);
  278.             $expire     = (int)$span->toSeconds();
  279.         }
  280.  
  281.         $store->setDiscover($discover$expireTime);
  282.  
  283.         return $discover;
  284.     }
  285. }
  286.  
  287. ?>

Documentation generated on Tue, 15 Dec 2009 19:00:53 -0800 by phpDocumentor 1.4.3