Fixed bug #14117: RuntimeException thrown within the exception handler when wrong...
[Packages/TYPO3.CMS.git] / t3lib / class.t3lib_beuserauth.php
index d9f58c1..4a693f1 100644 (file)
@@ -2,7 +2,7 @@
 /***************************************************************
 *  Copyright notice
 *
-*  (c) 1999-2004 Kasper Skaarhoj (kasperYYYY@typo3.com)
+*  (c) 1999-2009 Kasper Skaarhoj (kasperYYYY@typo3.com)
 *  All rights reserved
 *
 *  This script is part of the TYPO3 project. The TYPO3 project is
  *
  *
  *   76: class t3lib_beUserAuth extends t3lib_userAuthGroup
- *  151:     function trackBeUser($flag)
- *  169:     function checkLockToIP()
- *  189:     function backendCheckLogin()
- *  217:     function checkCLIuser()
- *  241:     function backendSetUC()
- *  277:     function overrideUC()
- *  287:     function resetUC()
- *  300:     function emailAtLogin()
- *  352:     function veriCode()
+ *  150:     function trackBeUser($flag)
+ *  168:     function checkLockToIP()
+ *  188:     function backendCheckLogin()
+ *  216:     function checkCLIuser()
+ *  240:     function backendSetUC()
+ *  278:     function overrideUC()
+ *  288:     function resetUC()
+ *  301:     function emailAtLogin()
+ *  353:     function veriCode()
  *
  * TOTAL FUNCTIONS: 9
  * (This index is automatically created/updated by the extension "extdeveval")
@@ -96,7 +96,6 @@ class t3lib_beUserAuth extends t3lib_userAuthGroup {
        var $formfield_uident = 'userident';            // formfield with password
        var $formfield_chalvalue = 'challenge';         // formfield with a unique value which is used to encrypt the password and username
        var $formfield_status = 'login_status';         // formfield with status: *'login', 'logout'
-       var $security_level = 'challenged';                             // 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 $writeStdLog = 1;                                   // Decides if the writelog() function is called at login and logout
        var $writeAttemptLog = 1;                               // If the writelog() functions is called if a login-attempt has be tried without success
@@ -105,7 +104,7 @@ class t3lib_beUserAuth extends t3lib_userAuthGroup {
 
        var $auth_timeout_field = 6000;                         // if > 0 : session-timeout in seconds. if false/<0 : no timeout. if string: The string is fieldname from the usertable where the timeout can be found.
        var $lifetime = 0;                              // 0 = Session-cookies. If session-cookies, the browser will stop session when the browser is closed. Else it keeps the session for $lifetime seconds.
-
+       var $challengeStoredInCookie = TRUE;
 
 
                // User Config:
@@ -119,14 +118,13 @@ class t3lib_beUserAuth extends t3lib_userAuthGroup {
                        moduleSessionID
                */
        var $uc_default = Array (
-//             'lang' => 'dk',         // this value will be transferred from $BE_USER->user[lang] if not set...
                'interfaceSetup' => '', // serialized content that is used to store interface pane and menu positions. Set by the logout.php-script
                'moduleData' => Array(),        // user-data for the modules
                'thumbnailsByDefault' => 0,
                'emailMeAtLogin' => 0,
                'condensedMode' => 0,
                'noMenuMode' => 0,
-               'startInTaskCenter' => 0,
+               'startModule' => 'help_aboutmodules',
                'hideSubmoduleIcons' => 0,
                'helpText' => 1,
                'titleLen' => 30,
@@ -134,25 +132,43 @@ class t3lib_beUserAuth extends t3lib_userAuthGroup {
                'edit_showFieldHelp' => 'icon',
                'edit_RTE' => '1',
                'edit_docModuleUpload' => '1',
+               'enableFlashUploader' => '1',
                'disableCMlayers' => 0,
                'navFrameWidth' => '',  // Default is 245 pixels
                'navFrameResizable' => 0,
+               'resizeTextareas' => 1,
+               'resizeTextareas_MaxHeight' => 300,
+               'resizeTextareas_Flexible' => 1,
        );
 
 
        /**
+        * Sets the security level for the Backend login
+        *
+        * @return      void
+        */
+       function start() {
+               $securityLevel = trim($GLOBALS['TYPO3_CONF_VARS']['BE']['loginSecurityLevel']);
+               $this->security_level = $securityLevel ? $securityLevel : 'superchallenged';
+
+               parent::start();
+       }
+
+       /**
         * If flag is set and the extensions 'beuser_tracking' is loaded, this will insert a table row with the REQUEST_URI of current script - thus tracking the scripts the backend users uses...
-        * This function works ONLY with the "beuser_tracking" extension and is depreciated since it does nothing useful.
+        * This function works ONLY with the "beuser_tracking" extension and is deprecated since it does nothing useful.
         *
         * @param       boolean         Activate insertion of the URL.
         * @return      void
-        * @access private
+        * @deprecated since TYPO3 3.6, this function will be removed in TYPO3 4.5.
         */
        function trackBeUser($flag)     {
+               t3lib_div::logDeprecatedFunction();
+
                if ($flag && t3lib_extMgm::isLoaded('beuser_tracking')) {
                        $insertFields = array(
                                'userid' => intval($this->user['uid']),
-                               'tstamp' => time(),
+                               'tstamp' => $GLOBALS['EXEC_TIME'],
                                'script' => t3lib_div::getIndpEnv('REQUEST_URI')
                        );
 
@@ -189,13 +205,12 @@ class t3lib_beUserAuth extends t3lib_userAuthGroup {
        function backendCheckLogin()    {
                if (!$this->user['uid'])        {
                        if (!defined('TYPO3_PROCEED_IF_NO_USER') || !TYPO3_PROCEED_IF_NO_USER)  {
-                               t3lib_BEfunc::typo3PrintError ('Login-error or session timed-out', 'No user logged in! Sorry, I can\'t proceed then!<br /><br />(You must have cookies enabled!)<br /><br />If your session has just timed-out, you may<br /><a href="'.t3lib_div::locationHeaderUrl(t3lib_div::getIndpEnv('TYPO3_SITE_URL').'typo3/index.php'.'" target="_top">click here to re-login</a>.',0));
-                               exit;
+                               t3lib_utility_Http::redirect($GLOBALS['BACK_PATH']);
                        }
                } else {        // ...and if that's the case, call these functions
                        $this->fetchGroupData();        //      The groups are fetched and ready for permission checking in this initialization.        Tables.php must be read before this because stuff like the modules has impact in this
                        if ($this->checkLockToIP())     {
-                               if (!$GLOBALS['TYPO3_CONF_VARS']['BE']['adminOnly'] || $this->isAdmin())        {
+                               if ($this->isUserAllowedToLogin()) {
                                        $this->backendSetUC();          // Setting the UC array. It's needed with fetchGroupData first, due to default/overriding of values.
                                        $this->emailAtLogin();          // email at login - if option set.
                                } else {
@@ -224,10 +239,10 @@ class t3lib_beUserAuth extends t3lib_userAuthGroup {
                                        if ($this->user['uid']) {
                                                if (!$this->isAdmin())  {
                                                        return TRUE;
-                                               } else die('ERROR: CLI backend user "'.$userName.'" was ADMIN which is not allowed!'.chr(10).chr(10));
-                                       } else die('ERROR: No backend user named "'.$userName.'" was found!'.chr(10).chr(10));
-                               } else die('ERROR: Module name, "'.$GLOBALS['MCONF']['name'].'", was not prefixed with "_CLI_"'.chr(10).chr(10));
-                       } else die('ERROR: Another user was already loaded which is impossible in CLI mode!'.chr(10).chr(10));
+                                               } else die('ERROR: CLI backend user "'.$userName.'" was ADMIN which is not allowed!'.LF.LF);
+                                       } else die('ERROR: No backend user named "'.$userName.'" was found! [Database: '.TYPO3_db.']'.LF.LF);
+                               } else die('ERROR: Module name, "'.$GLOBALS['MCONF']['name'].'", was not prefixed with "_CLI_"'.LF.LF);
+                       } else die('ERROR: Another user was already loaded which is impossible in CLI mode!'.LF.LF);
                }
        }
 
@@ -239,6 +254,7 @@ class t3lib_beUserAuth extends t3lib_userAuthGroup {
         * @internal
         */
        function backendSetUC() {
+               global $TYPO3_CONF_VARS;
 
                        // UC - user configuration is a serialized array inside the userobject
                $temp_theSavedUC=unserialize($this->user['uc']);                // if there is a saved uc we implement that instead of the default one.
@@ -247,7 +263,11 @@ class t3lib_beUserAuth extends t3lib_userAuthGroup {
                }
                        // Setting defaults if uc is empty
                if (!is_array($this->uc))       {
-                       $this->uc = array_merge($this->uc_default, (array)$TYPO3_CONF_VARS['BE']['defaultUC'], (array)$this->getTSConfigProp('setup.default')); // Candidate for t3lib_div::array_merge() if integer-keys will some day make trouble...
+                       $this->uc = array_merge(
+                               $this->uc_default,
+                               (array) $TYPO3_CONF_VARS['BE']['defaultUC'],
+                               t3lib_div::removeDotsFromTS((array) $this->getTSConfigProp('setup.default'))
+                       );
                        $this->overrideUC();
                        $U=1;
                }
@@ -261,6 +281,7 @@ class t3lib_beUserAuth extends t3lib_userAuthGroup {
                        $this->uc['lang']=$this->user['lang'];
                        $U=1;
                }
+
                        // Saving if updated.
                if ($U) {
                        $this->writeUC();       // Method from the t3lib_userauth class.
@@ -324,7 +345,7 @@ class t3lib_beUserAuth extends t3lib_userAuthGroup {
                                        $prefix='[AdminLoginWarning]';
                                }
                                if ($warn)      {
-                                       mail($GLOBALS['TYPO3_CONF_VARS']['BE']['warning_email_addr'],
+                                       t3lib_utility_Mail::mail($GLOBALS['TYPO3_CONF_VARS']['BE']['warning_email_addr'],
                                                $prefix.' '.$subject,
                                                $msg,
                                                $this->notifyHeader
@@ -334,7 +355,7 @@ class t3lib_beUserAuth extends t3lib_userAuthGroup {
 
                                // If An email should be sent to the current user, do that:
                        if ($this->uc['emailMeAtLogin'] && strstr($this->user['email'],'@'))    {
-                               mail($this->user['email'],
+                               t3lib_utility_Mail::mail($this->user['email'],
                                        $subject,
                                        $msg,
                                        $this->notifyHeader
@@ -344,13 +365,28 @@ class t3lib_beUserAuth extends t3lib_userAuthGroup {
        }
 
        /**
-        * VeriCode returns 10 first chars of a md5 hash of the session cookie AND the encryptionKey from TYPO3_CONF_VARS.
-        * This code is used as an alternative verification when the JavaScript interface executes cmd's to tce_db.php from eg. MSIE 5.0 because the proper referer is not passed with this browser...
+        * Determines whether a backend user is allowed to access the backend.
         *
-        * @return      string
+        * The conditions are:
+        *      + backend user is a regular user and adminOnly is not defined
+        *      + backend user is an admin user
+        *      + backend user is used in CLI context and adminOnly is explicitely set to "2"
+        * 
+        * @return      boolean         Whether a backend user is allowed to access the backend
         */
-       function veriCode()     {
-               return substr(md5($this->id.$GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey']),0,10);
+       protected function isUserAllowedToLogin() {
+               $isUserAllowedToLogin = FALSE;
+               $adminOnlyMode = $GLOBALS['TYPO3_CONF_VARS']['BE']['adminOnly'];
+
+                       // Backend user is allowed if adminOnly is not set or user is an admin:
+               if (!$adminOnlyMode || $this->isAdmin()) {
+                       $isUserAllowedToLogin = TRUE;
+                       // Backend user is allowed if adminOnly is set to 2 (CLI) and a CLI process is running:
+               } elseif ($adminOnlyMode == 2 && defined('TYPO3_cliMode') && TYPO3_cliMode) {
+                       $isUserAllowedToLogin = TRUE;
+               }
+
+               return $isUserAllowedToLogin;
        }
 }
 
@@ -360,4 +396,5 @@ class t3lib_beUserAuth extends t3lib_userAuthGroup {
 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_beuserauth.php'])       {
        include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_beuserauth.php']);
 }
-?>
+
+?>
\ No newline at end of file