[TASK] Remove saltedpasswords FE.enabled 79/56979/6
authorChristian Kuhn <lolli@schwarzbu.ch>
Wed, 16 May 2018 14:29:38 +0000 (16:29 +0200)
committerMarkus Klein <markus.klein@typo3.org>
Thu, 17 May 2018 08:47:01 +0000 (10:47 +0200)
Manually configuring clear-text password storage in TYPO3 for
frontend users by explicitly setting the ext:saltedpasswords
extension configuration "FE.enabled = 0" has been a bad idea
for a very long time already. The feature has been dropped
for backend users in core v6.2 and is now finally dropped
for frontend users with this patch, too.
No third party service must rely on clear-text password storing
in 2018 anymore, the TYPO3 authentication services provide
an API to process credentials upon user login for authentication
and authorisation purposes.

Resolves: #85027
Related: #85026
Releases: master
Change-Id: I600f598e969ac99a83f3b57362b251b48116fd58
Reviewed-on: https://review.typo3.org/56979
Reviewed-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Tested-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Markus Klein <markus.klein@typo3.org>
Tested-by: Markus Klein <markus.klein@typo3.org>
18 files changed:
typo3/sysext/core/Classes/Service/AbstractService.php
typo3/sysext/core/Documentation/Changelog/master/Deprecation-85027-SaltedPasswordsRelatedMethodsAndClasses.rst [new file with mode: 0644]
typo3/sysext/core/Documentation/Changelog/master/Important-85022-SaltedpasswordsBulkUpdateTaskRemoved.rst [deleted file]
typo3/sysext/core/Documentation/Changelog/master/Important-85026-SaltedpasswordsChanges.rst [new file with mode: 0644]
typo3/sysext/install/Configuration/ExtensionScanner/Php/MethodCallStaticMatcher.php
typo3/sysext/saltedpasswords/Classes/Evaluation/Evaluator.php
typo3/sysext/saltedpasswords/Classes/SaltedPasswordService.php
typo3/sysext/saltedpasswords/Classes/Utility/ExtensionManagerConfigurationUtility.php
typo3/sysext/saltedpasswords/Classes/Utility/SaltedPasswordsUtility.php
typo3/sysext/saltedpasswords/Configuration/TCA/Overrides/fe_users.php
typo3/sysext/saltedpasswords/Documentation/Configuration/Index.rst
typo3/sysext/saltedpasswords/Documentation/DevelopersGuide/Index.rst
typo3/sysext/saltedpasswords/Documentation/Installation/Index.rst
typo3/sysext/saltedpasswords/Resources/Private/Language/locallang.xlf
typo3/sysext/saltedpasswords/Resources/Private/Language/locallang_em.xlf
typo3/sysext/saltedpasswords/Tests/Unit/Evaluation/EvaluatorTest.php
typo3/sysext/saltedpasswords/Tests/Unit/Salt/SaltFactoryTest.php
typo3/sysext/saltedpasswords/ext_conf_template.txt

index 28dc2c3..2606468 100644 (file)
@@ -514,8 +514,7 @@ abstract class AbstractService implements LoggerAwareInterface
         $this->reset();
         // Check for external programs which are defined by $info['exec']
         if (trim($this->info['exec'])) {
-            if (!$this->checkExec($this->info['exec'])) {
-            }
+            $this->checkExec($this->info['exec']);
         }
         return $this->getLastError() === true;
     }
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Deprecation-85027-SaltedPasswordsRelatedMethodsAndClasses.rst b/typo3/sysext/core/Documentation/Changelog/master/Deprecation-85027-SaltedPasswordsRelatedMethodsAndClasses.rst
new file mode 100644 (file)
index 0000000..0f7a59e
--- /dev/null
@@ -0,0 +1,34 @@
+.. include:: ../../Includes.txt
+
+==================================================================
+Deprecation: #85027 - Salted passwords related methods and classes
+==================================================================
+
+See :issue:`85027`
+
+Description
+===========
+
+The following methods of the saltedpasswords extension have been deprecated:
+
+* :php:`TYPO3\CMS\saltedpasswords\Utility\SaltedPasswordsUtility::isUsageEnabled()`, it always returns TRUE
+
+
+Impact
+======
+
+Relying on clear-text password storage has been dropped, passwords are always stored as salted password hashes.
+
+
+Affected Installations
+======================
+
+Instances that use third party authentication mechanisms may be affected by the change. The extension scanner will find usages of the methods and classes mentioned above.
+
+
+Migration
+=========
+
+Use the authentication services documented in the core API to not rely on clear-text password storage and the above methods or classes.
+
+.. index:: Database, Frontend, LocalConfiguration, PHP-API, FullyScanned, ext:saltedpasswords
\ No newline at end of file
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Important-85022-SaltedpasswordsBulkUpdateTaskRemoved.rst b/typo3/sysext/core/Documentation/Changelog/master/Important-85022-SaltedpasswordsBulkUpdateTaskRemoved.rst
deleted file mode 100644 (file)
index ab00b46..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-.. include:: ../../Includes.txt
-
-============================================================
-Important: #85022 - saltedpasswords bulk update task removed
-============================================================
-
-See :issue:`85022`
-
-Description
-===========
-
-The "Convert user passwords to salted hashes" scheduler bulk update task of the `saltedpasswords`
-extension has been removed from the system.
-
-The time line of salted password milestones in the core:
-
-* 4.3.0 (05/2008) Introduction of salted passwords extension
-* 4.5.0 (01/2011) Introduction of salted passwords bulk update scheduler task
-* 4.5.0 (01/2011) Default hash algorithm is phpass
-* 4.5.0 (01/2011) The reports module shows a warning if saltedpasswords extension is not loaded
-* 6.2.0 (03/2014) Salted passwords extension is mandatory
-* 8.0.0 (03/2016) Default hash algorithm of new instances is pbkdf2
-
-The salted passwords extension is by default configured to upgrade single password hashes to the
-currently configured hash algorithm if a user logs in.
-
-The scheduler task itself allowed to convert plain-text and simple md5 hashed passwords of frontend
-and backend users to salted md5 passwords. This hash method however is in itself outdated and not
-considered secure enough anymore. The task needed to be run only once and disabled itself as soon
-as it walked through all frontend and backend users.
-
-We assume all admins took care of basic salted password security within the last ten years if upgrading
-from instances older than version 4.3 by running this task once, so we now removed this task with core version 9.
-
-If there are still plain-text or simple md5 stored passwords, they can be found by searching the database
-field `password` of tables `fe_users` and `be_users` for entries not starting with `$`. If there are still entries
-like that, an administrator should convert them to simple md5 salted hashes by using the convert bulk update
-scheduler task in a core version prior to v9, before upgrading the system to v9.
-
-Additionally, as a general note on data protection, inactive frontend and backend users should be removed
-from the database after a while! The general idea is that not existing data can't be compromised in
-case of a security breach. The `lastlogin` field of the two user tables `fe_users` and `be_users` store
-the last login timestamp of a user, and soft deleted user records have the `deleted` field set to `1`.
-The "Table garbage collection task" scheduler task can be configured to fully remove those inactive or deleted users
-from the system. See the
-`scheduler documentation <https://docs.typo3.org/typo3cms/extensions/scheduler/Installation/BaseTasks/Index.html>`__
-for details on this task.
-
-.. index:: Backend, Database, Frontend, ext:saltedpasswords
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Important-85026-SaltedpasswordsChanges.rst b/typo3/sysext/core/Documentation/Changelog/master/Important-85026-SaltedpasswordsChanges.rst
new file mode 100644 (file)
index 0000000..e987ea1
--- /dev/null
@@ -0,0 +1,85 @@
+.. include:: ../../Includes.txt
+
+============================================
+Important: #85026 - salted passwords changes
+============================================
+
+See :issue:`85026`
+
+Description
+===========
+
+Several changes to the processing of user passwords and storage have been applied to
+the system. Default settings of the system have been adapted over time, these changes
+only apply for instances that actively disabled features during upgrading.
+
+All changes are justified by looking at the time line of salted password milestones
+in the TYPO3 core and should automatically work if no manual changes have been applied
+to the salted passwords evaluation and configuration settings:
+
+* 4.3.0 (05/2008) Introduction of salted passwords extension
+* 4.5.0 (01/2011) Introduction of salted passwords bulk update scheduler task
+* 4.5.0 (01/2011) Default hash algorithm is phpass
+* 4.5.0 (01/2011) The reports module shows a warning if saltedpasswords extension is not loaded
+* 6.2.0 (03/2014) Salted passwords extension is mandatory
+* 6.2.0 (03/2014) Salted password storage can not be disabled for backend users anymore
+* 8.0.0 (03/2016) Default hash algorithm of new instances is pbkdf2
+
+
+Data thriftness
+^^^^^^^^^^^^^^^
+
+As a best practice on the principle of data minimisation, inactive frontend and backend users should be removed from
+the database after a while! The main idea is that not existing data can't be compromised in case of a security breach.
+The `lastlogin` field of the two user tables `fe_users` and `be_users` store the last login timestamp of a user, and
+soft deleted user records have the `deleted` field set to `1`. The "Table garbage collection task" scheduler task can
+be configured to fully remove those inactive or deleted users from the system. See the
+`scheduler documentation <https://docs.typo3.org/typo3cms/extensions/scheduler/Installation/BaseTasks/Index.html>`__
+for details on this task.
+
+
+Salted passwords bulk update task removed
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The "Convert user passwords to salted hashes" scheduler bulk update task of the `saltedpasswords`
+extension has been removed from the system.
+
+The salted passwords extension is by default configured to upgrade single password hashes to the
+currently configured hash algorithm if a user logs in.
+
+The scheduler task itself allowed to convert clear-text and simple md5 hashed passwords of frontend
+and backend users to salted md5 passwords. This hash method however is in itself outdated and not
+considered secure enough anymore. The task needed to be run only once and disabled itself as soon
+as it walked through all frontend and backend users.
+
+TYPO3 v9 assumes all admins took care of basic salted password security within the last ten years if upgrading from
+instances older than version 4.3 by running this task once, the upgrade task has now been removed with core version 9.
+
+If there are still clear-text or simple md5 stored passwords, they can be found by searching the database
+field `password` of tables `fe_users` and `be_users` for entries not starting with `$`. If there are still entries
+like that, an administrator should convert them to simple md5 salted hashes by using the convert bulk update
+scheduler task in a core version prior to v9, before upgrading the system to v9.
+
+
+Disabled clear-text storage of frontend user passwords
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Storing frontend user passwords as non clear-text but as salted password hashes has been optional since
+core version 4.3 and enabled by default since core version 4.5. An option to store passwords in clear-text
+had to be manually configured. This has been removed for backend users in 6.2 already and is now dropped
+for frontend users as well.
+
+There has been little reason to store passwords in clear-text in the database in the past, most of them only
+justified by third party systems being directly connected to the TYPO3 database. Those cases should be solved
+using the :ref:`Authentication service API <t3coreapi:authentication>` instead, which can hand over the
+clear-text user password upon successful user login, but never persists the native clear-text password. If a third party
+layer such as LDAP is used for authentication to TYPO3, the user password should not be stored in the TYPO3 internal
+tables at all. The authentication service chain supports all of these scenarios, it is a common business use case to
+connect third party applications without the need to store passwords in clear-text anywhere.
+
+In case a TYPO3 instance messed around with configuration options of the salted passwords extension in the past, the
+toggle `FE.enabled` is now ignored and users still having clear-text passwords in the database will get their password
+storage strategy automatically upgraded to the configured salted password hash algorithm upon successful login.
+
+
+.. index:: Backend, Database, Frontend, ext:saltedpasswords
index 8e4b641..70a6531 100644 (file)
@@ -568,4 +568,11 @@ return [
             'Deprecation-84993-DeprecateSomeTSconfigRelatedMethods.rst',
         ],
     ],
+    'TYPO3\CMS\saltedpasswords\Utility\SaltedPasswordsUtility::isUsageEnabled' => [
+        'numberOfMandatoryArguments' => 0,
+        'maximumNumberOfArguments' => 1,
+        'restFiles' => [
+            'Deprecation-85027-SaltedPasswordsRelatedMethodsAndClasses.rst',
+        ],
+    ],
 ];
index 58ecf7f..81f5ad1 100644 (file)
@@ -15,7 +15,6 @@ namespace TYPO3\CMS\Saltedpasswords\Evaluation;
  */
 
 use TYPO3\CMS\Saltedpasswords\Salt\SaltFactory;
-use TYPO3\CMS\Saltedpasswords\Utility\SaltedPasswordsUtility;
 
 /**
  * Class implementing salted evaluation methods.
@@ -23,15 +22,6 @@ use TYPO3\CMS\Saltedpasswords\Utility\SaltedPasswordsUtility;
 class Evaluator
 {
     /**
-     * Keeps TYPO3 mode.
-     *
-     * Either 'FE' or 'BE'.
-     *
-     * @var string
-     */
-    protected $mode = null;
-
-    /**
      * This function just return the field value as it is. No transforming,
      * hashing will be done on server-side.
      *
@@ -52,23 +42,20 @@ class Evaluator
      */
     public function evaluateFieldValue($value, $is_in, &$set)
     {
-        $isEnabled = $this->mode ? SaltedPasswordsUtility::isUsageEnabled($this->mode) : SaltedPasswordsUtility::isUsageEnabled();
-        if ($isEnabled) {
-            $isMD5 = preg_match('/[0-9abcdef]{32,32}/', $value);
-            $hashingMethod = substr($value, 0, 2);
-            $isDeprecatedSaltedHash = ($hashingMethod === 'C$' || $hashingMethod === 'M$');
-            $objInstanceSaltedPW = SaltFactory::getSaltingInstance(null, $this->mode);
-            if ($isMD5) {
+        $isMD5 = preg_match('/[0-9abcdef]{32,32}/', $value);
+        $hashingMethod = substr($value, 0, 2);
+        $isDeprecatedSaltedHash = ($hashingMethod === 'C$' || $hashingMethod === 'M$');
+        $objInstanceSaltedPW = SaltFactory::getSaltingInstance();
+        if ($isMD5) {
+            $set = true;
+            $value = 'M' . $objInstanceSaltedPW->getHashedPassword($value);
+        } else {
+            // Determine method used for the (possibly) salted hashed password
+            $tempValue = $isDeprecatedSaltedHash ? substr($value, 1) : $value;
+            $tempObjInstanceSaltedPW = SaltFactory::getSaltingInstance($tempValue);
+            if (!is_object($tempObjInstanceSaltedPW)) {
                 $set = true;
-                $value = 'M' . $objInstanceSaltedPW->getHashedPassword($value);
-            } else {
-                // Determine method used for the (possibly) salted hashed password
-                $tempValue = $isDeprecatedSaltedHash ? substr($value, 1) : $value;
-                $tempObjInstanceSaltedPW = SaltFactory::getSaltingInstance($tempValue);
-                if (!is_object($tempObjInstanceSaltedPW)) {
-                    $set = true;
-                    $value = $objInstanceSaltedPW->getHashedPassword($value);
-                }
+                $value = $objInstanceSaltedPW->getHashedPassword($value);
             }
         }
         return $value;
index 4cc6fec..514fd1f 100644 (file)
@@ -65,26 +65,15 @@ class SaltedPasswordService extends AbstractAuthenticationService
     protected $authenticationFailed = false;
 
     /**
-     * Checks if service is available. In case of this service we check that
-     * following prerequesties are fulfilled:
-     * - loginSecurityLevel of according TYPO3_MODE is set to normal
+     * Set salted passwords extension configuration to $this->extConf
      *
-     * @return bool TRUE if service is available
+     * @return bool TRUE
      */
     public function init()
     {
-        $available = false;
-        $mode = TYPO3_MODE;
-        if ($this->info['requestedServiceSubType'] === 'authUserBE') {
-            $mode = 'BE';
-        } elseif ($this->info['requestedServiceSubType'] === 'authUserFE') {
-            $mode = 'FE';
-        }
-        if (Utility\SaltedPasswordsUtility::isUsageEnabled($mode)) {
-            $available = true;
-            $this->extConf = Utility\SaltedPasswordsUtility::returnExtConf();
-        }
-        return $available ? parent::init() : false;
+        $this->extConf = Utility\SaltedPasswordsUtility::returnExtConf();
+        parent::init();
+        return true;
     }
 
     /**
index 266b5d3..7edb5e6 100644 (file)
@@ -275,73 +275,67 @@ class ExtensionManagerConfigurationUtility
         $extConf = $this->extConf['FE'];
         $problems = [];
         $lang = $this->getLanguageService();
-        if ($extConf['enabled']) {
-            $loginSecurityLevel = trim($GLOBALS['TYPO3_CONF_VARS']['FE']['loginSecurityLevel']) ?: 'normal';
-            if ($loginSecurityLevel !== 'normal' && $loginSecurityLevel !== 'rsa') {
-                $this->setErrorLevel('info');
-                $problems[] = '<strong>' . $lang->getLL('ext.saltedpasswords.configuration.label.important') .
-                    '</strong><br /> ' .
-                    $lang->getLL('ext.saltedpasswords.configuration.message.infoLoginSecurityLevelDifferent') .
-                    '<br />
-                                       <ul>
-                                               <li>' .
-                    $lang->getLL('ext.saltedpasswords.configuration.message.infoLoginSecurityLevelDifferentFirstItem') .
-                    '</li>
+        $loginSecurityLevel = trim($GLOBALS['TYPO3_CONF_VARS']['FE']['loginSecurityLevel']) ?: 'normal';
+        if ($loginSecurityLevel !== 'normal' && $loginSecurityLevel !== 'rsa') {
+            $this->setErrorLevel('info');
+            $problems[] = '<strong>' . $lang->getLL('ext.saltedpasswords.configuration.label.important') .
+                '</strong><br /> ' .
+                $lang->getLL('ext.saltedpasswords.configuration.message.infoLoginSecurityLevelDifferent') .
+                '<br />
+                <ul>
+                    <li>' .
+                $lang->getLL('ext.saltedpasswords.configuration.message.infoLoginSecurityLevelDifferentFirstItem') .
+                '</li>
 
-                                               <li>' .
-                    $lang->getLL('ext.saltedpasswords.configuration.message.infoLoginSecurityLevelDifferentSecondItem') .
-                    '</li>
-                                       </ul>
-                                       <br />
-                                       ' . $lang->getLL('ext.saltedpasswords.configuration.message.infoLoginSecurityLevelDifferentNote');
-            } elseif ($loginSecurityLevel === 'rsa') {
-                if (ExtensionManagementUtility::isLoaded('rsaauth')) {
-                    if ($this->isRsaAuthBackendAvailable()) {
-                        $this->setErrorLevel('ok');
-                        $problems[] = $lang->getLL('ext.saltedpasswords.configuration.message.okFeRsaauthLoaded');
-                    } else {
-                        // This means that login would fail because rsaauth is not working properly
-                        $this->setErrorLevel('error');
-                        $problems[] = '<strong>' . $lang->getLL('ext.saltedpasswords.configuration.message.openSslMissing') .
-                            ' <a href="http://php.net/manual/en/openssl.installation.php" target="_blank">PHP.net</a></strong>.';
-                    }
-                } else {
-                    // Rsaauth is not installed but configured to be used
-                    $this->setErrorLevel('warning');
-                    $problems[] = $lang->getLL('ext.saltedpasswords.configuration.message.warningRsaauthNotInstalledButConfigured');
-                }
-            }
-            // Only saltedpasswords as authsservice
-            if ($extConf['onlyAuthService']) {
-                // Warn user that the combination with "forceSalted" may lock
-                // him out from frontend
-                if ($extConf['forceSalted']) {
-                    $this->setErrorLevel('warning');
-                    $problems[] = nl2br($lang->getLL('ext.saltedpasswords.configuration.message.infoForceSalted')) .
-                        '<strong><i>' . $lang->getLL('ext.saltedpasswords.configuration.label.important') .
-                        '</i></strong> ' . $lang->getLL('ext.saltedpasswords.configuration.message.warningForceSaltedNoteForFrontend');
+                    <li>' .
+                $lang->getLL('ext.saltedpasswords.configuration.message.infoLoginSecurityLevelDifferentSecondItem') .
+                '</li>
+                </ul>
+                <br />
+                ' . $lang->getLL('ext.saltedpasswords.configuration.message.infoLoginSecurityLevelDifferentNote');
+        } elseif ($loginSecurityLevel === 'rsa') {
+            if (ExtensionManagementUtility::isLoaded('rsaauth')) {
+                if ($this->isRsaAuthBackendAvailable()) {
+                    $this->setErrorLevel('ok');
+                    $problems[] = $lang->getLL('ext.saltedpasswords.configuration.message.okFeRsaauthLoaded');
                 } else {
-                    // Inform the user that things like openid won't work anymore
-                    $this->setErrorLevel('info');
-                    $problems[] = $lang->getLL('ext.saltedpasswords.configuration.message.infoOnlyFrontendAuthService');
+                    // This means that login would fail because rsaauth is not working properly
+                    $this->setErrorLevel('error');
+                    $problems[] = '<strong>' . $lang->getLL('ext.saltedpasswords.configuration.message.openSslMissing') .
+                        ' <a href="http://php.net/manual/en/openssl.installation.php" target="_blank">PHP.net</a></strong>.';
                 }
+            } else {
+                // Rsaauth is not installed but configured to be used
+                $this->setErrorLevel('warning');
+                $problems[] = $lang->getLL('ext.saltedpasswords.configuration.message.warningRsaauthNotInstalledButConfigured');
             }
-            // forceSalted is set
-            if ($extConf['forceSalted'] && !$extConf['onlyAuthService']) {
+        }
+        // Only saltedpasswords as authsservice
+        if ($extConf['onlyAuthService']) {
+            // Warn user that the combination with "forceSalted" may lock
+            // him out from frontend
+            if ($extConf['forceSalted']) {
                 $this->setErrorLevel('warning');
                 $problems[] = nl2br($lang->getLL('ext.saltedpasswords.configuration.message.infoForceSalted')) .
                     '<strong><i>' . $lang->getLL('ext.saltedpasswords.configuration.label.important') .
-                    '</i></strong> ' . $lang->getLL('ext.saltedpasswords.configuration.message.warningForceSaltedNote2');
-            }
-            // updatePasswd wont work with "forceSalted"
-            if ($extConf['updatePasswd'] && $extConf['forceSalted']) {
-                $this->setErrorLevel('error');
-                $problems[] = nl2br($lang->getLL('ext.saltedpasswords.configuration.message.errorForceSaltedAndUpdatePassword'));
+                    '</i></strong> ' . $lang->getLL('ext.saltedpasswords.configuration.message.warningForceSaltedNoteForFrontend');
+            } else {
+                // Inform the user that things like openid won't work anymore
+                $this->setErrorLevel('info');
+                $problems[] = $lang->getLL('ext.saltedpasswords.configuration.message.infoOnlyFrontendAuthService');
             }
-        } else {
-            // Not enabled warning
-            $this->setErrorLevel('info');
-            $problems[] = $lang->getLL('ext.saltedpasswords.configuration.message.infoSaltedpasswordsFrontendDisabled');
+        }
+        // forceSalted is set
+        if ($extConf['forceSalted'] && !$extConf['onlyAuthService']) {
+            $this->setErrorLevel('warning');
+            $problems[] = nl2br($lang->getLL('ext.saltedpasswords.configuration.message.infoForceSalted')) .
+                '<strong><i>' . $lang->getLL('ext.saltedpasswords.configuration.label.important') .
+                '</i></strong> ' . $lang->getLL('ext.saltedpasswords.configuration.message.warningForceSaltedNote2');
+        }
+        // updatePasswd wont work with "forceSalted"
+        if ($extConf['updatePasswd'] && $extConf['forceSalted']) {
+            $this->setErrorLevel('error');
+            $problems[] = nl2br($lang->getLL('ext.saltedpasswords.configuration.message.errorForceSaltedAndUpdatePassword'));
         }
         $this->problems = $problems;
         $result = $this->renderMessage();
index 5a8b359..1f2be3f 100644 (file)
@@ -79,10 +79,8 @@ class SaltedPasswordsUtility
      */
     public function feloginForgotPasswordHook(array &$params, \TYPO3\CMS\Felogin\Controller\FrontendLoginController $pObj)
     {
-        if (self::isUsageEnabled('FE')) {
-            $objInstanceSaltedPW = \TYPO3\CMS\Saltedpasswords\Salt\SaltFactory::getSaltingInstance();
-            $params['newPassword'] = $objInstanceSaltedPW->getHashedPassword($params['newPassword']);
-        }
+        $objInstanceSaltedPW = \TYPO3\CMS\Saltedpasswords\Salt\SaltFactory::getSaltingInstance();
+        $params['newPassword'] = $objInstanceSaltedPW->getHashedPassword($params['newPassword']);
     }
 
     /**
@@ -97,7 +95,6 @@ class SaltedPasswordsUtility
             'forceSalted' => '0',
             'updatePasswd' => '1',
             'saltedPWHashingMethod' => \TYPO3\CMS\Saltedpasswords\Salt\PhpassSalt::class,
-            'enabled' => '1'
         ];
     }
 
@@ -122,20 +119,15 @@ class SaltedPasswordsUtility
      * Returns information if salted password hashes are
      * indeed used in the TYPO3_MODE.
      *
-     * @param string $mode (optional) The TYPO3 mode (FE or BE) saltedpasswords shall be used for
      * @return bool TRUE, if salted password hashes are used in the TYPO3_MODE, otherwise FALSE
+     * @deprecated in TYPO3 v9, will be removed in TYPO3 v10
      */
-    public static function isUsageEnabled($mode = TYPO3_MODE)
+    public static function isUsageEnabled()
     {
-        // Login Security Level Recognition
-        $extConf = self::returnExtConf($mode);
-        $securityLevel = trim($GLOBALS['TYPO3_CONF_VARS'][$mode]['loginSecurityLevel']) ?: 'normal';
-        if ($mode === 'BE') {
-            return true;
-        }
-        if ($mode === 'FE' && $extConf['enabled']) {
-            return $securityLevel === 'normal' || $securityLevel === 'rsa';
-        }
-        return false;
+        trigger_error(
+            'Method isUsageEnabled() has been deprecated with core v9, always returns true and will be removed with v10.',
+            E_USER_DEPRECATED
+        );
+        return true;
     }
 }
index 26b1881..8197085 100644 (file)
@@ -2,14 +2,12 @@
 defined('TYPO3_MODE') or die();
 
 $GLOBALS['TCA']['fe_users']['columns']['password']['config']['max'] = 100;
-if (\TYPO3\CMS\Saltedpasswords\Utility\SaltedPasswordsUtility::isUsageEnabled('FE')) {
-    // Get eval field operations methods as array keys
-    $operations = array_flip(\TYPO3\CMS\Core\Utility\GeneralUtility::trimExplode(',', $GLOBALS['TCA']['fe_users']['columns']['password']['config']['eval'], true));
-    // Remove md5 and temporary password from the list of evaluated methods
-    unset($operations['md5'], $operations['password']);
-    // Append new methods to have "password" as last operation.
-    $operations['TYPO3\\CMS\\Saltedpasswords\\Evaluation\\FrontendEvaluator'] = 1;
-    $operations['password'] = 1;
-    $GLOBALS['TCA']['fe_users']['columns']['password']['config']['eval'] = implode(',', array_keys($operations));
-    unset($operations);
-}
+// Get eval field operations methods as array keys
+$operations = array_flip(\TYPO3\CMS\Core\Utility\GeneralUtility::trimExplode(',', $GLOBALS['TCA']['fe_users']['columns']['password']['config']['eval'], true));
+// Remove md5 and temporary password from the list of evaluated methods
+unset($operations['md5'], $operations['password']);
+// Append new methods to have "password" as last operation.
+$operations[\TYPO3\CMS\Saltedpasswords\Evaluation\FrontendEvaluator::class] = 1;
+$operations['password'] = 1;
+$GLOBALS['TCA']['fe_users']['columns']['password']['config']['eval'] = implode(',', array_keys($operations));
+unset($operations);
index 446f956..bd83be3 100644 (file)
@@ -25,13 +25,6 @@ Basic configuration
 
 ::
 
-   # Enable FE (boolean)
-   FE.enabled = 1
-
-Enables usage of salted user password records for the TYPO3 frontend
-
-::
-
    # Hashing method for the frontend (list)
    FE.saltedPWHashingMethod = tx_saltedpasswords_salts_phpass (Portable PHP password hashing)
 
@@ -63,8 +56,7 @@ stored password will result in a failed authentication.
    # Exclusive FE usage (boolean)
    FE.onlyAuthService = 0
 
-If enabled and authentication fails, no further authentication service
-will be tried.
+If authentication fails, no further authentication service will be tried
 
 ::
 
@@ -94,8 +86,7 @@ stored password will result in a failed authentication.
    # Exclusive BE usage (boolean)
    BE.onlyAuthService = 0
 
-If enabled and authentication fails, no further authentication service
-will be tried.
+If authentication fails, no further authentication service will be tried.
 
 ::
 
index 6f46e4d..e6915b3 100644 (file)
@@ -25,9 +25,6 @@ Creating a hash
 When you want to create a new salted user password hash from a given
 plain-text password, these are the steps to be done:
 
-- check if salted user password hashes is enabled for the desired TYPO3
-  mode (frontend/backend)
-
 - let the factory deliver an instance of the default hashing class
 
 - create the salted user password hash
@@ -40,12 +37,10 @@ Example implementation for TYPO3 frontend:
    $password = 'XXX';
    $saltedPassword = '';
 
-       if (\TYPO3\CMS\Saltedpasswords\Utility\SaltedPasswordsUtility::isUsageEnabled('FE')) {
-               $objSalt = \TYPO3\CMS\Saltedpasswords\Salt\SaltFactory::getSaltingInstance(NULL);
-               if (is_object($objSalt)) {
-                       $saltedPassword = $objSalt->getHashedPassword($password);
-               }
-       }
+   $objSalt = \TYPO3\CMS\Saltedpasswords\Salt\SaltFactory::getSaltingInstance(NULL);
+   if (is_object($objSalt)) {
+       $saltedPassword = $objSalt->getHashedPassword($password);
+   }
 
 
 .. _checking-a-password:
@@ -56,9 +51,6 @@ Checking a password
 When you want to check a plain-text password against a salted user
 password hash, these are the steps to be done:
 
-- check if salted user password hashes is enabled for the TYPO3
-  mode (frontend only)
-
 - let the factory deliver an instance of the according hashing class
 
 - compare plain-text password with salted user password hash
@@ -73,12 +65,9 @@ Example implementation for TYPO3 frontend:
    $saltedPassword = 'YYY';
    // keeps status if plain-text password matches given salted user password hash
    $success = FALSE;
-
-   if (\TYPO3\CMS\Saltedpasswords\Utility\SaltedPasswordsUtility::isUsageEnabled('FE')) {
-           $objSalt = \TYPO3\CMS\Saltedpasswords\Salt\SaltFactory::getSaltingInstance($saltedPassword);
-           if (is_object($objSalt)) {
-                   $success = $objSalt->checkPassword($password, $saltedPassword);
-           }
+   $objSalt = \TYPO3\CMS\Saltedpasswords\Salt\SaltFactory::getSaltingInstance($saltedPassword);
+   if (is_object($objSalt)) {
+       $success = $objSalt->checkPassword($password, $saltedPassword);
    }
 
 
index edd5761..0ee7752 100644 (file)
@@ -35,9 +35,6 @@ variable! A valid setting for working salted user password hashes are
 Now return back to the Extension manager and again open the extension
 configuration for system extension "Salted user password hashes" (saltedpasswords)!
 
-Depending on which TYPO3 mode (FE or BE) you like to use salted user
-password hashes for, activate the according **checkbox** "**Enable FE**" or "**Enable BE**"!
-
 Additionally, you might want to change the hashing method. See
 previous chapter for an explanation on when to use which method.
 
index 1368a92..386a3a6 100644 (file)
@@ -107,7 +107,7 @@ It is not possible to set "updatePasswd" and "forceSalted" at the same time. Ple
                                <source>IMPORTANT</source>
                        </trans-unit>
                        <trans-unit id="ext.saltedpasswords.configuration.message.infoLoginSecurityLevelDifferent">
-                               <source>Frontend requirements for SaltedPasswords are not met, therefore the authentication will not work even if it was explicitly enabled for frontend usage</source>
+                               <source>Frontend requirements for SaltedPasswords are not met, therefore the authentication will not work</source>
                        </trans-unit>
                        <trans-unit id="ext.saltedpasswords.configuration.message.infoLoginSecurityLevelDifferentFirstItem">
                                <source>Install the "rsaauth" extension and use the Install Tool to set the Login Security Level for the frontend to "rsa" ($TYPO3_CONF_VARS['FE']['loginSecurityLevel'])</source>
@@ -133,9 +133,6 @@ It is not possible to set "updatePasswd" and "forceSalted" at the same time. Ple
                        <trans-unit id="ext.saltedpasswords.configuration.message.warningForceSaltedNote2">
                                <source>This has the effect that passwords that were set before SaltedPasswords was used will not work (in fact, they need to be redefined).</source>
                        </trans-unit>
-                       <trans-unit id="ext.saltedpasswords.configuration.message.infoSaltedpasswordsFrontendDisabled">
-                               <source>SaltedPasswords has been disabled for frontend users.</source>
-                       </trans-unit>
                </body>
        </file>
 </xliff>
index 4c34318..d82d312 100644 (file)
@@ -9,9 +9,6 @@
                        <trans-unit id="saltedpasswords.config.checkConfigurationBE">
                                <source>Backend configuration check</source>
                        </trans-unit>
-                       <trans-unit id="saltedpasswords.config.FE.enabled">
-                               <source>Enable FE: Enable SaltedPasswords in the frontend</source>
-                       </trans-unit>
                        <trans-unit id="saltedpasswords.config.FE.saltedPWHashingMethod">
                                <source>Hashing method for the frontend: Defines salted hashing method to use. Choose "Portable PHP password hashing" to stay compatible with other CMS (e.g. Drupal, Wordpress). Choose "MD5 salted hashing" to reuse TYPO3 passwords for OS level authentication (other servers could use TYPO3 passwords). Choose "Blowfish salted hashing" for advanced security to reuse passwords on OS level (Blowfish might not be supported on your system TODO).</source>
                        </trans-unit>
@@ -25,7 +22,7 @@
                                <source>Force salted passwords: Enforce usage of SaltedPasswords. Old MD5 hashed passwords will stop working.</source>
                        </trans-unit>
                        <trans-unit id="saltedpasswords.config.FE.onlyAuthService">
-                               <source>Exclusive FE usage: If enabled and authentication fails, no further authentication service will be tried.</source>
+                               <source>Exclusive FE usage: If authentication fails, no further authentication service will be tried.</source>
                        </trans-unit>
                        <trans-unit id="saltedpasswords.config.FE.updatePasswd">
                                <source>Update FE user passwords: Keep existing FE user passwords but automatically convert them to the salted hash format during authentication (will not work if forceSalted is used).</source>
@@ -37,7 +34,7 @@
                                <source>Force salted passwords: Enforce usage of SaltedPasswords. Old MD5 hashed passwords will stop working.</source>
                        </trans-unit>
                        <trans-unit id="saltedpasswords.config.BE.onlyAuthService">
-                               <source>Exclusive BE usage: If enabled and authentication fails, no further authentication service will be tried.</source>
+                               <source>Exclusive BE usage: If authentication fails, no further authentication service will be tried.</source>
                        </trans-unit>
                        <trans-unit id="saltedpasswords.config.BE.updatePasswd">
                                <source>Update BE user passwords: Keep existing BE user passwords but automatically convert them to the salted hash format during authentication (will not work if forceSalted is used).</source>
index e1d0c5b..cafaa1d 100644 (file)
@@ -16,43 +16,25 @@ namespace TYPO3\CMS\Saltedpasswords\Tests\Unit\Evaluation;
 
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Saltedpasswords\Evaluation\Evaluator;
+use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 /**
- * Testcase for SaltedPasswordsUtility
+ * Test case
  */
-class EvaluatorTest extends \TYPO3\TestingFramework\Core\Unit\UnitTestCase
+class EvaluatorTest extends UnitTestCase
 {
     /**
-     * @var Evaluator
-     */
-    protected $subject;
-
-    /**
-     * Set up the a test
-     */
-    protected function setUp()
-    {
-        $this->subject = $this->getMockBuilder(Evaluator::class)
-            ->setMethods(['dummy'])
-            ->getMock();
-
-        // Make sure SaltedPasswordsUtility::isUsageEnabled() returns TRUE
-        unset($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['saltedpasswords']);
-        $GLOBALS['TYPO3_CONF_VARS']['BE']['loginSecurityLevel'] = 'rsa';
-    }
-
-    /**
      * @test
      */
     public function passwordIsTurnedIntoSaltedString()
     {
         $isSet = null;
         $originalPassword = 'password';
-        $saltedPassword = $this->subject->evaluateFieldValue($originalPassword, '', $isSet);
-        $hashingMethod = substr($saltedPassword, 0, 3);
+        $saltedPassword = (new Evaluator())->evaluateFieldValue($originalPassword, '', $isSet);
+        $isSalted = substr($saltedPassword, 0, 1) === '$';
         $this->assertTrue($isSet);
         $this->assertNotEquals($originalPassword, $saltedPassword);
-        $this->assertTrue($hashingMethod === '$1$' || $hashingMethod === '$2$' || $hashingMethod === '$2a' || $hashingMethod === '$P$');
+        $this->assertTrue($isSalted);
     }
 
     /**
@@ -62,7 +44,7 @@ class EvaluatorTest extends \TYPO3\TestingFramework\Core\Unit\UnitTestCase
     {
         $isSet = null;
         $originalPassword = '5f4dcc3b5aa765d61d8327deb882cf99';
-        $saltedPassword = $this->subject->evaluateFieldValue($originalPassword, '', $isSet);
+        $saltedPassword = (new Evaluator())->evaluateFieldValue($originalPassword, '', $isSet);
         $this->assertTrue($isSet);
         $this->assertNotEquals($originalPassword, $saltedPassword);
         $this->assertTrue(GeneralUtility::isFirstPartOfStr($saltedPassword, 'M$'));
@@ -75,7 +57,7 @@ class EvaluatorTest extends \TYPO3\TestingFramework\Core\Unit\UnitTestCase
     {
         $isSet = null;
         $originalPassword = 'M$P$CibIRipvLfaPlaaeH8ifu9g21BrPjp.';
-        $saltedPassword = $this->subject->evaluateFieldValue($originalPassword, '', $isSet);
+        $saltedPassword = (new Evaluator())->evaluateFieldValue($originalPassword, '', $isSet);
         $this->assertNull($isSet);
         $this->assertSame($originalPassword, $saltedPassword);
     }
index 24d3c84..8fb0e42 100644 (file)
@@ -15,11 +15,12 @@ namespace TYPO3\CMS\Saltedpasswords\Tests\Unit\Salt;
  */
 
 use TYPO3\CMS\Core\Crypto\Random;
+use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 /**
- * Testcase for SaltFactory
+ * Test case
  */
-class SaltFactoryTest extends \TYPO3\TestingFramework\Core\Unit\UnitTestCase
+class SaltFactoryTest extends UnitTestCase
 {
     /**
      * Keeps instance of object to test.
@@ -41,7 +42,6 @@ class SaltFactoryTest extends \TYPO3\TestingFramework\Core\Unit\UnitTestCase
                 'updatePasswd' => 1,
             ],
             'FE' => [
-                'enabled' => 1,
                 'saltedPWHashingMethod' => \TYPO3\CMS\Saltedpasswords\Salt\Pbkdf2Salt::class,
                 'forceSalted' => 0,
                 'onlyAuthService' => 0,
index b3c77bf..91abe3e 100644 (file)
@@ -4,9 +4,6 @@ checkConfigurationFE=0
 # cat=Basic/enable; type=user[TYPO3\CMS\Saltedpasswords\Utility\ExtensionManagerConfigurationUtility->checkConfigurationBackend]; label=LLL:EXT:saltedpasswords/Resources/Private/Language/locallang_em.xlf:saltedpasswords.config.checkConfigurationBE
 checkConfigurationBE=0
 
-# cat=Basic/enable; type=boolean; label=LLL:EXT:saltedpasswords/Resources/Private/Language/locallang_em.xlf:saltedpasswords.config.FE.enabled
-FE.enabled = 1
-
 # cat=Basic/enable; type=user[TYPO3\CMS\Saltedpasswords\Utility\ExtensionManagerConfigurationUtility->buildHashMethodSelectorFE]; label=LLL:EXT:saltedpasswords/Resources/Private/Language/locallang_em.xlf:saltedpasswords.config.FE.saltedPWHashingMethod
 FE.saltedPWHashingMethod = TYPO3\CMS\Saltedpasswords\Salt\Pbkdf2Salt