diff options
Diffstat (limited to 'models/Auth/Yadis/Manager.php')
-rw-r--r-- | models/Auth/Yadis/Manager.php | 521 |
1 files changed, 0 insertions, 521 deletions
diff --git a/models/Auth/Yadis/Manager.php b/models/Auth/Yadis/Manager.php deleted file mode 100644 index ee6f68bcb..000000000 --- a/models/Auth/Yadis/Manager.php +++ /dev/null @@ -1,521 +0,0 @@ -<?php - -/** - * Yadis service manager to be used during yadis-driven authentication - * attempts. - * - * @package OpenID - */ - -/** - * The base session class used by the Auth_Yadis_Manager. This - * class wraps the default PHP session machinery and should be - * subclassed if your application doesn't use PHP sessioning. - * - * @package OpenID - */ -class Auth_Yadis_PHPSession { - /** - * Set a session key/value pair. - * - * @param string $name The name of the session key to add. - * @param string $value The value to add to the session. - */ - function set($name, $value) - { - $_SESSION[$name] = $value; - } - - /** - * Get a key's value from the session. - * - * @param string $name The name of the key to retrieve. - * @param string $default The optional value to return if the key - * is not found in the session. - * @return string $result The key's value in the session or - * $default if it isn't found. - */ - function get($name, $default=null) - { - if (array_key_exists($name, $_SESSION)) { - return $_SESSION[$name]; - } else { - return $default; - } - } - - /** - * Remove a key/value pair from the session. - * - * @param string $name The name of the key to remove. - */ - function del($name) - { - unset($_SESSION[$name]); - } - - /** - * Return the contents of the session in array form. - */ - function contents() - { - return $_SESSION; - } -} - -/** - * A session helper class designed to translate between arrays and - * objects. Note that the class used must have a constructor that - * takes no parameters. This is not a general solution, but it works - * for dumb objects that just need to have attributes set. The idea - * is that you'll subclass this and override $this->check($data) -> - * bool to implement your own session data validation. - * - * @package OpenID - */ -class Auth_Yadis_SessionLoader { - /** - * Override this. - * - * @access private - */ - function check($data) - { - return true; - } - - /** - * Given a session data value (an array), this creates an object - * (returned by $this->newObject()) whose attributes and values - * are those in $data. Returns null if $data lacks keys found in - * $this->requiredKeys(). Returns null if $this->check($data) - * evaluates to false. Returns null if $this->newObject() - * evaluates to false. - * - * @access private - */ - function fromSession($data) - { - if (!$data) { - return null; - } - - $required = $this->requiredKeys(); - - foreach ($required as $k) { - if (!array_key_exists($k, $data)) { - return null; - } - } - - if (!$this->check($data)) { - return null; - } - - $data = array_merge($data, $this->prepareForLoad($data)); - $obj = $this->newObject($data); - - if (!$obj) { - return null; - } - - foreach ($required as $k) { - $obj->$k = $data[$k]; - } - - return $obj; - } - - /** - * Prepares the data array by making any necessary changes. - * Returns an array whose keys and values will be used to update - * the original data array before calling $this->newObject($data). - * - * @access private - */ - function prepareForLoad($data) - { - return array(); - } - - /** - * Returns a new instance of this loader's class, using the - * session data to construct it if necessary. The object need - * only be created; $this->fromSession() will take care of setting - * the object's attributes. - * - * @access private - */ - function newObject($data) - { - return null; - } - - /** - * Returns an array of keys and values built from the attributes - * of $obj. If $this->prepareForSave($obj) returns an array, its keys - * and values are used to update the $data array of attributes - * from $obj. - * - * @access private - */ - function toSession($obj) - { - $data = array(); - foreach ($obj as $k => $v) { - $data[$k] = $v; - } - - $extra = $this->prepareForSave($obj); - - if ($extra && is_array($extra)) { - foreach ($extra as $k => $v) { - $data[$k] = $v; - } - } - - return $data; - } - - /** - * Override this. - * - * @access private - */ - function prepareForSave($obj) - { - return array(); - } -} - -/** - * A concrete loader implementation for Auth_OpenID_ServiceEndpoints. - * - * @package OpenID - */ -class Auth_OpenID_ServiceEndpointLoader extends Auth_Yadis_SessionLoader { - function newObject($data) - { - return new Auth_OpenID_ServiceEndpoint(); - } - - function requiredKeys() - { - $obj = new Auth_OpenID_ServiceEndpoint(); - $data = array(); - foreach ($obj as $k => $v) { - $data[] = $k; - } - return $data; - } - - function check($data) - { - return is_array($data['type_uris']); - } -} - -/** - * A concrete loader implementation for Auth_Yadis_Managers. - * - * @package OpenID - */ -class Auth_Yadis_ManagerLoader extends Auth_Yadis_SessionLoader { - function requiredKeys() - { - return array('starting_url', - 'yadis_url', - 'services', - 'session_key', - '_current', - 'stale'); - } - - function newObject($data) - { - return new Auth_Yadis_Manager($data['starting_url'], - $data['yadis_url'], - $data['services'], - $data['session_key']); - } - - function check($data) - { - return is_array($data['services']); - } - - function prepareForLoad($data) - { - $loader = new Auth_OpenID_ServiceEndpointLoader(); - $services = array(); - foreach ($data['services'] as $s) { - $services[] = $loader->fromSession($s); - } - return array('services' => $services); - } - - function prepareForSave($obj) - { - $loader = new Auth_OpenID_ServiceEndpointLoader(); - $services = array(); - foreach ($obj->services as $s) { - $services[] = $loader->toSession($s); - } - return array('services' => $services); - } -} - -/** - * The Yadis service manager which stores state in a session and - * iterates over <Service> elements in a Yadis XRDS document and lets - * a caller attempt to use each one. This is used by the Yadis - * library internally. - * - * @package OpenID - */ -class Auth_Yadis_Manager { - - /** - * Intialize a new yadis service manager. - * - * @access private - */ - function Auth_Yadis_Manager($starting_url, $yadis_url, - $services, $session_key) - { - // The URL that was used to initiate the Yadis protocol - $this->starting_url = $starting_url; - - // The URL after following redirects (the identifier) - $this->yadis_url = $yadis_url; - - // List of service elements - $this->services = $services; - - $this->session_key = $session_key; - - // Reference to the current service object - $this->_current = null; - - // Stale flag for cleanup if PHP lib has trouble. - $this->stale = false; - } - - /** - * @access private - */ - function length() - { - // How many untried services remain? - return count($this->services); - } - - /** - * Return the next service - * - * $this->current() will continue to return that service until the - * next call to this method. - */ - function nextService() - { - - if ($this->services) { - $this->_current = array_shift($this->services); - } else { - $this->_current = null; - } - - return $this->_current; - } - - /** - * @access private - */ - function current() - { - // Return the current service. - // Returns None if there are no services left. - return $this->_current; - } - - /** - * @access private - */ - function forURL($url) - { - return in_array($url, array($this->starting_url, $this->yadis_url)); - } - - /** - * @access private - */ - function started() - { - // Has the first service been returned? - return $this->_current !== null; - } -} - -/** - * State management for discovery. - * - * High-level usage pattern is to call .getNextService(discover) in - * order to find the next available service for this user for this - * session. Once a request completes, call .cleanup() to clean up the - * session state. - * - * @package OpenID - */ -class Auth_Yadis_Discovery { - - /** - * @access private - */ - var $DEFAULT_SUFFIX = 'auth'; - - /** - * @access private - */ - var $PREFIX = '_yadis_services_'; - - /** - * Initialize a discovery object. - * - * @param Auth_Yadis_PHPSession $session An object which - * implements the Auth_Yadis_PHPSession API. - * @param string $url The URL on which to attempt discovery. - * @param string $session_key_suffix The optional session key - * suffix override. - */ - function Auth_Yadis_Discovery($session, $url, - $session_key_suffix = null) - { - /// Initialize a discovery object - $this->session = $session; - $this->url = $url; - if ($session_key_suffix === null) { - $session_key_suffix = $this->DEFAULT_SUFFIX; - } - - $this->session_key_suffix = $session_key_suffix; - $this->session_key = $this->PREFIX . $this->session_key_suffix; - } - - /** - * Return the next authentication service for the pair of - * user_input and session. This function handles fallback. - */ - function getNextService($discover_cb, $fetcher) - { - $manager = $this->getManager(); - if (!$manager || (!$manager->services)) { - $this->destroyManager(); - - list($yadis_url, $services) = call_user_func($discover_cb, - $this->url, - &$fetcher); - - $manager = $this->createManager($services, $yadis_url); - } - - if ($manager) { - $loader = new Auth_Yadis_ManagerLoader(); - $service = $manager->nextService(); - $this->session->set($this->session_key, - serialize($loader->toSession($manager))); - } else { - $service = null; - } - - return $service; - } - - /** - * Clean up Yadis-related services in the session and return the - * most-recently-attempted service from the manager, if one - * exists. - * - * @param $force True if the manager should be deleted regardless - * of whether it's a manager for $this->url. - */ - function cleanup($force=false) - { - $manager = $this->getManager($force); - if ($manager) { - $service = $manager->current(); - $this->destroyManager($force); - } else { - $service = null; - } - - return $service; - } - - /** - * @access private - */ - function getSessionKey() - { - // Get the session key for this starting URL and suffix - return $this->PREFIX . $this->session_key_suffix; - } - - /** - * @access private - * - * @param $force True if the manager should be returned regardless - * of whether it's a manager for $this->url. - */ - function getManager($force=false) - { - // Extract the YadisServiceManager for this object's URL and - // suffix from the session. - - $manager_str = $this->session->get($this->getSessionKey()); - $manager = null; - - if ($manager_str !== null) { - $loader = new Auth_Yadis_ManagerLoader(); - $manager = $loader->fromSession(unserialize($manager_str)); - } - - if ($manager && ($manager->forURL($this->url) || $force)) { - return $manager; - } - } - - /** - * @access private - */ - function createManager($services, $yadis_url = null) - { - $key = $this->getSessionKey(); - if ($this->getManager()) { - return $this->getManager(); - } - - if ($services) { - $loader = new Auth_Yadis_ManagerLoader(); - $manager = new Auth_Yadis_Manager($this->url, $yadis_url, - $services, $key); - $this->session->set($this->session_key, - serialize($loader->toSession($manager))); - return $manager; - } - } - - /** - * @access private - * - * @param $force True if the manager should be deleted regardless - * of whether it's a manager for $this->url. - */ - function destroyManager($force=false) - { - if ($this->getManager($force) !== null) { - $key = $this->getSessionKey(); - $this->session->del($key); - } - } -} - |