"TYPO3 4.0.1: typo3_src-4.0.1/typo3/sysext/adodb/adodb/pear/Auth/Container/ADOdb.php Source File", "datetime" => "Sat Dec 2 19:22:26 2006", "date" => "2 Dec 2006", "doxygenversion" => "1.4.6", "projectname" => "TYPO3 4.0.1", "projectnumber" => "4.0.1" ); get_header($doxygen_vars); ?>

ADOdb.php

00001 <?php
00002 //
00003 // +----------------------------------------------------------------------+
00004 // | PHP Version 4                                                        |
00005 // +----------------------------------------------------------------------+
00006 // |                                                                      |
00007 // +----------------------------------------------------------------------+
00008 // | This source file is subject to version 2.02 of the PHP license,      |
00009 // | that is bundled with this package in the file LICENSE, and is        |
00010 // | available at through the world-wide-web at                           |
00011 // | http://www.php.net/license/2_02.txt.                                 |
00012 // | If you did not receive a copy of the PHP license and are unable to   |
00013 // | obtain it through the world-wide-web, please send a note to          |
00014 // | license@php.net so we can mail you a copy immediately.               |
00015 // +----------------------------------------------------------------------+
00016 // | Authors: Martin Jansen <mj@php.net>
00017 // |    Richard Tango-Lowy <richtl@arscognita.com>                                  |
00018 // +----------------------------------------------------------------------+
00019 //
00020 // $Id: ADOdb.php 1562 2006-06-29 22:18:11Z k-fish $
00021 //
00022 
00023 require_once 'Auth/Container.php';
00024 require_once 'adodb.inc.php';
00025 require_once 'adodb-pear.inc.php';
00026 require_once 'adodb-errorpear.inc.php';
00027 
00040 class Auth_Container_ADOdb extends Auth_Container
00041 {
00042 
00047     var $options = array();
00048 
00053     var $db = null;
00054     var $dsn = '';
00055         
00060     var $activeUser = '';
00061 
00062     // {{{ Constructor
00063 
00072     function Auth_Container_ADOdb($dsn)
00073     {
00074         $this->_setDefaults();
00075                 
00076         if (is_array($dsn)) {
00077             $this->_parseOptions($dsn);
00078 
00079             if (empty($this->options['dsn'])) {
00080                 PEAR::raiseError('No connection parameters specified!');
00081             }
00082         } else {
00083                 // Extract db_type from dsn string.
00084             $this->options['dsn'] = $dsn;
00085         }
00086     }
00087 
00088     // }}}
00089     // {{{ _connect()
00090 
00098      function _connect($dsn)
00099     {
00100         if (is_string($dsn) || is_array($dsn)) {
00101                 if(!$this->db) {
00102                         $this->db = &ADONewConnection($dsn);
00103                         if( $err = ADODB_Pear_error() ) {
00104                                 return PEAR::raiseError($err);
00105                         }
00106                 }
00107                 
00108         } else {
00109             return PEAR::raiseError('The given dsn was not valid in file ' . __FILE__ . ' at line ' . __LINE__,
00110                                     41,
00111                                     PEAR_ERROR_RETURN,
00112                                     null,
00113                                     null
00114                                     );
00115         }
00116         
00117         if(!$this->db) {
00118                 return PEAR::raiseError(ADODB_Pear_error());
00119         } else {
00120                 return true;
00121         }
00122     }
00123 
00124     // }}}
00125     // {{{ _prepare()
00126 
00136     function _prepare()
00137     {
00138         if(!$this->db) {
00139                 $res = $this->_connect($this->options['dsn']);                  
00140         }
00141         return true;
00142     }
00143 
00144     // }}}
00145     // {{{ query()
00146 
00159     function query($query)
00160     {
00161         $err = $this->_prepare();
00162         if ($err !== true) {
00163             return $err;
00164         }
00165         return $this->db->query($query);
00166     }
00167 
00168     // }}}
00169     // {{{ _setDefaults()
00170 
00177     function _setDefaults()
00178     {
00179         $this->options['db_type']       = 'mysql';
00180         $this->options['table']       = 'auth';
00181         $this->options['usernamecol'] = 'username';
00182         $this->options['passwordcol'] = 'password';
00183         $this->options['dsn']         = '';
00184         $this->options['db_fields']   = '';
00185         $this->options['cryptType']   = 'md5';
00186     }
00187 
00188     // }}}
00189     // {{{ _parseOptions()
00190 
00197     function _parseOptions($array)
00198     {
00199         foreach ($array as $key => $value) {
00200             if (isset($this->options[$key])) {
00201                 $this->options[$key] = $value;
00202             }
00203         }
00204 
00205         /* Include additional fields if they exist */
00206         if(!empty($this->options['db_fields'])){
00207             if(is_array($this->options['db_fields'])){
00208                 $this->options['db_fields'] = join($this->options['db_fields'], ', ');
00209             }
00210             $this->options['db_fields'] = ', '.$this->options['db_fields'];
00211         }
00212     }
00213 
00214     // }}}
00215     // {{{ fetchData()
00216 
00230     function fetchData($username, $password)
00231     {
00232         // Prepare for a database query
00233         $err = $this->_prepare();
00234         if ($err !== true) {
00235             return PEAR::raiseError($err->getMessage(), $err->getCode());
00236         }
00237 
00238         // Find if db_fields contains a *, i so assume all col are selected
00239         if(strstr($this->options['db_fields'], '*')){
00240             $sql_from = "*";
00241         }
00242         else{
00243             $sql_from = $this->options['usernamecol'] . ", ".$this->options['passwordcol'].$this->options['db_fields'];
00244         }
00245         
00246         $query = "SELECT ".$sql_from.
00247                 " FROM ".$this->options['table'].
00248                 " WHERE ".$this->options['usernamecol']." = " . $this->db->Quote($username);
00249         
00250         $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
00251         $rset = $this->db->Execute( $query );
00252         $res = $rset->fetchRow();
00253 
00254         if (DB::isError($res)) {
00255             return PEAR::raiseError($res->getMessage(), $res->getCode());
00256         }
00257         if (!is_array($res)) {
00258             $this->activeUser = '';
00259             return false;
00260         }
00261         if ($this->verifyPassword(trim($password, "\r\n"),
00262                                   trim($res[$this->options['passwordcol']], "\r\n"),
00263                                   $this->options['cryptType'])) {
00264             // Store additional field values in the session
00265             foreach ($res as $key => $value) {
00266                 if ($key == $this->options['passwordcol'] ||
00267                     $key == $this->options['usernamecol']) {
00268                     continue;
00269                 }
00270                 // Use reference to the auth object if exists
00271                 // This is because the auth session variable can change so a static call to setAuthData does not make sence
00272                 if(is_object($this->_auth_obj)){
00273                     $this->_auth_obj->setAuthData($key, $value);
00274                 } else {
00275                     Auth::setAuthData($key, $value);
00276                 }
00277             }
00278 
00279             return true;
00280         }
00281 
00282         $this->activeUser = $res[$this->options['usernamecol']];
00283         return false;
00284     }
00285 
00286     // }}}
00287     // {{{ listUsers()
00288 
00289     function listUsers()
00290     {
00291         $err = $this->_prepare();
00292         if ($err !== true) {
00293             return PEAR::raiseError($err->getMessage(), $err->getCode());
00294         }
00295 
00296         $retVal = array();
00297 
00298         // Find if db_fileds contains a *, i so assume all col are selected
00299         if(strstr($this->options['db_fields'], '*')){
00300             $sql_from = "*";
00301         }
00302         else{
00303             $sql_from = $this->options['usernamecol'] . ", ".$this->options['passwordcol'].$this->options['db_fields'];
00304         }
00305 
00306         $query = sprintf("SELECT %s FROM %s",
00307                          $sql_from,
00308                          $this->options['table']
00309                          );
00310         $res = $this->db->getAll($query, null, DB_FETCHMODE_ASSOC);
00311 
00312         if (DB::isError($res)) {
00313             return PEAR::raiseError($res->getMessage(), $res->getCode());
00314         } else {
00315             foreach ($res as $user) {
00316                 $user['username'] = $user[$this->options['usernamecol']];
00317                 $retVal[] = $user;
00318             }
00319         }
00320         return $retVal;
00321     }
00322 
00323     // }}}
00324     // {{{ addUser()
00325 
00336     function addUser($username, $password, $additional = "")
00337     {
00338         if (function_exists($this->options['cryptType'])) {
00339             $cryptFunction = $this->options['cryptType'];
00340         } else {
00341             $cryptFunction = 'md5';
00342         }
00343 
00344         $additional_key   = '';
00345         $additional_value = '';
00346 
00347         if (is_array($additional)) {
00348             foreach ($additional as $key => $value) {
00349                 $additional_key .= ', ' . $key;
00350                 $additional_value .= ", '" . $value . "'";
00351             }
00352         }
00353 
00354         $query = sprintf("INSERT INTO %s (%s, %s%s) VALUES ('%s', '%s'%s)",
00355                          $this->options['table'],
00356                          $this->options['usernamecol'],
00357                          $this->options['passwordcol'],
00358                          $additional_key,
00359                          $username,
00360                          $cryptFunction($password),
00361                          $additional_value
00362                          );
00363 
00364         $res = $this->query($query);
00365 
00366         if (DB::isError($res)) {
00367            return PEAR::raiseError($res->getMessage(), $res->getCode());
00368         } else {
00369           return true;
00370         }
00371     }
00372 
00373     // }}}
00374     // {{{ removeUser()
00375 
00384     function removeUser($username)
00385     {
00386         $query = sprintf("DELETE FROM %s WHERE %s = '%s'",
00387                          $this->options['table'],
00388                          $this->options['usernamecol'],
00389                          $username
00390                          );
00391 
00392         $res = $this->query($query);
00393 
00394         if (DB::isError($res)) {
00395            return PEAR::raiseError($res->getMessage(), $res->getCode());
00396         } else {
00397           return true;
00398         }
00399     }
00400 
00401     // }}}
00402 }
00403 
00404 function showDbg( $string ) {
00405         print "
00406 -- $string</P>";
00407 }
00408 function dump( $var, $str, $vardump = false ) {
00409         print "<H4>$str</H4><pre>";
00410         ( !$vardump ) ? ( print_r( $var )) : ( var_dump( $var ));
00411         print "</pre>";
00412 }
00413 ?>