summaryrefslogtreecommitdiff
path: root/includes/pear/Auth/Container/Multiple.php
diff options
context:
space:
mode:
Diffstat (limited to 'includes/pear/Auth/Container/Multiple.php')
-rw-r--r--includes/pear/Auth/Container/Multiple.php188
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;
+
+ }
+
+ // }}}
+
+}
+
+?>