diff options
Diffstat (limited to 'includes/pear/Auth/Container/MDB.php')
| -rw-r--r-- | includes/pear/Auth/Container/MDB.php | 625 |
1 files changed, 0 insertions, 625 deletions
diff --git a/includes/pear/Auth/Container/MDB.php b/includes/pear/Auth/Container/MDB.php deleted file mode 100644 index 019a122..0000000 --- a/includes/pear/Auth/Container/MDB.php +++ /dev/null @@ -1,625 +0,0 @@ -<?php -/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */ - -/** - * Storage driver for use against PEAR MDB - * - * 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 Lorenzo Alberton <l.alberton@quipo.it> - * @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: MDB.php 256753 2008-04-04 07:57:02Z aashley $ - * @link http://pear.php.net/package/Auth - * @since File available since Release 1.2.3 - */ - -/** - * Include Auth_Container base class - */ -require_once 'Auth/Container.php'; -/** - * Include PEAR MDB package - */ -require_once 'MDB.php'; - -/** - * Storage driver for fetching login data from a database - * - * This storage driver can use all databases which are supported - * by the PEAR MDB abstraction layer to fetch login data. - * - * @category Authentication - * @package Auth - * @author Lorenzo Alberton <l.alberton@quipo.it> - * @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: 256753 $ - * @link http://pear.php.net/package/Auth - * @since Class available since Release 1.2.3 - */ -class Auth_Container_MDB extends Auth_Container -{ - - // {{{ properties - - /** - * Additional options for the storage container - * @var array - */ - var $options = array(); - - /** - * MDB object - * @var object - */ - var $db = null; - var $dsn = ''; - - /** - * User that is currently selected from the DB. - * @var string - */ - var $activeUser = ''; - - // }}} - // {{{ Auth_Container_MDB() [constructor] - - /** - * Constructor of the container class - * - * Initate connection to the database via PEAR::MDB - * - * @param string Connection data or MDB object - * @return object Returns an error object if something went wrong - */ - function Auth_Container_MDB($dsn) - { - $this->_setDefaults(); - - if (is_array($dsn)) { - $this->_parseOptions($dsn); - if (empty($this->options['dsn'])) { - PEAR::raiseError('No connection parameters specified!'); - } - } else { - $this->options['dsn'] = $dsn; - } - } - - // }}} - // {{{ _connect() - - /** - * Connect to database by using the given DSN string - * - * @access private - * @param mixed DSN string | array | mdb object - * @return mixed Object on error, otherwise bool - */ - function _connect($dsn) - { - $this->log('Auth_Container_MDB::_connect() called.', AUTH_LOG_DEBUG); - if (is_string($dsn) || is_array($dsn)) { - $this->db =& MDB::connect($dsn, $this->options['db_options']); - } elseif (is_subclass_of($dsn, 'mdb_common')) { - $this->db = $dsn; - } elseif (is_object($dsn) && MDB::isError($dsn)) { - return PEAR::raiseError($dsn->getMessage(), $dsn->code); - } else { - return PEAR::raiseError('The given dsn was not valid in file ' . __FILE__ . ' at line ' . __LINE__, - 41, - PEAR_ERROR_RETURN, - null, - null - ); - - } - - if (MDB::isError($this->db) || PEAR::isError($this->db)) { - return PEAR::raiseError($this->db->getMessage(), $this->db->code); - } - - if ($this->options['auto_quote']) { - if (strpos('.', $this->options['table']) === false) { - $this->options['final_table'] = $this->db->quoteIdentifier($this->options['table']); - } else { - $t = explode('.', $this->options['table']); - for ($i = 0, $count = count($t); $i < $count; $i++) - $t[$i] = $this->db->quoteIdentifier($t[$i]); - $this->options['final_table'] = implode('.', $t); - } - $this->options['final_usernamecol'] = $this->db->quoteIdentifier($this->options['usernamecol']); - $this->options['final_passwordcol'] = $this->db->quoteIdentifier($this->options['passwordcol']); - } else { - $this->options['final_table'] = $this->options['table']; - $this->options['final_usernamecol'] = $this->options['usernamecol']; - $this->options['final_passwordcol'] = $this->options['passwordcol']; - } - - return true; - } - - // }}} - // {{{ _prepare() - - /** - * Prepare database connection - * - * This function checks if we have already opened a connection to - * the database. If that's not the case, a new connection is opened. - * - * @access private - * @return mixed True or a MDB error object. - */ - function _prepare() - { - if (is_subclass_of($this->db, 'mdb_common')) { - return true; - } - return $this->_connect($this->options['dsn']); - } - - // }}} - // {{{ query() - - /** - * Prepare query to the database - * - * This function checks if we have already opened a connection to - * the database. If that's not the case, a new connection is opened. - * After that the query is passed to the database. - * - * @access public - * @param string Query string - * @return mixed a MDB_result object or MDB_OK on success, a MDB - * or PEAR error on failure - */ - function query($query) - { - $this->log('Auth_Container_MDB::query() called.', AUTH_LOG_DEBUG); - $err = $this->_prepare(); - if ($err !== true) { - return $err; - } - return $this->db->query($query); - } - - // }}} - // {{{ _setDefaults() - - /** - * Set some default options - * - * @access private - * @return void - */ - function _setDefaults() - { - $this->options['table'] = 'auth'; - $this->options['usernamecol'] = 'username'; - $this->options['passwordcol'] = 'password'; - $this->options['dsn'] = ''; - $this->options['db_fields'] = ''; - $this->options['cryptType'] = 'md5'; - $this->options['db_options'] = array(); - $this->options['db_where'] = ''; - $this->options['auto_quote'] = true; - } - - // }}} - // {{{ _parseOptions() - - /** - * Parse options passed to the container class - * - * @access private - * @param array - */ - function _parseOptions($array) - { - foreach ($array as $key => $value) { - if (isset($this->options[$key])) { - $this->options[$key] = $value; - } - } - } - - // }}} - // {{{ _quoteDBFields() - - /** - * Quote the db_fields option to avoid the possibility of SQL injection. - * - * @access private - * @return string A properly quoted string that can be concatenated into a - * SELECT clause. - */ - function _quoteDBFields() - { - if (isset($this->options['db_fields'])) { - if (is_array($this->options['db_fields'])) { - if ($this->options['auto_quote']) { - $fields = array(); - foreach ($this->options['db_fields'] as $field) { - $fields[] = $this->db->quoteIdentifier($field); - } - return implode(', ', $fields); - } else { - return implode(', ', $this->options['db_fields']); - } - } else { - if (strlen($this->options['db_fields']) > 0) { - if ($this->options['auto_quote']) { - return $this->db->quoteIdentifier($this->options['db_fields']); - } else { - return $this->options['db_fields']; - } - } - } - } - - return ''; - } - - // }}} - // {{{ fetchData() - - /** - * Get user information from database - * - * This function uses the given username to fetch - * the corresponding login data from the database - * table. 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 - * @param boolean If true password is secured using a md5 hash - * the frontend and auth are responsible for making sure the container supports - * challenge response password authentication - * @return mixed Error object or boolean - */ - function fetchData($username, $password, $isChallengeResponse=false) - { - $this->log('Auth_Container_MDB::fetchData() called.', AUTH_LOG_DEBUG); - // Prepare for a database query - $err = $this->_prepare(); - if ($err !== true) { - return PEAR::raiseError($err->getMessage(), $err->getCode()); - } - - //Check if db_fields contains a *, if so assume all columns are selected - if (is_string($this->options['db_fields']) - && strstr($this->options['db_fields'], '*')) { - $sql_from = '*'; - } else { - $sql_from = $this->options['final_usernamecol']. - ", ".$this->options['final_passwordcol']; - - if (strlen($fields = $this->_quoteDBFields()) > 0) { - $sql_from .= ', '.$fields; - } - } - - $query = sprintf("SELECT %s FROM %s WHERE %s = %s", - $sql_from, - $this->options['final_table'], - $this->options['final_usernamecol'], - $this->db->getTextValue($username) - ); - - // check if there is an optional parameter db_where - if ($this->options['db_where'] != '') { - // there is one, so add it to the query - $query .= " AND ".$this->options['db_where']; - } - - $this->log('Running SQL against MDB: '.$query, AUTH_LOG_DEBUG); - - $res = $this->db->getRow($query, null, null, null, MDB_FETCHMODE_ASSOC); - - if (MDB::isError($res) || PEAR::isError($res)) { - return PEAR::raiseError($res->getMessage(), $res->getCode()); - } - if (!is_array($res)) { - $this->activeUser = ''; - return false; - } - - // Perform trimming here before the hashing - $password = trim($password, "\r\n"); - $res[$this->options['passwordcol']] = trim($res[$this->options['passwordcol']], "\r\n"); - - // If using Challenge Response md5 the pass with the secret - if ($isChallengeResponse) { - $res[$this->options['passwordcol']] = - md5($res[$this->options['passwordcol']].$this->_auth_obj->session['loginchallenege']); - // UGLY cannot avoid without modifying verifyPassword - if ($this->options['cryptType'] == 'md5') { - $res[$this->options['passwordcol']] = md5($res[$this->options['passwordcol']]); - } - } - - if ($this->verifyPassword($password, - $res[$this->options['passwordcol']], - $this->options['cryptType'])) { - // Store additional field values in the session - foreach ($res as $key => $value) { - if ($key == $this->options['passwordcol'] || - $key == $this->options['usernamecol']) { - continue; - } - - $this->log('Storing additional field: '.$key, AUTH_LOG_DEBUG); - // Use reference to the auth object if exists - // This is because the auth session variable can change so a static - // call to setAuthData does not make sense - $this->_auth_obj->setAuthData($key, $value); - } - return true; - } - - $this->activeUser = $res[$this->options['usernamecol']]; - return false; - } - - // }}} - // {{{ listUsers() - - /** - * Returns a list of users from the container - * - * @return mixed array|PEAR_Error - * @access public - */ - function listUsers() - { - $this->log('Auth_Container_MDB::listUsers() called.', AUTH_LOG_DEBUG); - $err = $this->_prepare(); - if ($err !== true) { - return PEAR::raiseError($err->getMessage(), $err->getCode()); - } - - $retVal = array(); - - //Check if db_fields contains a *, if so assume all columns are selected - if ( is_string($this->options['db_fields']) - && strstr($this->options['db_fields'], '*')) { - $sql_from = '*'; - } else { - $sql_from = $this->options['final_usernamecol'] - .', '.$this->options['final_passwordcol']; - - if (strlen($fields = $this->_quoteDBFields()) > 0) { - $sql_from .= ', '.$fields; - } - } - - $query = sprintf('SELECT %s FROM %s', - $sql_from, - $this->options['final_table'] - ); - - // check if there is an optional parameter db_where - if ($this->options['db_where'] != '') { - // there is one, so add it to the query - $query .= " WHERE ".$this->options['db_where']; - } - - $this->log('Running SQL against MDB: '.$query, AUTH_LOG_DEBUG); - - $res = $this->db->getAll($query, null, null, null, MDB_FETCHMODE_ASSOC); - - if (MDB::isError($res)) { - return PEAR::raiseError($res->getMessage(), $res->getCode()); - } else { - foreach ($res as $user) { - $user['username'] = $user[$this->options['usernamecol']]; - $retVal[] = $user; - } - } - $this->log('Found '.count($retVal).' users.', AUTH_LOG_DEBUG); - return $retVal; - } - - // }}} - // {{{ addUser() - - /** - * Add user to the storage container - * - * @access public - * @param string Username - * @param string Password - * @param mixed Additional information that are stored in the DB - * - * @return mixed True on success, otherwise error object - */ - function addUser($username, $password, $additional = "") - { - $this->log('Auth_Container_MDB::addUser() called.', AUTH_LOG_DEBUG); - $err = $this->_prepare(); - if ($err !== true) { - return PEAR::raiseError($err->getMessage(), $err->getCode()); - } - - if (isset($this->options['cryptType']) && $this->options['cryptType'] == 'none') { - $cryptFunction = 'strval'; - } elseif (isset($this->options['cryptType']) && function_exists($this->options['cryptType'])) { - $cryptFunction = $this->options['cryptType']; - } else { - $cryptFunction = 'md5'; - } - - $password = $cryptFunction($password); - - $additional_key = ''; - $additional_value = ''; - - if (is_array($additional)) { - foreach ($additional as $key => $value) { - if ($this->options['auto_quote']) { - $additional_key .= ', ' . $this->db->quoteIdentifier($key); - } else { - $additional_key .= ', ' . $key; - } - $additional_value .= ', ' . $this->db->getTextValue($value); - } - } - - $query = sprintf("INSERT INTO %s (%s, %s%s) VALUES (%s, %s%s)", - $this->options['final_table'], - $this->options['final_usernamecol'], - $this->options['final_passwordcol'], - $additional_key, - $this->db->getTextValue($username), - $this->db->getTextValue($password), - $additional_value - ); - - $this->log('Running SQL against MDB: '.$query, AUTH_LOG_DEBUG); - - $res = $this->query($query); - - if (MDB::isError($res)) { - return PEAR::raiseError($res->getMessage(), $res->code); - } - return true; - } - - // }}} - // {{{ removeUser() - - /** - * Remove user from the storage container - * - * @access public - * @param string Username - * - * @return mixed True on success, otherwise error object - */ - function removeUser($username) - { - $this->log('Auth_Container_MDB::removeUser() called.', AUTH_LOG_DEBUG); - $err = $this->_prepare(); - if ($err !== true) { - return PEAR::raiseError($err->getMessage(), $err->getCode()); - } - - $query = sprintf("DELETE FROM %s WHERE %s = %s", - $this->options['final_table'], - $this->options['final_usernamecol'], - $this->db->getTextValue($username) - ); - - // check if there is an optional parameter db_where - if ($this->options['db_where'] != '') { - // there is one, so add it to the query - $query .= " AND ".$this->options['db_where']; - } - - $this->log('Running SQL against MDB: '.$query, AUTH_LOG_DEBUG); - - $res = $this->query($query); - - if (MDB::isError($res)) { - return PEAR::raiseError($res->getMessage(), $res->code); - } - return true; - } - - // }}} - // {{{ changePassword() - - /** - * Change password for user in the storage container - * - * @param string Username - * @param string The new password (plain text) - */ - function changePassword($username, $password) - { - $this->log('Auth_Container_MDB::changePassword() called.', AUTH_LOG_DEBUG); - $err = $this->_prepare(); - if ($err !== true) { - return PEAR::raiseError($err->getMessage(), $err->getCode()); - } - - if (isset($this->options['cryptType']) && $this->options['cryptType'] == 'none') { - $cryptFunction = 'strval'; - } elseif (isset($this->options['cryptType']) && function_exists($this->options['cryptType'])) { - $cryptFunction = $this->options['cryptType']; - } else { - $cryptFunction = 'md5'; - } - - $password = $cryptFunction($password); - - $query = sprintf("UPDATE %s SET %s = %s WHERE %s = %s", - $this->options['final_table'], - $this->options['final_passwordcol'], - $this->db->getTextValue($password), - $this->options['final_usernamecol'], - $this->db->getTextValue($username) - ); - - // check if there is an optional parameter db_where - if ($this->options['db_where'] != '') { - // there is one, so add it to the query - $query .= " AND ".$this->options['db_where']; - } - - $this->log('Running SQL against MDB: '.$query, AUTH_LOG_DEBUG); - - $res = $this->query($query); - - if (MDB::isError($res)) { - return PEAR::raiseError($res->getMessage(), $res->code); - } - return true; - } - - // }}} - // {{{ supportsChallengeResponse() - - /** - * Determine if this container supports - * password authentication with challenge response - * - * @return bool - * @access public - */ - function supportsChallengeResponse() - { - return in_array($this->options['cryptType'], array('md5', 'none', '')); - } - - // }}} - // {{{ getCryptType() - - /** - * Returns the selected crypt type for this container - * - * @return string Function used to crypt the password - */ - function getCryptType() - { - return $this->options['cryptType']; - } - - // }}} - -} -?> |
