[ Index ]
 

Code source de Typo3 4.1.3

Accédez au Source d'autres logiciels libres

Classes | Fonctions | Variables | Constantes | Tables

title

Body

[fermer]

/typo3/sysext/cms/tslib/ -> class.tslib_feuserauth.php (source)

   1  <?php
   2  /***************************************************************
   3  *  Copyright notice
   4  *
   5  *  (c) 1999-2005 Kasper Skaarhoj (kasperYYYY@typo3.com)
   6  *  All rights reserved
   7  *
   8  *  This script is part of the TYPO3 project. The TYPO3 project is
   9  *  free software; you can redistribute it and/or modify
  10  *  it under the terms of the GNU General Public License as published by
  11  *  the Free Software Foundation; either version 2 of the License, or
  12  *  (at your option) any later version.
  13  *
  14  *  The GNU General Public License can be found at
  15  *  http://www.gnu.org/copyleft/gpl.html.
  16  *  A copy is found in the textfile GPL.txt and important notices to the license
  17  *  from the author is found in LICENSE.txt distributed with these scripts.
  18  *
  19  *
  20  *  This script is distributed in the hope that it will be useful,
  21  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  22  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  23  *  GNU General Public License for more details.
  24  *
  25  *  This copyright notice MUST APPEAR in all copies of the script!
  26  ***************************************************************/
  27  /**
  28   * Front End session user. Login and session data
  29   * Included from index_ts.php
  30   *
  31   * $Id: class.tslib_feuserauth.php 2043 2007-02-16 11:33:32Z mundaun $
  32   * Revised for TYPO3 3.6 June/2003 by Kasper Skaarhoj
  33   *
  34   * @author    Kasper Skaarhoj <kasperYYYY@typo3.com>
  35   * @author    René Fritz <r.fritz@colorcube.de>
  36   */
  37  /**
  38   * [CLASS/FUNCTION INDEX of SCRIPT]
  39   *
  40   *
  41   *
  42   *   79: class tslib_feUserAuth extends t3lib_userAuth
  43   *  143:     function fetchGroupData()
  44   *  233:     function getUserTSconf()
  45   *
  46   *              SECTION: Session data management functions
  47   *  278:     function fetchSessionData()
  48   *  300:     function storeSessionData()
  49   *  326:     function getKey($type,$key)
  50   *  351:     function setKey($type,$key,$data)
  51   *  377:     function record_registration($recs,$maxSizeOfSessionData=0)
  52   *
  53   * TOTAL FUNCTIONS: 7
  54   * (This index is automatically created/updated by the extension "extdeveval")
  55   *
  56   */
  57  
  58  
  59  
  60  
  61  
  62  
  63  
  64  
  65  
  66  
  67  
  68  
  69  
  70  
  71  /**
  72   * Extension class for Front End User Authentication.
  73   *
  74   * @author    Kasper Skaarhoj <kasperYYYY@typo3.com>
  75   * @author    René Fritz <r.fritz@colorcube.de>
  76   * @package TYPO3
  77   * @subpackage tslib
  78   */
  79  class tslib_feUserAuth extends t3lib_userAuth {
  80      var $session_table = 'fe_sessions';         // Table to use for session data.
  81      var $name = 'fe_typo_user';                 // Session/Cookie name
  82      var $get_name = 'ftu';                             // Session/GET-var name
  83  
  84      var $user_table = 'fe_users';                     // Table in database with userdata
  85      var $username_column = 'username';                 // Column for login-name
  86      var $userident_column = 'password';             // Column for password
  87      var $userid_column = 'uid';                     // Column for user-id
  88      var $lastLogin_column = 'lastlogin';
  89  
  90      var $enablecolumns = Array (
  91          'deleted' => 'deleted',
  92          'disabled' => 'disable',
  93          'starttime' => 'starttime',
  94          'endtime' => 'endtime'
  95      );
  96      var $formfield_uname = 'user';                 // formfield with login-name
  97      var $formfield_uident = 'pass';             // formfield with password
  98      var $formfield_chalvalue = 'challenge';        // formfield with a unique value which is used to encrypt the password and username
  99      var $formfield_status = 'logintype';         // formfield with status: *'login', 'logout'
 100      var $formfield_permanent = 'permalogin';    // formfield with 0 or 1 // 1 = permanent login enabled // 0 = session is valid for a browser session only
 101      var $security_level = '';                    // sets the level of security. *'normal' = clear-text. 'challenged' = hashed password/username from form in $formfield_uident. 'superchallenged' = hashed password hashed again with username.
 102  
 103      var $auth_include = '';                        // this is the name of the include-file containing the login form. If not set, login CAN be anonymous. If set login IS needed.
 104  
 105      var $auth_timeout_field = 6000;                // Server session lifetime. If > 0: session-timeout in seconds. If false or <0: no timeout. If string: The string is a fieldname from the usertable where the timeout can be found.
 106  
 107      var $lifetime = 0;                // Client session lifetime. 0 = Session-cookies. If session-cookies, the browser will stop the session when the browser is closed. Otherwise this specifies the lifetime of a cookie that keeps the session.
 108      var $sendNoCacheHeaders = 0;
 109      var $getFallBack = 1;                        // If this is set, authentication is also accepted by the _GET. Notice that the identification is NOT 128bit MD5 hash but reduced. This is done in order to minimize the size for mobile-devices, such as WAP-phones
 110      var $hash_length = 10;
 111      var $getMethodEnabled = 1;                    // Login may be supplied by url.
 112  
 113      var $usergroup_column = 'usergroup';
 114      var $usergroup_table = 'fe_groups';
 115      var $groupData = Array(
 116          'title' =>Array(),
 117          'uid' =>Array(),
 118          'pid' =>Array()
 119      );
 120      var $TSdataArray=array();        // Used to accumulate the TSconfig data of the user
 121      var $userTS = array();
 122      var $userTSUpdated=0;
 123      var $showHiddenRecords=0;
 124  
 125          // Session and user data:
 126          /*
 127              There are two types of data that can be stored: UserData and Session-Data. Userdata is for the login-user, and session-data for anyone viewing the pages.
 128              'Keys' are keys in the internal dataarray of the data. When you get or set a key in one of the data-spaces (user or session) you decide the type of the variable (not object though)
 129              'Reserved' keys are:
 130                  - 'recs': Array: Used to 'register' records, eg in a shopping basket. Structure: [recs][tablename][record_uid]=number
 131                  - sys: Reserved for TypoScript standard code.
 132          */
 133      var $sesData = Array();
 134      var $sesData_change = 0;
 135      var $userData_change = 0;
 136  
 137  
 138      /**
 139       * Starts a user session
 140       *
 141       * @return    void
 142       * @see t3lib_userAuth::start()
 143       */
 144  	function start() {
 145          if (intval($this->auth_timeout_field)>0 && intval($this->auth_timeout_field) < $this->lifetime)    {
 146                  // If server session timeout is non-zero but less than client session timeout: Copy this value instead.
 147              $this->auth_timeout_field = $this->lifetime;
 148          }
 149  
 150          parent::start();
 151      }
 152  
 153      /**
 154       * Returns a new session record for the current user for insertion into the DB.
 155       *
 156       * @return    array        user session record
 157       */
 158  	function getNewSessionRecord($tempuser) {
 159          $insertFields = parent::getNewSessionRecord($tempuser);
 160          $insertFields['ses_permanent'] = $this->is_permanent;
 161  
 162          return $insertFields;
 163      }
 164  
 165      /**
 166       * Determins whether a session cookie needs to be set (lifetime=0)
 167       *
 168       * @return    boolean
 169       * @internal
 170       */
 171  	function isSetSessionCookie() {
 172          $retVal = ($this->newSessionID || $this->forceSetCookie) && ($this->lifetime==0 || !$this->user['ses_permanent']);
 173          return $retVal;
 174      }
 175  
 176      /**
 177       * Determins whether a non-session cookie needs to be set (lifetime>0)
 178       *
 179       * @return    boolean
 180       * @internal
 181       */
 182  	function isRefreshTimeBasedCookie() {
 183          return $this->lifetime > 0 && $this->user['ses_permanent'];
 184      }
 185  
 186      /**
 187       * Returns an info array with Login/Logout data submitted by a form or params
 188       *
 189       * @return    array
 190       * @see t3lib_userAuth::getLoginFormData()
 191       */
 192  	function getLoginFormData() {
 193          $loginData = parent::getLoginFormData();
 194          if($GLOBALS['TYPO3_CONF_VARS']['FE']['permalogin'] == 0 || $GLOBALS['TYPO3_CONF_VARS']['FE']['permalogin'] == 1) {
 195              if ($this->getMethodEnabled)    {
 196                  $isPermanent = t3lib_div::_GP($this->formfield_permanent);
 197              } else {
 198                  $isPermanent = t3lib_div::_POST($this->formfield_permanent);
 199              }
 200              if(strlen($isPermanent) != 1) {
 201                  $isPermanent = $GLOBALS['TYPO3_CONF_VARS']['FE']['permalogin'];
 202              } elseif(!$isPermanent) {
 203                  $this->forceSetCookie = true; // To make sure the user gets a session cookie and doesn't keep a possibly existing time based cookie, we need to force seeting the session cookie here
 204              }
 205              $isPermanent = $isPermanent?1:0;
 206          } elseif($GLOBALS['TYPO3_CONF_VARS']['FE']['permalogin'] == 2) {
 207              $isPermanent = 1;
 208          } else {
 209              $isPermanent = 0;
 210          }
 211          $loginData['permanent'] = $isPermanent;
 212          $this->is_permanent = $isPermanent;
 213  
 214          return $loginData;
 215      }
 216  
 217      /**
 218       * Will select all fe_groups records that the current fe_user is member of - and which groups are also allowed in the current domain.
 219       * It also accumulates the TSconfig for the fe_user/fe_groups in ->TSdataArray
 220       *
 221       * @return    integer        Returns the number of usergroups for the frontend users (if the internal user record exists and the usergroup field contains a value)
 222       */
 223  	function fetchGroupData()    {
 224          $this->TSdataArray = array();
 225          $this->userTS = array();
 226          $this->userTSUpdated = 0;
 227          $this->groupData = Array(
 228              'title' => Array(),
 229              'uid' => Array(),
 230              'pid' => Array()
 231          );
 232  
 233              // Setting default configuration:
 234          $this->TSdataArray[]=$GLOBALS['TYPO3_CONF_VARS']['FE']['defaultUserTSconfig'];
 235  
 236              // get the info data for auth services
 237          $authInfo = $this->getAuthInfoArray();
 238  
 239          if ($this->writeDevLog)     t3lib_div::devLog('Get usergroups for user: '.t3lib_div::arrayToLogString($this->user, array($this->userid_column,$this->username_column)), 'tslib_feUserAuth');
 240  
 241          $groupDataArr = array();
 242  
 243              // use 'auth' service to find the groups for the user
 244          $serviceChain='';
 245          $subType = 'getGroups'.$this->loginType;
 246          while (is_object($serviceObj = t3lib_div::makeInstanceService('auth', $subType, $serviceChain)))    {
 247              $serviceChain.=','.$serviceObj->getServiceKey();
 248              $serviceObj->initAuth($subType, array(), $authInfo, $this);
 249  
 250              $groupData = $serviceObj->getGroups($this->user, $groupDataArr);
 251              if (is_array($groupData) && count($groupData))    {
 252                  $groupDataArr = t3lib_div::array_merge($groupDataArr, $groupData);    // Keys in $groupData should be unique ids of the groups (like "uid") so this function will override groups.
 253              }
 254              unset($serviceObj);
 255          }
 256          if ($this->writeDevLog AND $serviceChain)     t3lib_div::devLog($subType.' auth services called: '.$serviceChain, 'tslib_feUserAuth');
 257          if ($this->writeDevLog AND !count($groupDataArr))     t3lib_div::devLog('No usergroups found by services', 'tslib_feUserAuth');
 258          if ($this->writeDevLog AND count($groupDataArr))     t3lib_div::devLog(count($groupDataArr).' usergroup records found by services', 'tslib_feUserAuth');
 259  
 260  
 261              // use 'auth' service to check the usergroups if they are really valid
 262          foreach ($groupDataArr as $groupData)    {
 263                  // by default a group is valid
 264              $validGroup = TRUE;
 265  
 266              $serviceChain='';
 267              $subType = 'authGroups'.$this->loginType;
 268              while (is_object($serviceObj = t3lib_div::makeInstanceService('auth', $subType, $serviceChain))) {
 269                  $serviceChain.=','.$serviceObj->getServiceKey();
 270                  $serviceObj->initAuth($subType, array(), $authInfo, $this);
 271  
 272                  if (!$serviceObj->authGroup($this->user, $groupData)) {
 273                      $validGroup = FALSE;
 274                      if ($this->writeDevLog)     t3lib_div::devLog($subType.' auth service did not auth group: '.t3lib_div::arrayToLogString($groupData, 'uid,title'), 'tslib_feUserAuth', 2);
 275  
 276                      break;
 277                  }
 278                  unset($serviceObj);
 279              }
 280              unset($serviceObj);
 281  
 282              if ($validGroup) {
 283                  $this->groupData['title'][$groupData['uid']]=$groupData['title'];
 284                  $this->groupData['uid'][$groupData['uid']]=$groupData['uid'];
 285                  $this->groupData['pid'][$groupData['uid']]=$groupData['pid'];
 286                  $this->groupData['TSconfig'][$groupData['uid']]=$groupData['TSconfig'];
 287              }
 288          }
 289  
 290          if (count($this->groupData) && count($this->groupData['TSconfig']))    {
 291                  // TSconfig: collect it in the order it was collected
 292              foreach($this->groupData['TSconfig'] as $TSdata)    {
 293                  $this->TSdataArray[]=$TSdata;
 294              }
 295  
 296              $this->TSdataArray[]=$this->user['TSconfig'];
 297  
 298                  // Sort information
 299              ksort($this->groupData['title']);
 300              ksort($this->groupData['uid']);
 301              ksort($this->groupData['pid']);
 302          }
 303  
 304          return count($this->groupData['uid']) ? count($this->groupData['uid']) : 0;
 305      }
 306  
 307      /**
 308       * Returns the parsed TSconfig for the fe_user
 309       * First time this function is called it will parse the TSconfig and store it in $this->userTS. Subsequent requests will not re-parse the TSconfig but simply return what is already in $this->userTS
 310       *
 311       * @return    array        TSconfig array for the fe_user
 312       */
 313  	function getUserTSconf()    {
 314          if (!$this->userTSUpdated) {
 315                  // Parsing the user TS (or getting from cache)
 316              $this->TSdataArray = t3lib_TSparser::checkIncludeLines_array($this->TSdataArray);
 317              $userTS = implode(chr(10).'[GLOBAL]'.chr(10),$this->TSdataArray);
 318              $parseObj = t3lib_div::makeInstance('t3lib_TSparser');
 319              $parseObj->parse($userTS);
 320              $this->userTS = $parseObj->setup;
 321  
 322              $this->userTSUpdated=1;
 323          }
 324          return $this->userTS;
 325      }
 326  
 327  
 328  
 329  
 330  
 331  
 332  
 333  
 334  
 335  
 336  
 337  
 338  
 339  
 340  
 341  
 342  
 343      /*****************************************
 344       *
 345       * Session data management functions
 346       *
 347       ****************************************/
 348  
 349      /**
 350       * Fetches the session data for the user (from the fe_session_data table) based on the ->id of the current user-session.
 351       * The session data is restored to $this->sesData
 352       * 1/100 calls will also do a garbage collection.
 353       *
 354       * @return    void
 355       * @access private
 356       * @see storeSessionData()
 357       */
 358  	function fetchSessionData()    {
 359          // Gets SesData if any
 360          if ($this->id)    {
 361              $dbres = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'fe_session_data', 'hash='.$GLOBALS['TYPO3_DB']->fullQuoteStr($this->id, 'fe_session_data'));
 362              if ($sesDataRow = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($dbres))    {
 363                  $this->sesData = unserialize($sesDataRow['content']);
 364              }
 365          }
 366              // delete old data:
 367          if ((rand()%100) <= 1) {        // a possibility of 1 % for garbage collection.
 368              $GLOBALS['TYPO3_DB']->exec_DELETEquery('fe_session_data', 'tstamp < '.intval(time()-3600*24));        // all data older than 24 hours are deleted.
 369          }
 370      }
 371  
 372      /**
 373       * Will write UC and session data.
 374       * If the flag $this->userData_change has been set, the function ->writeUC is called (which will save persistent user session data)
 375       * If the flag $this->sesData_change has been set, the fe_session_data table is updated with the content of $this->sesData (deleting any old record, inserting new)
 376       *
 377       * @return    void
 378       * @see fetchSessionData(), getKey(), setKey()
 379       */
 380  	function storeSessionData()    {
 381              // Saves UC and SesData if changed.
 382          if ($this->userData_change)    {
 383              $this->writeUC('');
 384          }
 385          if ($this->sesData_change)    {
 386              if ($this->id)    {
 387                  $insertFields = array (
 388                      'hash' => $this->id,
 389                      'content' => serialize($this->sesData),
 390                      'tstamp' => time()
 391                  );
 392                  $GLOBALS['TYPO3_DB']->exec_DELETEquery('fe_session_data', 'hash='.$GLOBALS['TYPO3_DB']->fullQuoteStr($this->id, 'fe_session_data'));
 393                  $GLOBALS['TYPO3_DB']->exec_INSERTquery('fe_session_data', $insertFields);
 394              }
 395          }
 396      }
 397  
 398      /**
 399       * Returns session data for the fe_user; Either persistent data following the fe_users uid/profile (requires login) or current-session based (not available when browse is closed, but does not require login)
 400       *
 401       * @param    string        Session data type; Either "user" (persistent, bound to fe_users profile) or "ses" (temporary, bound to current session cookie)
 402       * @param    string        Key from the data array to return; The session data (in either case) is an array ($this->uc / $this->sesData) and this value determines which key to return the value for.
 403       * @return    mixed        Returns whatever value there was in the array for the key, $key
 404       * @see setKey()
 405       */
 406  	function getKey($type,$key) {
 407          if ($key)    {
 408              switch($type)    {
 409                  case 'user':
 410                      return $this->uc[$key];
 411                  break;
 412                  case 'ses':
 413                      return $this->sesData[$key];
 414                  break;
 415              }
 416          }
 417      }
 418  
 419      /**
 420       * Saves session data, either persistent or bound to current session cookie. Please see getKey() for more details.
 421       * When a value is set the flags $this->userData_change or $this->sesData_change will be set so that the final call to ->storeSessionData() will know if a change has occurred and needs to be saved to the database.
 422       * Notice: The key "recs" is already used by the function record_registration() which stores table/uid=value pairs in that key. This is used for the shopping basket among other things.
 423       * Notice: Simply calling this function will not save the data to the database! The actual saving is done in storeSessionData() which is called as some of the last things in index_ts.php. So if you exit before this point, nothing gets saved of course! And the solution is to call $GLOBALS['TSFE']->storeSessionData(); before you exit.
 424       *
 425       * @param    string        Session data type; Either "user" (persistent, bound to fe_users profile) or "ses" (temporary, bound to current session cookie)
 426       * @param    string        Key from the data array to store incoming data in; The session data (in either case) is an array ($this->uc / $this->sesData) and this value determines in which key the $data value will be stored.
 427       * @param    mixed        The data value to store in $key
 428       * @return    void
 429       * @see setKey(), storeSessionData(), record_registration()
 430       */
 431  	function setKey($type,$key,$data)    {
 432          if ($key)    {
 433              switch($type)    {
 434                  case 'user':
 435                      if ($this->user['uid'])    {
 436                          $this->uc[$key]=$data;
 437                          $this->userData_change=1;
 438                      }
 439                  break;
 440                  case 'ses':
 441                      $this->sesData[$key]=$data;
 442                      $this->sesData_change=1;
 443                  break;
 444              }
 445          }
 446      }
 447  
 448      /**
 449       * Registration of records/"shopping basket" in session data
 450       * This will take the input array, $recs, and merge into the current "recs" array found in the session data.
 451       * If a change in the recs storage happens (which it probably does) the function setKey() is called in order to store the array again.
 452       *
 453       * @param    array        The data array to merge into/override the current recs values. The $recs array is constructed as [table]][uid] = scalar-value (eg. string/integer).
 454       * @param    integer        The maximum size of stored session data. If zero, no limit is applied and even confirmation of cookie session is discarded.
 455       * @return    void
 456       */
 457  	function record_registration($recs,$maxSizeOfSessionData=0)    {
 458  
 459              // Storing value ONLY if there is a confirmed cookie set (->cookieID), otherwise a shellscript could easily be spamming the fe_sessions table with bogus content and thus bloat the database
 460          if (!$maxSizeOfSessionData || $this->cookieId===$this->id)    {
 461              if ($recs['clear_all'])    {
 462                  $this->setKey('ses','recs','');
 463              }
 464              $change=0;
 465              $recs_array=$this->getKey('ses','recs');
 466              reset($recs);
 467              while(list($table,$data)=each($recs))    {
 468                  if (is_array($data))    {
 469                      reset($data);
 470                      while(list($rec_id,$value)=each($data))    {
 471                          if ($value != $recs_array[$table][$rec_id])    {
 472                              $recs_array[$table][$rec_id] = $value;
 473                              $change=1;
 474                          }
 475                      }
 476                  }
 477              }
 478              if ($change && (!$maxSizeOfSessionData || strlen(serialize($recs_array))<$maxSizeOfSessionData))    {
 479                  $this->setKey('ses','recs',$recs_array);
 480              }
 481          }
 482      }
 483  }
 484  
 485  
 486  if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['tslib/class.tslib_feuserauth.php'])    {
 487      include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['tslib/class.tslib_feuserauth.php']);
 488  }
 489  ?>


Généré le : Sun Nov 25 17:13:16 2007 par Balluche grâce à PHPXref 0.7
  Clicky Web Analytics