Source for file HTML.php

Documentation is available at HTML.php

  1. <?php
  2. /**
  3.  * OpenID_Discover_HTML
  4.  * 
  5.  * PHP Version 5.2.0+
  6.  * 
  7.  * @category  Auth
  8.  * @package   OpenID
  9.  * @uses      OpenID_Discover
  10.  * @uses      OpenID_Discover_Interface
  11.  * @author    Rich Schumacher <rich.schu@gmail.com>
  12.  * @copyright 2009 Rich Schumacher
  13.  * @license   http://www.opensource.org/licenses/bsd-license.php FreeBSD
  14.  * @link      http://pearopenid.googlecode.com
  15.  */
  16.  
  17. /**
  18.  * Required files
  19.  */
  20. require_once 'OpenID/Discover.php';
  21. require_once 'OpenID/Discover/Interface.php';
  22. require_once 'OpenID/ServiceEndpoint.php';
  23. require_once 'OpenID/ServiceEndpoints.php';
  24.  
  25. /**
  26.  * Implements HTML discovery
  27.  * 
  28.  * @category  Auth
  29.  * @package   OpenID
  30.  * @uses      OpenID_Discover
  31.  * @uses      OpenID_Discover_Interface
  32.  * @author    Rich Schumacher <rich.schu@gmail.com>
  33.  * @copyright 2009 Rich Schumacher
  34.  * @license   http://www.opensource.org/licenses/bsd-license.php FreeBSD
  35.  * @link      http://pearopenid.googlecode.com
  36.  */
  37. {
  38.     /**
  39.      * The normalized identifier
  40.      * 
  41.      * @var string 
  42.      */
  43.     protected $identifier = null;
  44.  
  45.     /**
  46.      * Local storage of the HTTP_Request2 object
  47.      * 
  48.      * @var HTTP_Request2 
  49.      */
  50.     protected $request = null;
  51.  
  52.     /**
  53.      * Local storage of the HTTP_Request2_Response object
  54.      * 
  55.      * @var HTTP_Request2_Response 
  56.      */
  57.     protected $response = null;
  58.  
  59.     /**
  60.      * Constructor.  Sets the
  61.      * 
  62.      * @param mixed $identifier The user supplied identifier
  63.      * 
  64.      * @return void 
  65.      */
  66.     public function __construct($identifier)
  67.     {
  68.         $this->identifier = $identifier;
  69.     }
  70.  
  71.     /**
  72.      * Performs HTML discovery.
  73.      * 
  74.      * @throws OpenID_Discover_Exception on error
  75.      * @return OpenID_ServiceEndpoints 
  76.      */
  77.     public function discover()
  78.     {
  79.         $response $this->sendRequest();
  80.  
  81.         $dom new DOMDocument();
  82.         $dom->loadHTML($response);
  83.  
  84.         $xPath new DOMXPath($dom);
  85.         $query "/html/head/link[contains(@rel,'openid')]";
  86.         $links $xPath->query($query);
  87.  
  88.         $results array(
  89.             'openid2.provider' => array(),
  90.             'openid2.local_id' => array(),
  91.             'openid.server'    => array(),
  92.             'openid.delegate'  => array()
  93.         );
  94.  
  95.         foreach ($links as $link{
  96.             $rels explode(' '$link->getAttribute('rel'));
  97.             foreach ($rels as $rel{
  98.                 if (array_key_exists($rel$results)) {
  99.                     $results[$rel][$link->getAttribute('href');
  100.                 }
  101.             }
  102.         }
  103.  
  104.         $services $this->buildServiceEndpoint($results);
  105.         $services->setExpiresHeader($this->getExpiresHeader());
  106.         return $services;
  107.     }
  108.  
  109.     /**
  110.      * Gets the Expires header from the response object
  111.      * 
  112.      * @return string 
  113.      */
  114.     protected function getExpiresHeader()
  115.     {
  116.         // @codeCoverageIgnoreStart
  117.         return $this->response->getHeader('Expires');
  118.         // @codeCoverageIgnoreEnd
  119.     }
  120.  
  121.     /**
  122.      * Builds the service endpoint
  123.      * 
  124.      * @param array $results Array of items discovered via HTML
  125.      * 
  126.      * @return OpenID_ServiceEndpoints 
  127.      */
  128.     protected function buildServiceEndpoint(array $results)
  129.     {
  130.         if (count($results['openid2.provider'])) {
  131.             $version OpenID::SERVICE_2_0_SIGNON;
  132.             if (count($results['openid2.local_id'])) {
  133.                 $localID $results['openid2.local_id'][0];
  134.             }
  135.             $endpointURIs $results['openid2.provider'];
  136.         elseif (count($results['openid.server'])) {
  137.             $version      OpenID::SERVICE_1_1_SIGNON;
  138.             $endpointURIs $results['openid.server'];
  139.             if (count($results['openid.delegate'])) {
  140.                 $localID $results['openid.delegate'][0];
  141.             }
  142.         else {
  143.             throw new OpenID_Discover_Exception(
  144.                 'Discovered information does not conform to spec'
  145.             );
  146.         }
  147.  
  148.         $opEndpoint new OpenID_ServiceEndpoint();
  149.         $opEndpoint->setVersion($version);
  150.         $opEndpoint->setTypes(array($version));
  151.         $opEndpoint->setURIs($endpointURIs);
  152.         $opEndpoint->setSource(OpenID_Discover::TYPE_HTML);
  153.  
  154.         if (isset($localID)) {
  155.             $opEndpoint->setLocalID($localID);
  156.         }
  157.  
  158.         return new OpenID_ServiceEndpoints($this->identifier$opEndpoint);
  159.     }
  160.  
  161.     // @codeCoverageIgnoreStart
  162.     /**
  163.      * Sends the request via HTTP_Request2
  164.      * 
  165.      * @return string The HTTP response body
  166.      */
  167.     protected function sendRequest()
  168.     {
  169.         $this->getHTTPRequest2();
  170.         $this->response $this->request->send();
  171.  
  172.         if ($this->response->getStatus(!== 200{
  173.             throw new OpenID_Discover_Exception(
  174.                 'Unable to connect to OpenID Provider.'
  175.             );
  176.         }
  177.  
  178.         return $this->response->getBody();
  179.     }
  180.  
  181.     /**
  182.      * Instantiates HTTP_Request2.  Abstracted for testing.
  183.      * 
  184.      * @return void 
  185.      */
  186.     protected function getHTTPRequest2()
  187.     {
  188.         $this->request new HTTP_Request2($this->identifier,
  189.                                            HTTP_Request2::METHOD_GET,
  190.                                            $this->requestOptions);
  191.     }
  192.     // @codeCoverageIgnoreEnd
  193. }
  194.  
  195. ?>

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