Fixed bug #14117: RuntimeException thrown within the exception handler when wrong...
[Packages/TYPO3.CMS.git] / t3lib / class.t3lib_beuserauth.php
index 54eb5b2..4a693f1 100644 (file)
@@ -1,22 +1,22 @@
 <?php
 /***************************************************************
 *  Copyright notice
-*  
-*  (c) 1999-2004 Kasper Skaarhoj (kasper@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 
+*  This script is part of the TYPO3 project. The TYPO3 project is
 *  free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
-* 
+*
 *  The GNU General Public License can be found at
 *  http://www.gnu.org/copyleft/gpl.html.
-*  A copy is found in the textfile GPL.txt and important notices to the license 
+*  A copy is found in the textfile GPL.txt and important notices to the license
 *  from the author is found in LICENSE.txt distributed with these scripts.
 *
-* 
+*
 *  This script is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *
 *  This copyright notice MUST APPEAR in all copies of the script!
 ***************************************************************/
-/** 
+/**
  * Contains class for TYPO3 backend user authentication
  *
  * $Id$
  * Revised for TYPO3 3.6 July/2003 by Kasper Skaarhoj
  *
- * @author     Kasper Skaarhoj <kasper@typo3.com>
+ * @author     Kasper Skaarhoj <kasperYYYY@typo3.com>
  * @internal
  */
 /**
  *
  *
  *
- *   75: class t3lib_beUserAuth extends t3lib_userAuthGroup 
- *  151:     function trackBeUser($flag)       
- *  169:     function checkLockToIP()  
- *  189:     function backendCheckLogin()      
- *  219:     function backendSetUC()   
- *  254:     function overrideUC()     
- *  264:     function resetUC()        
- *  277:     function emailAtLogin()   
- *  329:     function veriCode()       
+ *   76: class t3lib_beUserAuth extends t3lib_userAuthGroup
+ *  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: 8
+ * TOTAL FUNCTIONS: 9
  * (This index is automatically created/updated by the extension "extdeveval")
  *
  */
 
+
 
 
 
@@ -68,7 +69,7 @@
  * t3lib_userauthgroup contains most of the functions used for checking permissions, authenticating users, setting up the user etc. This class is most interesting in terms of an API for user from outside.
  * This class contains the configuration of the database fields used plus some functions for the authentication process of backend users.
  *
- * @author     Kasper Skaarhoj <kasper@typo3.com>
+ * @author     Kasper Skaarhoj <kasperYYYY@typo3.com>
  * @package TYPO3
  * @subpackage t3lib
  */
@@ -82,7 +83,7 @@ class t3lib_beUserAuth extends t3lib_userAuthGroup {
        var $userid_column = 'uid';                                     // Column for user-id
        var $lastLogin_column = 'lastlogin';
        var $notifyHeader = 'From: TYPO3 Login notify <no_reply@no_reply.no_reply>';
-       
+
        var $enablecolumns = Array (
                'rootLevel' => 1,
                'deleted' => 'deleted',
@@ -90,43 +91,40 @@ class t3lib_beUserAuth extends t3lib_userAuthGroup {
                'starttime' => 'starttime',
                'endtime' => 'endtime'
        );
-       
+
        var $formfield_uname = 'username';                      // formfield with login-name
        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
-       
+
        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.
-       
+
        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:
        var $uc;
 
                // User Config Default values:
+               // The array may contain other fields for configuration. For this, see "setup" extension and "TSConfig" document (User TSconfig, "setup.[xxx]....")
                /*
                        Reserved keys for other storage of session data:
-                       moduleData              
+                       moduleData
                        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,
-               'localFrameEdit' => 0,
-               'dontEditInPageModule' => 0,
+               'startModule' => 'help_aboutmodules',
                'hideSubmoduleIcons' => 0,
                'helpText' => 1,
                'titleLen' => 30,
@@ -134,28 +132,46 @@ 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')
                        );
-                       
+
                        $GLOBALS['TYPO3_DB']->exec_INSERTquery('sys_trackbeuser', $insertFields);
                }
        }
@@ -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','No user logged in! Sorry, I can\'t proceed then!<br /><br />(You must have cookies enabled!)',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 
+                       $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 {
@@ -210,6 +225,28 @@ class t3lib_beUserAuth extends t3lib_userAuthGroup {
        }
 
        /**
+        * If the backend script is in CLI mode, it will try to load a backend user named by the CLI module name (in lowercase)
+        *
+        * @return      boolean         Returns true if a CLI user was loaded, otherwise false!
+        */
+       function checkCLIuser() {
+                       // First, check if cliMode is enabled:
+               if (defined('TYPO3_cliMode') && TYPO3_cliMode)  {
+                       if (!$this->user['uid'])        {
+                               if (substr($GLOBALS['MCONF']['name'],0,5)=='_CLI_')     {
+                                       $userName = strtolower($GLOBALS['MCONF']['name']);
+                                       $this->setBeUserByName($userName);
+                                       if ($this->user['uid']) {
+                                               if (!$this->isAdmin())  {
+                                                       return TRUE;
+                                               } 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);
+               }
+       }
+
+       /**
         * Initialize the internal ->uc array for the backend user
         * Will make the overrides if necessary, and write the UC back to the be_users record if changes has happend
         *
@@ -217,6 +254,8 @@ 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.
                if (is_array($temp_theSavedUC)) {
@@ -224,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,$TYPO3_CONF_VARS['BE']['defaultUC'],$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;
                }
@@ -238,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.
@@ -252,7 +296,7 @@ class t3lib_beUserAuth extends t3lib_userAuthGroup {
         * @internal
         */
        function overrideUC()   {
-               $this->uc = array_merge($this->uc,$this->getTSConfigProp('setup.override'));    // Candidate for t3lib_div::array_merge() if integer-keys will some day make trouble...
+               $this->uc = array_merge((array)$this->uc, (array)$this->getTSConfigProp('setup.override'));     // Candidate for t3lib_div::array_merge() if integer-keys will some day make trouble...
        }
 
        /**
@@ -280,7 +324,7 @@ class t3lib_beUserAuth extends t3lib_userAuthGroup {
                        $subject = 'At "'.$GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename'].'"'.
                                                ' from '.t3lib_div::getIndpEnv('REMOTE_ADDR').
                                                (t3lib_div::getIndpEnv('REMOTE_HOST') ? ' ('.t3lib_div::getIndpEnv('REMOTE_HOST').')' : '');
-                       $msg = sprintf ('User "%s" logged in from %s (%s) at "%s" (%s)', 
+                       $msg = sprintf ('User "%s" logged in from %s (%s) at "%s" (%s)',
                                $this->user['username'],
                                t3lib_div::getIndpEnv('REMOTE_ADDR'),
                                t3lib_div::getIndpEnv('REMOTE_HOST'),
@@ -301,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
@@ -311,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
@@ -321,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;
        }
 }
 
@@ -337,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