Source for file Nonce.php

Documentation is available at Nonce.php

  1. <?php
  2. /**
  3.  * OpenID_Nonce
  4.  * 
  5.  * PHP Version 5.2.0+
  6.  * 
  7.  * @category  Auth
  8.  * @package   OpenID
  9.  * @author    Bill Shupp <hostmaster@shupp.org>
  10.  * @copyright 2009 Bill Shupp
  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/Store.php';
  19. require_once 'OpenID.php';
  20.  
  21. /**
  22.  * Handles nonce functionality.  Requires the OP Endpoint URL nonces are to be
  23.  * associated with.
  24.  * 
  25.  * @category  Auth
  26.  * @package   OpenID
  27.  * @author    Bill Shupp <hostmaster@shupp.org>
  28.  * @copyright 2009 Bill Shupp
  29.  * @license   http://www.opensource.org/licenses/bsd-license.php FreeBSD
  30.  * @link      http://pearopenid.googlecode.com
  31.  */
  32. {
  33.     /**
  34.      *  Constant for the parameter used with OpenID 1.1 nonces in the return_to URL
  35.      */
  36.     const RETURN_TO_NONCE 'openid.1_1_nonce';
  37.  
  38.     /**
  39.      * The OP Endoint URL a nonce is associated with
  40.      * 
  41.      * @var string 
  42.      */
  43.     protected $opEndpointURL = null;
  44.  
  45.     /**
  46.      * Default clock skew, i.e. how long in the past we're willing to allow for.
  47.      * 
  48.      * @var int 
  49.      * @see validate()
  50.      */
  51.     protected $clockSkew = 18000;
  52.  
  53.     /**
  54.      * Sets the OP endpoint URL, and optionally the clock skew and custom storage
  55.      * driver.
  56.      * 
  57.      * @param string $opEndpointURL OP Endpoint URL
  58.      * @param int    $clockSkew     How many seconds old can a
  59.      *                               nonce be?
  60.      * 
  61.      * @return void 
  62.      */
  63.     public function __construct($opEndpointURL,
  64.                                 $clockSkew null)
  65.     {
  66.         $this->opEndpointURL = $opEndpointURL;
  67.  
  68.         if ($clockSkew{
  69.             $this->clockSkew = $clockSkew;
  70.         }
  71.     }
  72.  
  73.     /**
  74.      * Checks to see if the response nonce has been seen before.  If not, store it
  75.      * and then validate its syntax
  76.      * 
  77.      * @param string $nonce The nonce from the OP response
  78.      * 
  79.      * @return bool true on success, false on failure
  80.      */
  81.     public function verifyResponseNonce($nonce)
  82.     {
  83.         // See if it is already stored
  84.         if (OpenID::getStore()->getNonce($nonce$this->opEndpointURL!== false{
  85.             return false;
  86.         }
  87.         // Store it
  88.         OpenID::getStore()->setNonce($nonce$this->opEndpointURL);
  89.  
  90.         return $this->validate($nonce);
  91.     }
  92.  
  93.     /**
  94.      * Validates the syntax of a nonce, as well as checks to see if its timestamp is
  95.      * within the allowed clock skew
  96.      * 
  97.      * @param mixed $nonce The nonce to validate
  98.      * 
  99.      * @return bool true on success, false on failure
  100.      * @see $clockSkew
  101.      */
  102.     public function validate($nonce)
  103.     {
  104.         if (strlen($nonce255{
  105.             return false;
  106.         }
  107.  
  108.         $result preg_match('/(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)Z(.*)/',
  109.                              $nonce,
  110.                              $matches);
  111.         if ($result != || count($matches!= 8{
  112.             return false;
  113.         }
  114.  
  115.         $stamp gmmktime($matches[4],
  116.                           $matches[5],
  117.                           $matches[6],
  118.                           $matches[2],
  119.                           $matches[3],
  120.                           $matches[1]);
  121.  
  122.         $time time();
  123.         if ($stamp ($time $this->clockSkew)
  124.             || $stamp ($time $this->clockSkew)) {
  125.  
  126.             return false;
  127.         }
  128.  
  129.         return true;
  130.     }
  131.  
  132.     /**
  133.      * Creates a nonce, but does not store it.  You may specify the lenth of the
  134.      * random string, as well as the time stamp to use.
  135.      * 
  136.      * @param int $length Lenth of the random string, defaults to 6
  137.      * @param int $time   A unix timestamp in seconds
  138.      * 
  139.      * @return string The nonce
  140.      * @see createNonceAndStore()
  141.      */
  142.     public function createNonce($length 6$time null)
  143.     {
  144.         $time ($time === nulltime($time;
  145.  
  146.         $nonce gmstrftime('%Y-%m-%dT%H:%M:%SZ'$time);
  147.         if ($length 1{
  148.             return $nonce;
  149.         }
  150.  
  151.         $length = (int) $length;
  152.         $chars  'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  153.         $chars .= 'abcdefghijklmnopqrstuvwxyz';
  154.         $chars .= '1234567890';
  155.  
  156.         $unique '';
  157.         for ($i 0$i $length$i++{
  158.             $unique .= substr($chars(rand((strlen($chars)))1);
  159.         }
  160.  
  161.         return $nonce $unique;
  162.     }
  163.  
  164.     /**
  165.      * Creates a nonce and also stores it.
  166.      * 
  167.      * @param int $length Lenth of the random string, defaults to 6
  168.      * @param int $time   A unix timestamp in seconds
  169.      * 
  170.      * @return string The nonce
  171.      * @see createNonce()
  172.      */
  173.     public function createNonceAndStore($length 6$time null)
  174.     {
  175.         $nonce $this->createNonce($length$time);
  176.         OpenID::getStore()->setNonce($nonce$this->opEndpointURL);
  177.         return $nonce;
  178.     }
  179. }
  180.  
  181. ?>

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