[!!!][TASK] Make TYPO3_CONF_VARS[BE][lockSSL] boolean 83/47483/4
authorBenni Mack <benni@typo3.org>
Fri, 1 Apr 2016 09:40:16 +0000 (11:40 +0200)
committerChristian Kuhn <lolli@schwarzbu.ch>
Fri, 1 Apr 2016 13:21:26 +0000 (15:21 +0200)
The lockSSL setting has three possible values:
0 = do nothing when in the backend
1 = show a blank page when accessing the BE from non-SSL
2 = redirect to the https version of the BE

The option "1" is nowadays not a valuable option and
"hiding" the TYPO3 Backend can be done via htaccess
or other access rules.

Therefore the lockSSL setting only has a bool state now:
 * When false do nothing
 * When true, redirect to the SSL version of the BE

Resolves: #75357
Releases: master
Change-Id: If326a725cc7c4b7b60cbb20c70704d55bf0111ee
Reviewed-on: https://review.typo3.org/47483
Reviewed-by: Morton Jonuschat <m.jonuschat@mojocode.de>
Tested-by: Morton Jonuschat <m.jonuschat@mojocode.de>
Reviewed-by: Daniel Goerz <ervaude@gmail.com>
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
typo3/sysext/backend/Classes/FrontendBackendUserAuthentication.php
typo3/sysext/core/Classes/Core/Bootstrap.php
typo3/sysext/core/Configuration/DefaultConfiguration.php
typo3/sysext/core/Documentation/Changelog/master/Breaking-75357-TYPO3_CONF_VARSBElockSSLOptionIsBoolean.rst [new file with mode: 0644]
typo3/sysext/install/Classes/Service/SilentConfigurationUpgradeService.php
typo3/sysext/saltedpasswords/Classes/Utility/ExtensionManagerConfigurationUtility.php

index 89af1ee..83df9c5 100755 (executable)
@@ -188,7 +188,7 @@ class FrontendBackendUserAuthentication extends \TYPO3\CMS\Core\Authentication\B
             }
         }
         // Check SSL (https)
-        if ((int)$GLOBALS['TYPO3_CONF_VARS']['BE']['lockSSL'] && !GeneralUtility::getIndpEnv('TYPO3_SSL')) {
+        if ((bool)$GLOBALS['TYPO3_CONF_VARS']['BE']['lockSSL'] && !GeneralUtility::getIndpEnv('TYPO3_SSL')) {
             return false;
         }
         // Finally a check from \TYPO3\CMS\Core\Authentication\BackendUserAuthentication::backendCheckLogin()
index 707d97a..af7c6f7 100644 (file)
@@ -914,22 +914,16 @@ class Bootstrap
      */
     public function checkSslBackendAndRedirectIfNeeded()
     {
-        if ((int)$GLOBALS['TYPO3_CONF_VARS']['BE']['lockSSL']) {
-            if (!GeneralUtility::getIndpEnv('TYPO3_SSL')) {
-                if ((int)$GLOBALS['TYPO3_CONF_VARS']['BE']['lockSSL'] === 2) {
-                    if ((int)$GLOBALS['TYPO3_CONF_VARS']['BE']['lockSSLPort']) {
-                        $sslPortSuffix = ':' . (int)$GLOBALS['TYPO3_CONF_VARS']['BE']['lockSSLPort'];
-                    } else {
-                        $sslPortSuffix = '';
-                    }
-                    list(, $url) = explode('://', GeneralUtility::getIndpEnv('TYPO3_SITE_URL') . TYPO3_mainDir, 2);
-                    list($server, $address) = explode('/', $url, 2);
-                    header('Location: https://' . $server . $sslPortSuffix . '/' . $address);
-                    die;
-                } else {
-                    throw new \RuntimeException('TYPO3 Backend not accessed via SSL: TYPO3 Backend is configured to only be accessible through SSL. Change the URL in your browser and try again.', 1389265726);
-                }
+        if ((bool)$GLOBALS['TYPO3_CONF_VARS']['BE']['lockSSL'] && !GeneralUtility::getIndpEnv('TYPO3_SSL')) {
+            if ((int)$GLOBALS['TYPO3_CONF_VARS']['BE']['lockSSLPort']) {
+                $sslPortSuffix = ':' . (int)$GLOBALS['TYPO3_CONF_VARS']['BE']['lockSSLPort'];
+            } else {
+                $sslPortSuffix = '';
             }
+            list(, $url) = explode('://', GeneralUtility::getIndpEnv('TYPO3_SITE_URL') . TYPO3_mainDir, 2);
+            list($server, $address) = explode('/', $url, 2);
+            header('Location: https://' . $server . $sslPortSuffix . '/' . $address);
+            die;
         }
         return $this;
     }
index 115436b..132a3d3 100644 (file)
@@ -729,7 +729,7 @@ return array(
         'sessionTimeout' => 3600,                        // Integer: seconds. Session time out for backend users. The value must be at least 180 to avoid side effects. Default is 3600 seconds = 1 hour.
         'IPmaskList' => '',                                // String: Lets you define a list of IP-numbers (with *-wildcards) that are the ONLY ones allowed access to ANY backend activity. On error an error header is sent and the script exits. Works like IP masking for users configurable through TSconfig. See syntax for that (or look up syntax for the function \TYPO3\CMS\Core\Utility\GeneralUtility::cmpIP())
         'lockBeUserToDBmounts' => true,                    // Boolean: If set, the backend user is allowed to work only within his page-mount. It's advisable to leave this on because it makes security easy to manage.
-        'lockSSL' => 0,                                    // <p>Integer (0, 1, 2). If &gt;0, If set (1,2), the backend can only be operated from an SSL-encrypted connection (https)</p><dl><dt>0</dt><dd>no locking (default)</dd><dt>1</dt><dd>only allow access via SSL</dd><dt>2</dt><dd>redirect user trying to access non-https admin-urls to SSL URLs instead</dd></dl>
+        'lockSSL' => false,                                    // Boolean. If set, the backend can only be operated from an SSL-encrypted connection (https). A redirect to the SSL version of a URL will happen when a user tries to access non-https admin-urls
         'lockSSLPort' => 0,                                // Integer: Use a non-standard HTTPS port for lockSSL. Set this value if you use lockSSL and the HTTPS port of your webserver is not 443.
         '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).
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Breaking-75357-TYPO3_CONF_VARSBElockSSLOptionIsBoolean.rst b/typo3/sysext/core/Documentation/Changelog/master/Breaking-75357-TYPO3_CONF_VARSBElockSSLOptionIsBoolean.rst
new file mode 100644 (file)
index 0000000..91eb8ae
--- /dev/null
@@ -0,0 +1,31 @@
+==================================================================
+Breaking: #75357 - $TYPO3_CONF_VARS[BE][lockSSL] option is boolean
+==================================================================
+
+Description
+===========
+
+The setting ``$TYPO3_CONF_VARS[BE][lockSSL]`` which forces requests to the TYPO3 Backend to be transferred
+via SSL, has been changed to only allow boolean values.
+
+The settings previously allowed three options:
+* lockSSL set to "0" - Don't force a SSL connection at all
+* lockSSL set to "1" - If the incoming request to the TYPO3 backend is a non-SSL request, an exception was thrown
+* lockSSL set to "2" - If the incoming request is a non-SSL-request, redirect to the SSL-enabled URL
+
+The option "1" has been removed without substitution, allowing the following variants:
+* lockSSL set to "false" - Don't force a SSL connection at all
+* lockSSL set to "true" - If the incoming request is a non-SSL-request, redirect to the SSL-enabled URL
+
+
+Impact
+======
+
+If the option was set previously to "1", the exception is not thrown but a redirect will now happen.
+The same behaviour as the existing option "2".
+
+
+Affected Installations
+======================
+
+TYPO3 instances having the option above set to "1".
\ No newline at end of file
index b2d5a78..daf9bfd 100755 (executable)
@@ -121,6 +121,7 @@ class SilentConfigurationUpgradeService
         $this->setImageMagickDetailSettings();
         $this->removeObsoleteLocalConfigurationSettings();
         $this->migrateThumbnailsPngSetting();
+        $this->migrateLockSslSetting();
     }
 
     /**
@@ -628,4 +629,23 @@ class SilentConfigurationUpgradeService
             $this->throwRedirectException();
         }
     }
+
+    /**
+     * Migrate the configuration setting BE/lockSSL to boolean if set in the LocalConfiguration.php file
+     *
+     * @return void
+     */
+    protected function migrateLockSslSetting()
+    {
+        try {
+            $currentOption = $this->configurationManager->getLocalConfigurationValueByPath('BE/lockSSL');
+            // check if the current option is an integer/string and if it is active
+            if (!is_bool($currentOption) && (int)$currentOption > 0) {
+                $this->configurationManager->setLocalConfigurationValueByPath('BE/lockSSL', true);
+                $this->throwRedirectException();
+            }
+        } catch (\RuntimeException $e) {
+            // no change inside the LocalConfiguration.php found, so nothing needs to be modified
+        }
+    }
 }
index ad7610b..73de410 100755 (executable)
@@ -169,7 +169,7 @@ class ExtensionManagerConfigurationUtility
         $this->init();
         $extConf = $this->extConf['BE'];
         // The backend is called over SSL
-        $isBackendCalledOverSsl = (int)$GLOBALS['TYPO3_CONF_VARS']['BE']['lockSSL'] > 0;
+        $isBackendCalledOverSsl = (bool)$GLOBALS['TYPO3_CONF_VARS']['BE']['lockSSL'];
         $rsaAuthLoaded = ExtensionManagementUtility::isLoaded('rsaauth');
         // SSL configured?
         $lang = $this->getLanguageService();