109 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			109 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| 
								 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Nonce-related functionality.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @package OpenID
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Need CryptUtil to generate random strings.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								require_once 'Auth/OpenID/CryptUtil.php';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * This is the characters that the nonces are made from.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								define('Auth_OpenID_Nonce_CHRS',"abcdefghijklmnopqrstuvwxyz" .
							 | 
						||
| 
								 | 
							
								       "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Keep nonces for five hours (allow five hours for the combination of
							 | 
						||
| 
								 | 
							
								// request time and clock skew). This is probably way more than is
							 | 
						||
| 
								 | 
							
								// necessary, but there is not much overhead in storing nonces.
							 | 
						||
| 
								 | 
							
								global $Auth_OpenID_SKEW;
							 | 
						||
| 
								 | 
							
								$Auth_OpenID_SKEW = 60 * 60 * 5;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define('Auth_OpenID_Nonce_REGEX',
							 | 
						||
| 
								 | 
							
								       '/(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)Z(.*)/');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define('Auth_OpenID_Nonce_TIME_FMT',
							 | 
						||
| 
								 | 
							
								       '%Y-%m-%dT%H:%M:%SZ');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function Auth_OpenID_splitNonce($nonce_string)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    // Extract a timestamp from the given nonce string
							 | 
						||
| 
								 | 
							
								    $result = preg_match(Auth_OpenID_Nonce_REGEX, $nonce_string, $matches);
							 | 
						||
| 
								 | 
							
								    if ($result != 1 || count($matches) != 8) {
							 | 
						||
| 
								 | 
							
								        return null;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    list($unused,
							 | 
						||
| 
								 | 
							
								         $tm_year,
							 | 
						||
| 
								 | 
							
								         $tm_mon,
							 | 
						||
| 
								 | 
							
								         $tm_mday,
							 | 
						||
| 
								 | 
							
								         $tm_hour,
							 | 
						||
| 
								 | 
							
								         $tm_min,
							 | 
						||
| 
								 | 
							
								         $tm_sec,
							 | 
						||
| 
								 | 
							
								         $uniquifier) = $matches;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    $timestamp =
							 | 
						||
| 
								 | 
							
								        @gmmktime($tm_hour, $tm_min, $tm_sec, $tm_mon, $tm_mday, $tm_year);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if ($timestamp === false || $timestamp < 0) {
							 | 
						||
| 
								 | 
							
								        return null;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return array($timestamp, $uniquifier);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function Auth_OpenID_checkTimestamp($nonce_string,
							 | 
						||
| 
								 | 
							
								                                    $allowed_skew = null,
							 | 
						||
| 
								 | 
							
								                                    $now = null)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    // Is the timestamp that is part of the specified nonce string
							 | 
						||
| 
								 | 
							
								    // within the allowed clock-skew of the current time?
							 | 
						||
| 
								 | 
							
								    global $Auth_OpenID_SKEW;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if ($allowed_skew === null) {
							 | 
						||
| 
								 | 
							
								        $allowed_skew = $Auth_OpenID_SKEW;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    $parts = Auth_OpenID_splitNonce($nonce_string);
							 | 
						||
| 
								 | 
							
								    if ($parts == null) {
							 | 
						||
| 
								 | 
							
								        return false;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if ($now === null) {
							 | 
						||
| 
								 | 
							
								        $now = time();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    $stamp = $parts[0];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Time after which we should not use the nonce
							 | 
						||
| 
								 | 
							
								    $past = $now - $allowed_skew;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Time that is too far in the future for us to allow
							 | 
						||
| 
								 | 
							
								    $future = $now + $allowed_skew;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // the stamp is not too far in the future and is not too far
							 | 
						||
| 
								 | 
							
								    // in the past
							 | 
						||
| 
								 | 
							
								    return (($past <= $stamp) && ($stamp <= $future));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function Auth_OpenID_mkNonce($when = null)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    // Generate a nonce with the current timestamp
							 | 
						||
| 
								 | 
							
								    $salt = Auth_OpenID_CryptUtil::randomString(
							 | 
						||
| 
								 | 
							
								        6, Auth_OpenID_Nonce_CHRS);
							 | 
						||
| 
								 | 
							
								    if ($when === null) {
							 | 
						||
| 
								 | 
							
								        // It's safe to call time() with no arguments; it returns a
							 | 
						||
| 
								 | 
							
								        // GMT unix timestamp on PHP 4 and PHP 5.  gmmktime() with no
							 | 
						||
| 
								 | 
							
								        // args returns a local unix timestamp on PHP 4, so don't use
							 | 
						||
| 
								 | 
							
								        // that.
							 | 
						||
| 
								 | 
							
								        $when = time();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    $time_str = gmstrftime(Auth_OpenID_Nonce_TIME_FMT, $when);
							 | 
						||
| 
								 | 
							
								    return $time_str . $salt;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 |