Made it possible to give FE users the choice to "stay logged in". See new install...
authorIngmar Schlecht <ingmar.schlecht@typo3.org>
Tue, 29 Aug 2006 20:42:04 +0000 (20:42 +0000)
committerIngmar Schlecht <ingmar.schlecht@typo3.org>
Tue, 29 Aug 2006 20:42:04 +0000 (20:42 +0000)
git-svn-id: https://svn.typo3.org/TYPO3v4/Core/trunk@1697 709f56b5-9817-0410-a4d7-c38de5d9e867

ChangeLog
t3lib/class.t3lib_userauth.php
t3lib/config_default.php
typo3/sysext/cms/ext_tables.sql
typo3/sysext/cms/tslib/class.tslib_feuserauth.php

index e87f7ff..1b2d103 100755 (executable)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2006-08-29  Ingmar Schlecht  <ingmar@typo3.org>
+
+       * Made it possible to give FE users the choice to "stay logged in". See new install tool option $TYPO3_CONF_VARS[FE][permalogin]. You'll need the latest newloginbox version from the typo3xdev Subversion repository.
+
 2006-08-29  Dmitry Dulepov  <typo3@accio.lv>
 
        * Performance enhancement in t3lib/class.t3lib_tstemplate.php: use UPDATE/INSERT_on_update_fail instead of DELETE/INSERT for cache_pagesection.
index 1dae297..2a3755e 100755 (executable)
@@ -243,6 +243,18 @@ class t3lib_userAuth {
                        // Make certain that NO user is set initially
                $this->user = '';
 
+                       // Check to see if anyone has submitted login-information and if so register the user with the session. $this->user[uid] may be used to write log...
+               $this->checkAuthentication();
+
+                       // Make certain that NO user is set initially. ->check_authentication may have set a session-record which will provide us with a user record in the next section:
+               unset($this->user);
+
+                       // re-read user session
+               $this->user = $this->fetchUserSession();
+
+               if ($this->writeDevLog AND is_array($this->user))       t3lib_div::devLog('User session finally read: '.t3lib_div::arrayToLogString($this->user, array($this->userid_column,$this->username_column)), 't3lib_userAuth', -1);
+               if ($this->writeDevLog AND !is_array($this->user)) t3lib_div::devLog('No user session found.', 't3lib_userAuth', 2);
+
                        // Setting cookies
                if ($TYPO3_CONF_VARS['SYS']['cookieDomain'])    {
                        if ($TYPO3_CONF_VARS['SYS']['cookieDomain']{0} == '/')  {
@@ -258,7 +270,7 @@ class t3lib_userAuth {
                }
 
                        // If new session and the cookie is a sessioncookie, we need to set it only once!
-               if (($this->newSessionID || $this->forceSetCookie) && $this->lifetime==0 )      {
+               if ($this->isSetSessionCookie())        {
                        if (!$this->dontSetCookie)      {
                                if ($cookieDomain)      {
                                        SetCookie($this->name, $id, 0, '/', $cookieDomain);
@@ -270,7 +282,7 @@ class t3lib_userAuth {
                }
 
                        // If it is NOT a session-cookie, we need to refresh it.
-               if ($this->lifetime > 0)        {
+               if ($this->isRefreshTimeBasedCookie())  {
                        if (!$this->dontSetCookie)      {
                                if ($cookieDomain)      {
                                        SetCookie($this->name, $id, time()+$this->lifetime, '/', $cookieDomain);
@@ -281,18 +293,6 @@ class t3lib_userAuth {
                        }
                }
 
-                       // Check to see if anyone has submitted login-information and if so register the user with the session. $this->user[uid] may be used to write log...
-               $this->checkAuthentication();
-
-                       // Make certain that NO user is set initially. ->check_authentication may have set a session-record which will provide us with a user record in the next section:
-               unset($this->user);
-
-                       // re-read user session
-               $this->user = $this->fetchUserSession();
-
-               if ($this->writeDevLog AND is_array($this->user))       t3lib_div::devLog('User session finally read: '.t3lib_div::arrayToLogString($this->user, array($this->userid_column,$this->username_column)), 't3lib_userAuth', -1);
-               if ($this->writeDevLog AND !is_array($this->user)) t3lib_div::devLog('No user session found.', 't3lib_userAuth', 2);
-
                        // Hook for alternative ways of filling the $this->user array (is used by the "timtaw" extension)
                if (is_array($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_userauth.php']['postUserLookUp']))       {
                        foreach ($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_userauth.php']['postUserLookUp'] as $funcName)       {
@@ -326,6 +326,26 @@ class t3lib_userAuth {
        }
 
        /**
+        * Determins whether a session cookie needs to be set (lifetime=0)
+        *
+        * @return      boolean
+        * @internal
+        */
+       function isSetSessionCookie() {
+               return ($this->newSessionID || $this->forceSetCookie) && $this->lifetime==0;
+       }
+
+       /**
+        * Determins whether a non-session cookie needs to be set (lifetime>0)
+        *
+        * @return      boolean
+        * @internal
+        */
+       function isRefreshTimeBasedCookie() {
+               return $this->lifetime > 0;
+       }
+
+       /**
         * Checks if a submission of username and password is present or use other authentication by auth services
         *
         * @return      void
@@ -583,14 +603,7 @@ class t3lib_userAuth {
                                );
 
                        // re-create session entry
-               $insertFields = array(
-                       'ses_id' => $this->id,
-                       'ses_name' => $this->name,
-                       'ses_iplock' => $tempuser['disableIPlock'] ? '[DISABLED]' : $this->ipLockClause_remoteIPNumber($this->lockIP),
-                       'ses_hashlock' => $this->hashLockClause_getHashInt(),
-                       'ses_userid' => $tempuser[$this->userid_column],
-                       'ses_tstamp' => $GLOBALS['EXEC_TIME']
-               );
+               $insertFields = $this->getNewSessionRecord($tempuser);
                $GLOBALS['TYPO3_DB']->exec_INSERTquery($this->session_table, $insertFields);
 
                        // Updating lastLogin_column carrying information about last login.
@@ -604,6 +617,23 @@ class t3lib_userAuth {
        }
 
        /**
+        * Returns a new session record for the current user for insertion into the DB.
+        * This function is mainly there as a wrapper for inheriting classes to override it.
+        *
+        * @return      array           user session record
+        */
+       function getNewSessionRecord($tempuser) {
+               return array(
+                       'ses_id' => $this->id,
+                       'ses_name' => $this->name,
+                       'ses_iplock' => $tempuser['disableIPlock'] ? '[DISABLED]' : $this->ipLockClause_remoteIPNumber($this->lockIP),
+                       'ses_hashlock' => $this->hashLockClause_getHashInt(),
+                       'ses_userid' => $tempuser[$this->userid_column],
+                       'ses_tstamp' => $GLOBALS['EXEC_TIME']
+               );
+       }
+
+       /**
         * Read the user session from db.
         *
         * @return      array           user session data
index 506ea55..6df2ad1 100755 (executable)
@@ -192,6 +192,7 @@ $TYPO3_CONF_VARS = Array(
                'lockIP' => 2,                                                  // Integer (0-4). If >0, fe_users are locked to (a part of) their REMOTE_ADDR IP for their session. Enhances security but may throw off users that may change IP during their session (in which case you can lower it to 2 or 3). The integer indicates how many parts of the IP address to include in the check. Reducing to 1-3 means that only first, second or third part of the IP address is used. 4 is the FULL IP address and recommended. 0 (zero) disables checking of course.
                'loginSecurityLevel' => '',                             // See description for TYPO3_CONF_VARS[BE][loginSecurityLevel]. Default state for frontend is "normal". Alternative authentication services can implement higher levels if preferred.
                'lifetime' => 0,                                                // Integer, positive. If >0, the cookie of FE users will NOT be a session cookie (deleted when browser is shut down) but rather a cookie with a lifetime of the number of seconds this value indicates. Setting this value to 3600*24*7 will result in automatic login of FE users during a whole week.
+               'permalogin' => 2,                                              // Integer. -1: Permanent login for FE users disabled. 0: By default permalogin is disabled for FE users but can be enabled by a form control in the login form. 1: Permanent login is by default enabled but can be disabled by a form control in the login form. // 2: Permanent login is foced to be enabled.  // In any case, permanent login is only possible if TYPO3_CONF_VARS[FE][lifetime] lifetime is > 0.
                'maxSessionDataSize' => 10000,                  // Integer. Setting the maximum size (bytes) of frontend session data stored in the table fe_session_data. Set to zero (0) means no limit, but this is not recommended since it also disables a check that session data is stored only if a confirmed cookie is set.
                'lockHashKeyWords' => 'useragent',              // Keyword list (Strings commaseparated). Currently only "useragent"; If set, then the FE user session is locked to the value of HTTP_USER_AGENT. This lowers the risk of session hi-jacking. However some cases (like payment gateways) might have to use the session cookie and in this case you will have to disable that feature (eg. with a blank string).
                'defaultUserTSconfig' => '',                    // Enter lines of default frontend user/group TSconfig.
index 821b4bb..41e75ab 100755 (executable)
@@ -115,6 +115,7 @@ CREATE TABLE fe_sessions (
   ses_userid int(11) unsigned DEFAULT '0' NOT NULL,
   ses_tstamp int(11) unsigned DEFAULT '0' NOT NULL,
   ses_data blob NOT NULL,
+  ses_permanent tinyint(1) unsigned DEFAULT '0' NOT NULL,
   PRIMARY KEY (ses_id,ses_name)
 );
 
index eb5ddc9..e37b6aa 100644 (file)
@@ -97,6 +97,7 @@ class tslib_feUserAuth extends t3lib_userAuth {
        var $formfield_uident = 'pass';                         // formfield with password
        var $formfield_chalvalue = 'challenge';         // formfield with a unique value which is used to encrypt the password and username
        var $formfield_status = 'logintype';            // formfield with status: *'login', 'logout'
+       var $formfield_permanent = 'permalogin';        // formfield with 0 or 1 // 1 = permanent login enabled // 0 = session is valid for a browser session only
        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.
 
        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.
@@ -148,6 +149,70 @@ class tslib_feUserAuth extends t3lib_userAuth {
 
                parent::start();
        }
+       /**
+        * Returns a new session record for the current user for insertion into the DB.
+        *
+        * @return      array           user session record
+        */
+       function getNewSessionRecord($tempuser) {
+               $insertFields = parent::getNewSessionRecord($tempuser);
+               $insertFields['ses_permanent'] = $this->is_permanent;
+
+               return $insertFields;
+       }
+
+       /**
+        * Determins whether a session cookie needs to be set (lifetime=0)
+        *
+        * @return      boolean
+        * @internal
+        */
+       function isSetSessionCookie() {
+               $retVal = ($this->newSessionID || $this->forceSetCookie) && ($this->lifetime==0 || !$this->user['ses_permanent']);
+               return $retVal;
+       }
+
+       /**
+        * Determins whether a non-session cookie needs to be set (lifetime>0)
+        *
+        * @return      boolean
+        * @internal
+        */
+       function isRefreshTimeBasedCookie() {
+               return $this->lifetime > 0 && $this->user['ses_permanent'];
+       }
+
+       /**
+        * Returns an info array with Login/Logout data submitted by a form or params
+        *
+        * @return      array
+        * @see t3lib_userAuth::getLoginFormData()
+        */
+       function getLoginFormData() {
+               $loginData = parent::getLoginFormData();
+               if($GLOBALS['TYPO3_CONF_VARS']['FE']['permalogin'] == 0 || $GLOBALS['TYPO3_CONF_VARS']['FE']['permalogin'] == 1) {
+                       if ($this->getMethodEnabled)    {
+                               $isPermanent = t3lib_div::_GP($this->formfield_permanent);
+                       } else {
+                               $isPermanent = t3lib_div::_POST($this->formfield_permanent);
+                       }
+                       if(strlen($isPermanent) != 1) {
+                               $isPermanent = $GLOBALS['TYPO3_CONF_VARS']['FE']['permalogin'];
+                       } elseif(!$isPermanent) {
+                               $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
+                       }
+                       $isPermanent = $isPermanent?1:0;
+               } elseif($GLOBALS['TYPO3_CONF_VARS']['FE']['permalogin'] == 2) {
+                       $isPermanent = 1;
+               } else {
+                       $isPermanent = 0;
+               }
+               $loginData['permanent'] = $isPermanent;
+               $this->is_permanent = $isPermanent;
+
+               return $loginData;
+       }
 
        /**
         * Will select all fe_groups records that the current fe_user is member of - and which groups are also allowed in the current domain.