[API][CONF][!!!] Make the name of cookies configurable
authorChristian Jul Jensen <julle@typo3.org>
Wed, 25 May 2011 14:11:00 +0000 (16:11 +0200)
committerChristian Jul Jensen <julle@typo3.org>
Wed, 6 Jul 2011 11:23:57 +0000 (13:23 +0200)
To avoid different scenarios with clashing cookies on same-domain
sites, make the name of cookies used for BE and FE login
configurable.
To achieve this:
* add configuration options
* add setting of name in relevant classes with proper fallback
* change all uses of the names to API calls
* change time tracking start algorithm to detect BE user login

Change-Id: I8078bd284cdf5d1413ddce8bc004e25f855ba6c5
Resolves: #23872
Reviewed-on: http://review.typo3.org/2373
Reviewed-by: Philipp Gampe
Tested-by: Philipp Gampe
Reviewed-by: Stefan Neufeind
Reviewed-by: Christian Jul Jensen
Tested-by: Christian Jul Jensen
13 files changed:
NEWS.txt
t3lib/class.t3lib_beuserauth.php
t3lib/class.t3lib_userauth.php
t3lib/class.t3lib_userauthgroup.php
t3lib/config_default.php
typo3/classes/class.ajaxlogin.php
typo3/index.php
typo3/sysext/beuser/class.tx_beuser_switchbackuser.php
typo3/sysext/beuser/mod/index.php
typo3/sysext/cms/tslib/class.tslib_adminpanel.php
typo3/sysext/cms/tslib/class.tslib_fe.php
typo3/sysext/cms/tslib/class.tslib_feuserauth.php
typo3/sysext/cms/tslib/index_ts.php

index fff8b3b..fc5c083 100644 (file)
--- a/NEWS.txt
+++ b/NEWS.txt
@@ -70,6 +70,15 @@ file is not actually deleted, but stored in the _recycler_ folder.
 This new task now deletes all files insider _recycler_ folders that have been
 moved there for longer than a given number of days.
 
+* New option to customize the cookie names used by TYPO3
+
+It is now possible to customize the cookie names used by TYPO3 to avoid clashes
+when running more installations on the same domain. The names used can be con-
+figured with:
+$TYPO3_CONF_VARS['FE']['cookieName'] and
+$TYPO3_CONF_VARS['BE']['cookieName'].
+
+
 -------------------------------------------------------------------------------
 Backend
 -------------------------------------------------------------------------------
index 08d2d76..11cbc47 100644 (file)
@@ -66,7 +66,6 @@
  */
 class t3lib_beUserAuth extends t3lib_userAuthGroup {
        var $session_table = 'be_sessions'; // Table to use for session data.
-       var $name = 'be_typo_user'; // Session/Cookie name
 
        var $user_table = 'be_users'; // Table in database with userdata
        var $username_column = 'username'; // Column for login-name
@@ -129,6 +128,28 @@ class t3lib_beUserAuth extends t3lib_userAuthGroup {
                'resizeTextareas_Flexible' => 1,
        );
 
+       /**
+        * Constructor
+        */
+       public function __construct() {
+               $this->name = self::getCookieName();
+               $this->loginType = 'BE';
+       }
+
+       /**
+        * @static
+        * @return string
+        *
+        * returns the configured cookie name
+        */
+       public static function getCookieName() {
+               $configuredCookieName = trim($GLOBALS['TYPO3_CONF_VARS']['BE']['cookieName']);
+               if (empty($configuredCookieName)) {
+                       $configuredCookieName = 'be_typo_user';
+               }
+               return $configuredCookieName;
+       }
+
 
        /**
         * Sets the security level for the Backend login
@@ -388,4 +409,4 @@ if (defined('TYPO3_MODE') && isset($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLA
        include_once($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_beuserauth.php']);
 }
 
-?>
\ No newline at end of file
+?>
index dca858d..4fa3301 100644 (file)
@@ -100,7 +100,7 @@ require_once(t3lib_extMgm::extPath('sv') . 'class.tx_sv_authbase.php');
  * @package TYPO3
  * @subpackage t3lib
  */
-class t3lib_userAuth {
+abstract class t3lib_userAuth {
        var $global_database = ''; // Which global database to connect to
        var $session_table = ''; // Table to use for session data.
        var $name = ''; // Session/Cookie name
@@ -179,7 +179,9 @@ class t3lib_userAuth {
                global $TYPO3_CONF_VARS;
 
                        // backend or frontend login - used for auth services
-               $this->loginType = ($this->name == 'fe_typo_user') ? 'FE' : 'BE';
+               if (empty($this->loginType)) {
+                       throw new t3lib_exception('No loginType defined, should be set explicitly by subclass');
+               }
 
                        // set level to normal if not already set
                if (!$this->security_level) {
index b6c81ee..b81dffc 100644 (file)
  * @package TYPO3
  * @subpackage t3lib
  */
-class t3lib_userAuthGroup extends t3lib_userAuth {
+abstract class t3lib_userAuthGroup extends t3lib_userAuth {
        var $usergroup_column = 'usergroup'; // Should be set to the usergroup-column (id-list) in the user-record
        var $usergroup_table = 'be_groups'; // The name of the group-table
 
index 53d7fbe..dd3e5a7 100644 (file)
@@ -201,6 +201,7 @@ $TYPO3_CONF_VARS = array(
                'enabledBeUserIPLock' => TRUE,                  // Boolean: If set, the User/Group TSconfig option 'option.lockToIP' is enabled.
                'lockHashKeyWords' => 'useragent',              // Keyword list (Strings comma separated). Currently only "useragent"; If set, then the BE user session is locked to the value of HTTP_USER_AGENT. This lowers the risk of session hi-jacking. However in some cases (like during development) you might need to switch the user agent while keeping the session. In this case you can disable that feature (e.g. with a blank string).
                'cookieDomain' => '',                                   // Same as <a href="#SYS-cookieDomain">$TYPO3_CONF_VARS['SYS']['cookieDomain']</a> but only for BE cookies. If empty, $TYPO3_CONF_VARS['SYS']['cookieDomain'] value will be used.
+               'cookieName' => 'be_typo_user',         // String: Set the name for the cookie used for the back-end user session
                'loginSecurityLevel' => '',                             // String: Keywords that determines the security level of login to the backend. "normal" means the password from the login form is sent in clear-text, "challenged" means the password is not sent but hashed with some other values, "superchallenged" (default) means the password is first hashed before being hashed with the challenge values again (means the password is stored as a hashed string in the database also), "rsa" uses RSA password encryption (only if the rsaauth extension is installed). DO NOT CHANGE this value manually; without an alternative authentication service it will only prevent logins in TYPO3 since the "superchallenged" method is hardcoded in the default authentication system.
                'showRefreshLoginPopup' => FALSE,               // Boolean: If set, the Ajax relogin will show a real popup window for relogin after the count down. Some auth services need this as they add custom validation to the login form. If it's not set, the Ajax relogin will show an inline relogin window.
                'adminOnly' => 0,                                               // <p>Integer (-1, 0, 1, 2)</p><dl><dt>-1</dt><dd>total shutdown for maintenance purposes</dd><dt>0</dt><dd>normal operation, everyone can login (default)</dd><dt>1</dt><dd>only admins can login</dd><dt>2</dt><dd>only admins and regular CLI users can login</dd></dl>
@@ -541,6 +542,7 @@ $TYPO3_CONF_VARS = array(
                'permalogin' => 0,                                              // <p>Integer:</p><dl><dt>-1</dt><dd>Permanent login for FE users disabled.</dd><dt>0</dt><dd>By default permalogin is disabled for FE users but can be enabled by a form control in the login form.</dd><dt>1</dt><dd>Permanent login is by default enabled but can be disabled by a form control in the login form.</dd><dt>2</dt><dd>Permanent login is forced to be enabled.// In any case, permanent login is only possible if <a href="#FE-lifetime">[FE][lifetime]</a> lifetime is > 0.</dd></dl>
                '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.
                'cookieDomain' => '',                                   // Same as <a href="#SYS-cookieDomain">$TYPO3_CONF_VARS['SYS']['cookieDomain']</a> but only for FE cookies. If empty, $TYPO3_CONF_VARS['SYS']['cookieDomain'] value will be used.
+               'cookieName' => 'fe_typo_user',         // String: Set the name for the cookie used for the front-end user session
                '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' => '',                    // String (textarea). Enter lines of default frontend user/group TSconfig.
                'defaultTypoScript_constants' => '',    // String (textarea). Enter lines of default TypoScript, constants-field.
index ec86bdc..1c32387 100644 (file)
@@ -78,7 +78,7 @@ class AjaxLogin {
                        && isset($loginFormData['uname'])
                        && isset($loginFormData['uident'])
                        && isset($loginFormData['chalvalue'])
-                       && ((string)$_COOKIE['be_typo_user'] !== (string)$GLOBALS['BE_USER']->id);
+                       && ((string)$_COOKIE[t3lib_beUserAuth::getCookieName()] !== (string)$GLOBALS['BE_USER']->id);
        }
 
        /**
index 9281a7e..55b0d77 100644 (file)
@@ -361,7 +361,7 @@ class SC_index {
                if ($GLOBALS['BE_USER']->user['uid'] && ($this->commandLI || $this->loginRefresh || !$this->interfaceSelector)) {
 
                                // If no cookie has been set previously we tell people that this is a problem. This assumes that a cookie-setting script (like this one) has been hit at least once prior to this instance.
-                       if (!$_COOKIE[$GLOBALS['BE_USER']->name]) {
+                       if (!$_COOKIE[t3lib_beUserAuth::getCookieName()]) {
                                if ($this->commandLI=='setCookie') {
                                                // we tried it a second time but still no cookie
                                                // 26/4 2005: This does not work anymore, because the saving of challenge values in $_SESSION means the system will act as if the password was wrong.
index bb495dc..00e95f6 100644 (file)
@@ -33,7 +33,7 @@ class tx_beuser_switchbackuser {
                                'ses_userid' => $that->user['ses_backuserid'],
                                'ses_backuserid' => 0
                                );
-                       $GLOBALS['TYPO3_DB']->exec_UPDATEquery('be_sessions', 'ses_id='.$GLOBALS['TYPO3_DB']->fullQuoteStr($GLOBALS['BE_USER']->id, 'be_sessions').' AND ses_name=\'be_typo_user\' AND ses_userid='.intval($GLOBALS['BE_USER']->user['uid']),$updateData);
+                       $GLOBALS['TYPO3_DB']->exec_UPDATEquery('be_sessions', 'ses_id=' . $GLOBALS['TYPO3_DB']->fullQuoteStr($GLOBALS['BE_USER']->id, 'be_sessions') . ' AND ses_name=' . $GLOBALS['TYPO3_DB']->fullQuoteStr(t3lib_beUserAuth::getCookieName(), 'be_sessions') . ' AND ses_userid=' . intval($GLOBALS['BE_USER']->user['uid']), $updateData);
 
                        $redirectUrl = $GLOBALS['BACK_PATH'] . 'index.php' . ($GLOBALS['TYPO3_CONF_VARS']['BE']['interfaces'] ? '' : '?commandLI=1');
                        t3lib_utility_Http::redirect($redirectUrl);
index e67e3e7..2caf1ed 100755 (executable)
@@ -1551,7 +1551,7 @@ class SC_mod_tools_be_user_index {
                        if (t3lib_div::_GP('switchBackUser'))   {
                                $updateData['ses_backuserid'] = intval($GLOBALS['BE_USER']->user['uid']);
                        }
-                       $GLOBALS['TYPO3_DB']->exec_UPDATEquery('be_sessions', 'ses_id='.$GLOBALS['TYPO3_DB']->fullQuoteStr($GLOBALS['BE_USER']->id, 'be_sessions').' AND ses_name=\'be_typo_user\' AND ses_userid='.intval($GLOBALS['BE_USER']->user['uid']),$updateData);
+                       $GLOBALS['TYPO3_DB']->exec_UPDATEquery('be_sessions', 'ses_id=' . $GLOBALS['TYPO3_DB']->fullQuoteStr($GLOBALS['BE_USER']->id, 'be_sessions') . ' AND ses_name=' . $GLOBALS['TYPO3_DB']->fullQuoteStr(t3lib_beUserAuth::getCookieName(), 'be_sessions') . ' AND ses_userid=' . intval($GLOBALS['BE_USER']->user['uid']), $updateData);
 
                        $redirectUrl = $GLOBALS['BACK_PATH'] . 'index.php' . ($GLOBALS['TYPO3_CONF_VARS']['BE']['interfaces'] ? '' : '?commandLI=1');
                        t3lib_utility_Http::redirect($redirectUrl);
index a1a3738..bb24f99 100644 (file)
@@ -75,7 +75,7 @@ class tslib_AdminPanel {
        public function initialize() {
                $this->saveConfigOptions();
 
-                               // Setting some values based on the admin panel
+                       // Setting some values based on the admin panel
                $GLOBALS['TSFE']->forceTemplateParsing = $this->extGetFeAdminValue('tsdebug', 'forceTemplateParsing');
                $GLOBALS['TSFE']->displayEditIcons = $this->extGetFeAdminValue('edit', 'displayIcons');
                $GLOBALS['TSFE']->displayFieldEditIcons = $this->extGetFeAdminValue('edit', 'displayFieldIcons');
@@ -832,4 +832,4 @@ if (defined('TYPO3_MODE') && isset($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLA
        include_once($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['typo3/sysext/cms/tslib/class.tslib_adminpanel.php']);
 }
 
-?>
\ No newline at end of file
+?>
index 46891d6..6f0c968 100644 (file)
                if (t3lib_div::_GP('FE_SESSION_KEY'))   {
                        $fe_sParts = explode('-',t3lib_div::_GP('FE_SESSION_KEY'));
                        if (!strcmp(md5($fe_sParts[0].'/'.$this->TYPO3_CONF_VARS['SYS']['encryptionKey']), $fe_sParts[1]))      {       // If the session key hash check is OK:
-                               $_COOKIE[$this->fe_user->name] = $fe_sParts[0];
+                               $_COOKIE[tslib_feUserAuth::getCookieName()] = $fe_sParts[0];
                                $this->fe_user->forceSetCookie = 1;
                        }
                }
         */
        function ADMCMD_preview_postInit(array $previewConfig){
                        // Clear cookies:
-               unset($_COOKIE['be_typo_user']);
+               unset($_COOKIE[t3lib_beUserAuth::getCookieName()]);
                $this->ADMCMD_preview_BEUSER_uid = $previewConfig['BEUSER_uid'];
        }
 
index f831fa4..7c9fd08 100644 (file)
@@ -76,7 +76,6 @@
  * @subpackage tslib
  */
 class tslib_feUserAuth extends t3lib_userAuth {
-
        var $formfield_permanent = 'permalogin';        // formfield with 0 or 1 // 1 = permanent login enabled // 0 = session is valid for a browser session only
 
        protected $sessionDataLifetime = 86400;         // Lifetime of session data in seconds.
@@ -111,8 +110,9 @@ class tslib_feUserAuth extends t3lib_userAuth {
         */
        public function __construct() {
                $this->session_table = 'fe_sessions';
-               $this->name = 'fe_typo_user';
+               $this->name = self::getCookieName();
                $this->get_name = 'ftu';
+               $this->loginType = 'FE';
 
                $this->user_table = 'fe_users';
                $this->username_column = 'username';
@@ -139,6 +139,22 @@ class tslib_feUserAuth extends t3lib_userAuth {
                $this->getMethodEnabled = TRUE;
        }
 
+
+       /**
+        * @static
+        * @return string
+        *
+        * returns the configured cookie name
+        */
+       public static function getCookieName() {
+               $configuredCookieName = trim($GLOBALS['TYPO3_CONF_VARS']['FE']['cookieName']);
+               if (empty($configuredCookieName)) {
+                       $configuredCookieName = 'fe_typo_user';
+               }
+               return $configuredCookieName;
+       }
+
+
        /**
         * Starts a user session
         *
index 4379064..642fc24 100644 (file)
@@ -94,7 +94,7 @@ ob_start();
 // *********************
 // Timetracking started
 // *********************
-if ($_COOKIE['be_typo_user']) {
+if ($_SESSION['TYPO3-TT-start']) {
        require_once(PATH_t3lib.'class.t3lib_timetrack.php');
        $TT = new t3lib_timeTrack;
 } else {
@@ -129,6 +129,14 @@ if (!defined('PATH_tslib')) {
 }
 
 
+// Restart time tracking if BE login exists
+if (!$_SESSION['TYPO3-TT-start'] && $_COOKIE[t3lib_beUserAuth::getCookieName()]) {
+       $_SESSION['TYPO3-TT-start'] = TRUE;
+
+       $TT = new t3lib_timeTrack;
+       $TT->start();
+       $TT->push('', 'Script start (late)');
+}
 
 
 // *********************
@@ -273,7 +281,7 @@ if (is_array($TYPO3_CONF_VARS['SC_OPTIONS']['tslib/index_ts.php']['preBeUser']))
 // *********
 $BE_USER = NULL;
 /** @var $BE_USER t3lib_tsfeBeUserAuth */
-if ($_COOKIE['be_typo_user']) {                // If the backend cookie is set, we proceed and checks if a backend user is logged in.
+if ($_COOKIE[t3lib_beUserAuth::getCookieName()]) {             // If the backend cookie is set, we proceed and checks if a backend user is logged in.
        $TYPO3_MISC['microtime_BE_USER_start'] = microtime(TRUE);
        $TT->push('Back End user initialized','');
 
@@ -291,6 +299,7 @@ if ($_COOKIE['be_typo_user']) {             // If the backend cookie is set, we proceed and
                if (!$BE_USER->checkLockToIP() || !$BE_USER->checkBackendAccessSettingsFromInitPhp() || !$BE_USER->user['uid']) {
                        $BE_USER = NULL;
                        $TSFE->beUserLogin=0;
+                       $_SESSION['TYPO3-TT-start'] = FALSE;
                }
        $TT->pull();
        $TYPO3_MISC['microtime_BE_USER_end'] = microtime(TRUE);
@@ -308,6 +317,7 @@ if ($_COOKIE['be_typo_user']) {             // If the backend cookie is set, we proceed and
        } else {
                $BE_USER = NULL;
                $TSFE->beUserLogin = 0;
+               $_SESSION['TYPO3-TT-start'] = FALSE;
        }
 }