forked from GNUsocial/gnu-social
		
	
		
			
	
	
		
			177 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			177 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
|   | <?php | ||
|  | 
 | ||
|  | /** | ||
|  |  * In-memory OpenID store implementation for testing only | ||
|  |  */ | ||
|  | require_once "Auth/OpenID/Interface.php"; | ||
|  | require_once 'Auth/OpenID/Nonce.php'; | ||
|  | 
 | ||
|  | class ServerAssocs { | ||
|  |     function ServerAssocs() | ||
|  |     { | ||
|  |         $this->assocs = array(); | ||
|  |     } | ||
|  | 
 | ||
|  |     function set($assoc) | ||
|  |     { | ||
|  |         $this->assocs[$assoc->handle] = $assoc; | ||
|  |     } | ||
|  | 
 | ||
|  |     function get($handle) | ||
|  |     { | ||
|  |         return Auth_OpenID::arrayGet($this->assocs, $handle); | ||
|  |     } | ||
|  | 
 | ||
|  |     function remove($handle) | ||
|  |     { | ||
|  |         if (array_key_exists($handle, $this->assocs)) { | ||
|  |             unset($this->assocs[$handle]); | ||
|  |             return true; | ||
|  |         } else { | ||
|  |             return false; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     /* | ||
|  |      * Returns association with the oldest issued date. | ||
|  |      * | ||
|  |      * or null if there are no associations. | ||
|  |      */ | ||
|  |     function best() | ||
|  |     { | ||
|  |         $best = null; | ||
|  |         foreach ($this->assocs as $handle => $assoc) { | ||
|  |             if (($best === null) || ($best->issued < $assoc->issued)) { | ||
|  |                 $best = $assoc; | ||
|  |             } | ||
|  |         } | ||
|  |         return $best; | ||
|  |     } | ||
|  | 
 | ||
|  |     /* | ||
|  |      * Remove expired associations. | ||
|  |      * | ||
|  |      * @return (removed associations, remaining associations) | ||
|  |      */ | ||
|  |     function cleanup() | ||
|  |     { | ||
|  |         $remove = array(); | ||
|  |         foreach ($this->assocs as $handle => $assoc) { | ||
|  |             if ($assoc->getExpiresIn() == 0) { | ||
|  |                 $remove[] = $handle; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         foreach ($remove as $handle) { | ||
|  |             unset($this->assocs[$handle]); | ||
|  |         } | ||
|  | 
 | ||
|  |         return array(count($remove), count($this->assocs)); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | /* | ||
|  |  * In-process memory store. | ||
|  |  * | ||
|  |  * Use for single long-running processes.  No persistence supplied. | ||
|  |  */ | ||
|  | class Tests_Auth_OpenID_MemStore extends Auth_OpenID_OpenIDStore { | ||
|  |     function Tests_Auth_OpenID_MemStore() | ||
|  |     { | ||
|  |         $this->server_assocs = array(); | ||
|  |         $this->nonces = array(); | ||
|  |     } | ||
|  | 
 | ||
|  |     function &_getServerAssocs($server_url) | ||
|  |     { | ||
|  |         if (!array_key_exists($server_url, $this->server_assocs)) { | ||
|  |             $this->server_assocs[$server_url] = new ServerAssocs(); | ||
|  |         } | ||
|  | 
 | ||
|  |         return $this->server_assocs[$server_url]; | ||
|  |     } | ||
|  | 
 | ||
|  |     function storeAssociation($server_url, $assoc) | ||
|  |     { | ||
|  |         $assocs =& $this->_getServerAssocs($server_url); | ||
|  |         $assocs->set($assoc); | ||
|  |     } | ||
|  | 
 | ||
|  |     function getAssociation($server_url, $handle=null) | ||
|  |     { | ||
|  |         $assocs =& $this->_getServerAssocs($server_url); | ||
|  |         if ($handle === null) { | ||
|  |             return $assocs->best(); | ||
|  |         } else { | ||
|  |             return $assocs->get($handle); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     function removeAssociation($server_url, $handle) | ||
|  |     { | ||
|  |         $assocs =& $this->_getServerAssocs($server_url); | ||
|  |         return $assocs->remove($handle); | ||
|  |     } | ||
|  | 
 | ||
|  |     function useNonce($server_url, $timestamp, $salt) | ||
|  |     { | ||
|  |         global $Auth_OpenID_SKEW; | ||
|  | 
 | ||
|  |         if (abs($timestamp - time()) > $Auth_OpenID_SKEW) { | ||
|  |             return false; | ||
|  |         } | ||
|  | 
 | ||
|  |         $anonce = array($server_url, intval($timestamp), $salt); | ||
|  | 
 | ||
|  |         if (in_array($anonce, $this->nonces)) { | ||
|  |             return false; | ||
|  |         } else { | ||
|  |             array_push($this->nonces, $anonce); | ||
|  |             return true; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     function cleanupNonces() | ||
|  |     { | ||
|  |         global $Auth_OpenID_SKEW; | ||
|  | 
 | ||
|  |         $now = time(); | ||
|  |         $expired = array(); | ||
|  |         foreach ($this->nonces as $anonce) { | ||
|  |             if (abs($anonce[1] - $now) > $Auth_OpenID_SKEW) { | ||
|  |                 // removing items while iterating over the set could
 | ||
|  |                 // be bad.
 | ||
|  |                 $expired[] = $anonce; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         foreach ($expired as $anonce) { | ||
|  |             unset($this->nonces[array_search($anonce, $this->nonces)]); | ||
|  |         } | ||
|  | 
 | ||
|  |         return count($expired); | ||
|  |     } | ||
|  | 
 | ||
|  |     function cleanupAssociations() | ||
|  |     { | ||
|  |         $remove_urls = array(); | ||
|  |         $removed_assocs = 0; | ||
|  |         foreach ($this->server_assocs as $server_url => $assocs) { | ||
|  |             list($removed, $remaining) = $assocs->cleanup(); | ||
|  |             $removed_assocs += $removed; | ||
|  |             if (!$remaining) { | ||
|  |                 $remove_urls[] = $server_url; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         // Remove entries from server_assocs that had none remaining.
 | ||
|  |         foreach ($remove_urls as $server_url) { | ||
|  |             unset($this->server_assocs[$server_url]); | ||
|  |         } | ||
|  | 
 | ||
|  |         return $removed_assocs; | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | 
 |