diff options
Diffstat (limited to 'includes/pear/Auth/Container/Multiple.php')
| -rw-r--r-- | includes/pear/Auth/Container/Multiple.php | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/includes/pear/Auth/Container/Multiple.php b/includes/pear/Auth/Container/Multiple.php new file mode 100644 index 0000000..08f131d --- /dev/null +++ b/includes/pear/Auth/Container/Multiple.php @@ -0,0 +1,188 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */ + +/** + * Storage driver for using multiple storage drivers in a fall through fashion + * + * PHP versions 4 and 5 + * + * LICENSE: This source file is subject to version 3.01 of the PHP license + * that is available through the world-wide-web at the following URI: + * http://www.php.net/license/3_01.txt. If you did not receive a copy of + * the PHP License and are unable to obtain it through the web, please + * send a note to license@php.net so we can mail you a copy immediately. + * + * @category Authentication + * @package Auth + * @author Adam Ashley <aashley@php.net> + * @copyright 2001-2006 The PHP Group + * @license http://www.php.net/license/3_01.txt PHP License 3.01 + * @version CVS: $Id: Multiple.php 289653 2009-10-15 04:50:43Z aashley $ + * @since File available since Release 1.5.0 + */ + +/** + * Include Auth_Container base class + */ +require_once "Auth/Container.php"; +/** + * Include PEAR package for error handling + */ +require_once "PEAR.php"; + +/** + * Storage driver for using multiple storage drivers in a fall through fashion + * + * This storage driver provides a mechanism for working through multiple + * storage drivers until either one allows successful login or the list is + * exhausted. + * + * This container takes an array of options of the following form: + * + * array( + * array( + * 'type' => <standard container type name>, + * 'options' => <normal array of options for container>, + * ), + * ); + * + * Full example: + * + * $options = array( + * array( + * 'type' => 'DB', + * 'options' => array( + * 'dsn' => "mysql://user:password@localhost/database", + * ), + * ), + * array( + * 'type' => 'Array', + * 'options' => array( + * 'cryptType' => 'md5', + * 'users' => array( + * 'admin' => md5('password'), + * ), + * ), + * ), + * ); + * + * $auth = new Auth('Multiple', $options); + * + * @category Authentication + * @package Auth + * @author Adam Ashley <aashley@php.net> + * @copyright 2001-2006 The PHP Group + * @license http://www.php.net/license/3_01.txt PHP License 3.01 + * @version Release: @package_version@ File: $Revision: 289653 $ + * @since File available since Release 1.5.0 + */ + +class Auth_Container_Multiple extends Auth_Container { + + // {{{ properties + + /** + * The options for each container + * + * @var array $options + */ + var $options = array(); + + /** + * The instanciated containers + * + * @var array $containers + */ + var $containers = array(); + + // }}} + // {{{ Auth_Container_Multiple() + + /** + * Constructor for Array Container + * + * @param array $data Options for the container + * @return void + */ + function Auth_Container_Multiple($options) + { + if (!is_array($options)) { + PEAR::raiseError('The options for Auth_Container_Multiple must be an array'); + } + if (count($options) < 1) { + PEAR::raiseError('You must define at least one sub container to use in Auth_Container_Multiple'); + } + foreach ($options as $option) { + if (!isset($option['type'])) { + PEAR::raiseError('No type defined for sub container'); + } + } + $this->options = $options; + } + + // }}} + // {{{ fetchData() + + /** + * Get user information from array + * + * This function uses the given username to fetch the corresponding + * login data from the array. If an account that matches the passed + * username and password is found, the function returns true. + * Otherwise it returns false. + * + * @param string Username + * @param string Password + * @return boolean|PEAR_Error Error object or boolean + */ + function fetchData($user, $pass) + { + $this->log('Auth_Container_Multiple::fetchData() called.', AUTH_LOG_DEBUG); + + foreach ($this->options as $key => $options) { + + $this->log('Using Container '.$key.' of type '.$options['type'].'.', AUTH_LOG_DEBUG); + + if (isset($this->containers[$key]) && is_a($this->containers[$key], 'Auth_Container')) { + + $container = &$this->containers[$key]; + + } else { + + $this->containers[$key] = &$this->_auth_obj->_factory($options['type'], $options['options']); + $this->containers[$key]->_auth_obj = &$this->_auth_obj; + $container = &$this->containers[$key]; + + } + + $result = $container->fetchData($user, $pass); + + if (PEAR::isError($result)) { + + $this->log('Container '.$key.': '.$result->getMessage(), AUTH_LOG_DEBUG); + return $result; + + } elseif ($result == true) { + + $this->log('Container '.$key.': Authentication successful.', AUTH_LOG_DEBUG); + return true; + + } else { + + $this->log('Container '.$key.': Authentication failed.', AUTH_LOG_DEBUG); + + } + + } + + $this->log('Auth_Container_Multiple: All containers rejected user credentials.', AUTH_LOG_DEBUG); + + return false; + + } + + // }}} + +} + +?> |
