[!!!][TASK] Remove sysext:sv, move files to sysext:core 51/53351/5
authorAnja Leichsenring <aleichsenring@ab-softlab.de>
Wed, 28 Jun 2017 20:21:54 +0000 (22:21 +0200)
committerBenni Mack <benni@typo3.org>
Wed, 28 Jun 2017 23:13:11 +0000 (01:13 +0200)
Only the AuthenticationService and its abstract class are
left in sysext:sv. Move those, the tests and the service
registration over to sysext:core.

All mentions of sysext:sv are hereby removed from the core.

Change-Id: I699ace33a7d5a0e7ddff4d3c9ed4e595e40677af
Resolves: #81735
Releases: master
Reviewed-on: https://review.typo3.org/53351
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
Reviewed-by: Benni Mack <benni@typo3.org>
Tested-by: Benni Mack <benni@typo3.org>
28 files changed:
composer.json
composer.lock
typo3/sysext/core/Classes/Authentication/AbstractAuthenticationService.php [new file with mode: 0644]
typo3/sysext/core/Classes/Authentication/AbstractUserAuthentication.php
typo3/sysext/core/Classes/Authentication/AuthenticationService.php [new file with mode: 0644]
typo3/sysext/core/Documentation/Changelog/master/Breaking-81735-GetRidOfSysextsv.rst [new file with mode: 0644]
typo3/sysext/core/Migrations/Code/ClassAliasMap.php
typo3/sysext/core/Migrations/Code/LegacyClassesForIde.php
typo3/sysext/core/Tests/Functional/Authentication/AuthenticationServiceTest.php [new file with mode: 0644]
typo3/sysext/core/Tests/Functional/Fixtures/be_users.xml [new file with mode: 0644]
typo3/sysext/core/Tests/Unit/Authentication/AuthenticationServiceTest.php [new file with mode: 0644]
typo3/sysext/core/Tests/Unit/Service/DependencyOrderingServiceTest.php
typo3/sysext/core/ext_localconf.php
typo3/sysext/extbase/Tests/Functional/Persistence/EnableFieldsTest.php
typo3/sysext/frontend/Tests/Unit/Authentication/FrontendUserAuthenticationTest.php
typo3/sysext/rsaauth/Classes/RsaAuthService.php
typo3/sysext/saltedpasswords/Classes/SaltedPasswordService.php
typo3/sysext/saltedpasswords/ext_localconf.php
typo3/sysext/sv/Classes/AbstractAuthenticationService.php [deleted file]
typo3/sysext/sv/Classes/AuthenticationService.php [deleted file]
typo3/sysext/sv/LICENSE.txt [deleted file]
typo3/sysext/sv/Resources/Public/Icons/Extension.png [deleted file]
typo3/sysext/sv/Tests/Functional/AuthenticationServiceTest.php [deleted file]
typo3/sysext/sv/Tests/Functional/Fixtures/be_users.xml [deleted file]
typo3/sysext/sv/Tests/Unit/AuthenticationServiceTest.php [deleted file]
typo3/sysext/sv/composer.json [deleted file]
typo3/sysext/sv/ext_emconf.php [deleted file]
typo3/sysext/sv/ext_localconf.php [deleted file]

index 7d5a865..1cbd008 100644 (file)
                "typo3/cms-saltedpasswords": "self.version",
                "typo3/cms-scheduler": "self.version",
                "typo3/cms-setup": "self.version",
-               "typo3/cms-sv": "self.version",
                "typo3/cms-sys-action": "self.version",
                "typo3/cms-sys-note": "self.version",
                "typo3/cms-t3editor": "self.version",
                        "TYPO3\\CMS\\Saltedpasswords\\": "typo3/sysext/saltedpasswords/Classes/",
                        "TYPO3\\CMS\\Scheduler\\": "typo3/sysext/scheduler/Classes/",
                        "TYPO3\\CMS\\Setup\\": "typo3/sysext/setup/Classes/",
-                       "TYPO3\\CMS\\Sv\\": "typo3/sysext/sv/Classes/",
                        "TYPO3\\CMS\\SysAction\\": "typo3/sysext/sys_action/Classes/",
                        "TYPO3\\CMS\\SysNote\\": "typo3/sysext/sys_note/Classes/",
                        "TYPO3\\CMS\\T3editor\\": "typo3/sysext/t3editor/Classes/",
                        "TYPO3\\CMS\\Rsaauth\\Tests\\": "typo3/sysext/rsaauth/Tests/",
                        "TYPO3\\CMS\\Saltedpasswords\\Tests\\": "typo3/sysext/saltedpasswords/Tests/",
                        "TYPO3\\CMS\\Scheduler\\Tests\\": "typo3/sysext/scheduler/Tests/",
-                       "TYPO3\\CMS\\Sv\\Tests\\": "typo3/sysext/sv/Tests/",
                        "TYPO3\\CMS\\SysAction\\Tests\\": "typo3/sysext/sys_action/Tests/",
                        "TYPO3\\CMS\\SysNote\\Tests\\": "typo3/sysext/sys_note/Tests/",
                        "TYPO3\\CMS\\Workspaces\\Tests\\": "typo3/sysext/workspaces/Tests/",
index 981dd92..2cb1911 100644 (file)
@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
         "This file is @generated automatically"
     ],
-    "content-hash": "38b5eeddadb3daba2d9fd4f6706b16e9",
+    "content-hash": "546e2c9d87c42a0c785bb55ec036056a",
     "packages": [
         {
             "name": "cogpowered/finediff",
diff --git a/typo3/sysext/core/Classes/Authentication/AbstractAuthenticationService.php b/typo3/sysext/core/Classes/Authentication/AbstractAuthenticationService.php
new file mode 100644 (file)
index 0000000..daa7059
--- /dev/null
@@ -0,0 +1,148 @@
+<?php
+namespace TYPO3\CMS\Core\Authentication;
+
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+use TYPO3\CMS\Core\Service\AbstractService;
+
+/**
+ * Authentication services class
+ */
+class AbstractAuthenticationService extends AbstractService
+{
+    /**
+     * User object
+     *
+     * @var AbstractUserAuthentication
+     */
+    public $pObj;
+
+    /**
+     * Subtype of the service which is used to call the service.
+     *
+     * @var string
+     */
+    public $mode;
+
+    /**
+     * Submitted login form data
+     *
+     * @var array
+     */
+    public $login = [];
+
+    /**
+     * Various data
+     *
+     * @var array
+     */
+    public $authInfo = [];
+
+    /**
+     * User db table definition
+     *
+     * @var array
+     */
+    public $db_user = [];
+
+    /**
+     * Usergroups db table definition
+     *
+     * @var array
+     */
+    public $db_groups = [];
+
+    /**
+     * If the writelog() functions is called if a login-attempt has be tried without success
+     *
+     * @var bool
+     */
+    public $writeAttemptLog = false;
+
+    /**
+     * If the \TYPO3\CMS\Core\Utility\GeneralUtility::devLog() function should be used
+     *
+     * @var bool
+     */
+    public $writeDevLog = false;
+
+    /**
+     * Initialize authentication service
+     *
+     * @param string $mode Subtype of the service which is used to call the service.
+     * @param array $loginData Submitted login form data
+     * @param array $authInfo Information array. Holds submitted form data etc.
+     * @param AbstractUserAuthentication $pObj Parent object
+     */
+    public function initAuth($mode, $loginData, $authInfo, $pObj)
+    {
+        $this->pObj = $pObj;
+        // Sub type
+        $this->mode = $mode;
+        $this->login = $loginData;
+        $this->authInfo = $authInfo;
+        $this->db_user = $this->getServiceOption('db_user', $authInfo['db_user'], false);
+        $this->db_groups = $this->getServiceOption('db_groups', $authInfo['db_groups'], false);
+        $this->writeAttemptLog = $this->pObj->writeAttemptLog;
+        $this->writeDevLog = $this->pObj->writeDevLog;
+    }
+
+    /**
+     * Check the login data with the user record data for builtin login methods
+     *
+     * @param array $user User data array
+     * @param array $loginData Login data array
+     * @param string $passwordCompareStrategy Password compare strategy
+     * @return bool TRUE if login data matched
+     */
+    public function compareUident(array $user, array $loginData, $passwordCompareStrategy = '')
+    {
+        return $this->pObj->compareUident($user, $loginData, $passwordCompareStrategy);
+    }
+
+    /**
+     * Writes to log database table in pObj
+     *
+     * @param int $type denotes which module that has submitted the entry. This is the current list:  1=tce_db; 2=tce_file; 3=system (eg. sys_history save); 4=modules; 254=Personal settings changed; 255=login / out action: 1=login, 2=logout, 3=failed login (+ errorcode 3), 4=failure_warning_email sent
+     * @param int $action denotes which specific operation that wrote the entry (eg. 'delete', 'upload', 'update' and so on...). Specific for each $type. Also used to trigger update of the interface. (see the log-module for the meaning of each number !!)
+     * @param int $error flag. 0 = message, 1 = error (user problem), 2 = System Error (which should not happen), 3 = security notice (admin)
+     * @param int $details_nr The message number. Specific for each $type and $action. in the future this will make it possible to translate error messages to other languages
+     * @param string $details Default text that follows the message
+     * @param array $data Data that follows the log. Might be used to carry special information. If an array the first 5 entries (0-4) will be sprintf'ed the details-text...
+     * @param string $tablename Special field used by tce_main.php. These ($tablename, $recuid, $recpid) holds the reference to the record which the log-entry is about. (Was used in attic status.php to update the interface.)
+     * @param int|string $recuid Special field used by tce_main.php. These ($tablename, $recuid, $recpid) holds the reference to the record which the log-entry is about. (Was used in attic status.php to update the interface.)
+     * @param int|string $recpid Special field used by tce_main.php. These ($tablename, $recuid, $recpid) holds the reference to the record which the log-entry is about. (Was used in attic status.php to update the interface.)
+     */
+    public function writelog($type, $action, $error, $details_nr, $details, $data, $tablename = '', $recuid = '', $recpid = '')
+    {
+        if ($this->writeAttemptLog) {
+            $this->pObj->writelog($type, $action, $error, $details_nr, $details, $data, $tablename, $recuid, $recpid);
+        }
+    }
+
+    /**
+     * Get a user from DB by username
+     *
+     * @param string $username User name
+     * @param string $extraWhere Additional WHERE clause: " AND ...
+     * @param array|string $dbUserSetup User db table definition, or empty string for $this->db_user
+     * @return mixed User array or FALSE
+     */
+    public function fetchUserRecord($username, $extraWhere = '', $dbUserSetup = '')
+    {
+        $dbUser = is_array($dbUserSetup) ? $dbUserSetup : $this->db_user;
+        $user = $this->pObj->fetchUserRecord($dbUser, $username, $extraWhere);
+        return $user;
+    }
+}
index 0fd2b54..0941a85 100644 (file)
@@ -32,7 +32,6 @@ use TYPO3\CMS\Core\Session\Backend\SessionBackendInterface;
 use TYPO3\CMS\Core\Session\SessionManager;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Core\Utility\MathUtility;
-use TYPO3\CMS\Sv\AuthenticationService;
 
 /**
  * Authentication of users in TYPO3
@@ -662,7 +661,6 @@ abstract class AbstractUserAuthentication
             // Use 'auth' service to find the user
             // First found user will be used
             $subType = 'getUser' . $this->loginType;
-            /** @var AuthenticationService $serviceObj */
             foreach ($this->getAuthServices($subType, $loginData, $authInfo) as $serviceObj) {
                 if ($row = $serviceObj->getUser()) {
                     $tempuserArr[] = $row;
diff --git a/typo3/sysext/core/Classes/Authentication/AuthenticationService.php b/typo3/sysext/core/Classes/Authentication/AuthenticationService.php
new file mode 100644 (file)
index 0000000..f330719
--- /dev/null
@@ -0,0 +1,267 @@
+<?php
+namespace TYPO3\CMS\Core\Authentication;
+
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+use TYPO3\CMS\Core\Database\Connection;
+use TYPO3\CMS\Core\Database\ConnectionPool;
+use TYPO3\CMS\Core\Database\Query\Restriction\HiddenRestriction;
+use TYPO3\CMS\Core\Utility\GeneralUtility;
+
+/**
+ * Authentication services class
+ */
+class AuthenticationService extends AbstractAuthenticationService
+{
+    /**
+     * Process the submitted credentials.
+     * In this case hash the clear text password if it has been submitted.
+     *
+     * @param array $loginData Credentials that are submitted and potentially modified by other services
+     * @param string $passwordTransmissionStrategy Keyword of how the password has been hashed or encrypted before submission
+     * @return bool
+     */
+    public function processLoginData(array &$loginData, $passwordTransmissionStrategy)
+    {
+        $isProcessed = false;
+        if ($passwordTransmissionStrategy === 'normal') {
+            $loginData['uident_text'] = $loginData['uident'];
+            $isProcessed = true;
+        }
+        return $isProcessed;
+    }
+
+    /**
+     * Find a user (eg. look up the user record in database when a login is sent)
+     *
+     * @return mixed User array or FALSE
+     */
+    public function getUser()
+    {
+        if ($this->login['status'] !== 'login') {
+            return false;
+        }
+        if ((string)$this->login['uident_text'] === '') {
+            // Failed Login attempt (no password given)
+            $this->writelog(255, 3, 3, 2, 'Login-attempt from %s (%s) for username \'%s\' with an empty password!', [
+                $this->authInfo['REMOTE_ADDR'], $this->authInfo['REMOTE_HOST'], $this->login['uname']
+            ]);
+            GeneralUtility::sysLog(sprintf('Login-attempt from %s (%s), for username \'%s\' with an empty password!', $this->authInfo['REMOTE_ADDR'], $this->authInfo['REMOTE_HOST'], $this->login['uname']), 'Core', GeneralUtility::SYSLOG_SEVERITY_WARNING);
+            return false;
+        }
+
+        $user = $this->fetchUserRecord($this->login['uname']);
+        if (!is_array($user)) {
+            // Failed login attempt (no username found)
+            $this->writelog(255, 3, 3, 2, 'Login-attempt from %s (%s), username \'%s\' not found!!', [$this->authInfo['REMOTE_ADDR'], $this->authInfo['REMOTE_HOST'], $this->login['uname']]);
+            // Logout written to log
+            GeneralUtility::sysLog(sprintf('Login-attempt from %s (%s), username \'%s\' not found!', $this->authInfo['REMOTE_ADDR'], $this->authInfo['REMOTE_HOST'], $this->login['uname']), 'core', GeneralUtility::SYSLOG_SEVERITY_WARNING);
+        } else {
+            if ($this->writeDevLog) {
+                GeneralUtility::devLog('User found: ' . GeneralUtility::arrayToLogString($user, [$this->db_user['userid_column'], $this->db_user['username_column']]), self::class);
+            }
+        }
+        return $user;
+    }
+
+    /**
+     * Authenticate a user (Check various conditions for the user that might invalidate its authentication, eg. password match, domain, IP, etc.)
+     *
+     * @param array $user Data of user.
+     * @return int >= 200: User authenticated successfully.
+     *                     No more checking is needed by other auth services.
+     *             >= 100: User not authenticated; this service is not responsible.
+     *                     Other auth services will be asked.
+     *             > 0:    User authenticated successfully.
+     *                     Other auth services will still be asked.
+     *             <= 0:   Authentication failed, no more checking needed
+     *                     by other auth services.
+     */
+    public function authUser(array $user)
+    {
+        $OK = 100;
+        // This authentication service can only work correctly, if a non empty username along with a non empty password is provided.
+        // Otherwise a different service is allowed to check for other login credentials
+        if ((string)$this->login['uident_text'] !== '' && (string)$this->login['uname'] !== '') {
+            // Checking password match for user:
+            $OK = $this->compareUident($user, $this->login);
+            if (!$OK) {
+                // Failed login attempt (wrong password) - write that to the log!
+                if ($this->writeAttemptLog) {
+                    $this->writelog(255, 3, 3, 1, 'Login-attempt from %s (%s), username \'%s\', password not accepted!', [$this->authInfo['REMOTE_ADDR'], $this->authInfo['REMOTE_HOST'], $this->login['uname']]);
+                    GeneralUtility::sysLog(sprintf('Login-attempt from %s (%s), username \'%s\', password not accepted!', $this->authInfo['REMOTE_ADDR'], $this->authInfo['REMOTE_HOST'], $this->login['uname']), 'core', GeneralUtility::SYSLOG_SEVERITY_WARNING);
+                }
+                if ($this->writeDevLog) {
+                    GeneralUtility::devLog('Password not accepted: ' . $this->login['uident'], self::class, 2);
+                }
+            }
+            // Checking the domain (lockToDomain)
+            if ($OK && $user['lockToDomain'] && $user['lockToDomain'] !== $this->authInfo['HTTP_HOST']) {
+                // Lock domain didn't match, so error:
+                if ($this->writeAttemptLog) {
+                    $this->writelog(255, 3, 3, 1, 'Login-attempt from %s (%s), username \'%s\', locked domain \'%s\' did not match \'%s\'!', [$this->authInfo['REMOTE_ADDR'], $this->authInfo['REMOTE_HOST'], $user[$this->db_user['username_column']], $user['lockToDomain'], $this->authInfo['HTTP_HOST']]);
+                    GeneralUtility::sysLog(sprintf('Login-attempt from %s (%s), username \'%s\', locked domain \'%s\' did not match \'%s\'!', $this->authInfo['REMOTE_ADDR'], $this->authInfo['REMOTE_HOST'], $user[$this->db_user['username_column']], $user['lockToDomain'], $this->authInfo['HTTP_HOST']), 'core', GeneralUtility::SYSLOG_SEVERITY_WARNING);
+                }
+                $OK = 0;
+            }
+        }
+        return $OK;
+    }
+
+    /**
+     * Find usergroup records, currently only for frontend
+     *
+     * @param array $user Data of user.
+     * @param array $knownGroups Group data array of already known groups. This is handy if you want select other related groups. Keys in this array are unique IDs of those groups.
+     * @return mixed Groups array, keys = uid which must be unique
+     */
+    public function getGroups($user, $knownGroups)
+    {
+        /*
+         * Attention: $knownGroups is not used within this method, but other services can use it.
+         * This parameter should not be removed!
+         * The FrontendUserAuthentication call getGroups and handover the previous detected groups.
+         */
+        $groupDataArr = [];
+        if ($this->mode === 'getGroupsFE') {
+            $groups = [];
+            if (is_array($user) && $user[$this->db_user['usergroup_column']]) {
+                $groupList = $user[$this->db_user['usergroup_column']];
+                $groups = [];
+                $this->getSubGroups($groupList, '', $groups);
+            }
+            // ADD group-numbers if the IPmask matches.
+            if (is_array($GLOBALS['TYPO3_CONF_VARS']['FE']['IPmaskMountGroups'])) {
+                foreach ($GLOBALS['TYPO3_CONF_VARS']['FE']['IPmaskMountGroups'] as $IPel) {
+                    if ($this->authInfo['REMOTE_ADDR'] && $IPel[0] && GeneralUtility::cmpIP($this->authInfo['REMOTE_ADDR'], $IPel[0])) {
+                        $groups[] = (int)$IPel[1];
+                    }
+                }
+            }
+            $groups = array_unique($groups);
+            if (!empty($groups)) {
+                if ($this->writeDevLog) {
+                    GeneralUtility::devLog('Get usergroups with id: ' . implode(',', $groups), __CLASS__);
+                }
+                $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
+                    ->getQueryBuilderForTable($this->db_groups['table']);
+                if (!empty($this->authInfo['showHiddenRecords'])) {
+                    $queryBuilder->getRestrictions()->removeByType(HiddenRestriction::class);
+                }
+
+                $res = $queryBuilder->select('*')
+                    ->from($this->db_groups['table'])
+                    ->where(
+                        $queryBuilder->expr()->in(
+                            'uid',
+                            $queryBuilder->createNamedParameter($groups, Connection::PARAM_INT_ARRAY)
+                        ),
+                        $queryBuilder->expr()->orX(
+                            $queryBuilder->expr()->eq(
+                                'lockToDomain',
+                                $queryBuilder->createNamedParameter('', \PDO::PARAM_STR)
+                            ),
+                            $queryBuilder->expr()->isNull('lockToDomain'),
+                            $queryBuilder->expr()->eq(
+                                'lockToDomain',
+                                $queryBuilder->createNamedParameter($this->authInfo['HTTP_HOST'], \PDO::PARAM_STR)
+                            )
+                        )
+                    )
+                    ->execute();
+
+                while ($row = $res->fetch()) {
+                    $groupDataArr[$row['uid']] = $row;
+                }
+            } else {
+                if ($this->writeDevLog) {
+                    GeneralUtility::devLog('No usergroups found.', self::class, 2);
+                }
+            }
+        }
+        return $groupDataArr;
+    }
+
+    /**
+     * Fetches subgroups of groups. Function is called recursively for each subgroup.
+     * Function was previously copied from
+     * \TYPO3\CMS\Core\Authentication\BackendUserAuthentication->fetchGroups and has been slightly modified.
+     *
+     * @param string $grList Commalist of fe_groups uid numbers
+     * @param string $idList List of already processed fe_groups-uids so the function will not fall into an eternal recursion.
+     * @param array $groups
+     * @return array
+     * @access private
+     */
+    public function getSubGroups($grList, $idList = '', &$groups)
+    {
+        // Fetching records of the groups in $grList (which are not blocked by lockedToDomain either):
+        $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('fe_groups');
+        if (!empty($this->authInfo['showHiddenRecords'])) {
+            $queryBuilder->getRestrictions()->removeByType(HiddenRestriction::class);
+        }
+
+        $res = $queryBuilder
+            ->select('uid', 'subgroup')
+            ->from($this->db_groups['table'])
+            ->where(
+                $queryBuilder->expr()->in(
+                    'uid',
+                    $queryBuilder->createNamedParameter(
+                        GeneralUtility::intExplode(',', $grList, true),
+                        Connection::PARAM_INT_ARRAY
+                    )
+                ),
+                $queryBuilder->expr()->orX(
+                    $queryBuilder->expr()->eq(
+                        'lockToDomain',
+                        $queryBuilder->createNamedParameter('', \PDO::PARAM_STR)
+                    ),
+                    $queryBuilder->expr()->isNull('lockToDomain'),
+                    $queryBuilder->expr()->eq(
+                        'lockToDomain',
+                        $queryBuilder->createNamedParameter($this->authInfo['HTTP_HOST'], \PDO::PARAM_STR)
+                    )
+                )
+            )
+            ->execute();
+
+        // Internal group record storage
+        $groupRows = [];
+        // The groups array is filled
+        while ($row = $res->fetch()) {
+            if (!in_array($row['uid'], $groups)) {
+                $groups[] = $row['uid'];
+            }
+            $groupRows[$row['uid']] = $row;
+        }
+        // Traversing records in the correct order
+        $include_staticArr = GeneralUtility::intExplode(',', $grList);
+        // traversing list
+        foreach ($include_staticArr as $uid) {
+            // Get row:
+            $row = $groupRows[$uid];
+            // Must be an array and $uid should not be in the idList, because then it is somewhere previously in the grouplist
+            if (is_array($row) && !GeneralUtility::inList($idList, $uid)) {
+                // Include sub groups
+                if (trim($row['subgroup'])) {
+                    // Make integer list
+                    $theList = implode(',', GeneralUtility::intExplode(',', $row['subgroup']));
+                    // Call recursively, pass along list of already processed groups so they are not processed again.
+                    $this->getSubGroups($theList, $idList . ',' . $uid, $groups);
+                }
+            }
+        }
+    }
+}
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Breaking-81735-GetRidOfSysextsv.rst b/typo3/sysext/core/Documentation/Changelog/master/Breaking-81735-GetRidOfSysextsv.rst
new file mode 100644 (file)
index 0000000..707574d
--- /dev/null
@@ -0,0 +1,32 @@
+.. include:: ../../Includes.txt
+
+=======================================
+Breaking: #81735 - Get rid of sysext:sv
+=======================================
+
+See :issue:`81735`
+
+Description
+===========
+
+The AuthenticationService has been moved into sysext:core. Class aliases are in place and will be removed with TYPO3 v10.
+
+
+Impact
+======
+
+The namespace of the classes :php:`AbstractAuthenticationService` and :php:`AuthenticationService` changed from :php:`\TYPO3\CMS\Sv` to :php:`\TYPO3\CMS\Core\Authentication`.
+
+
+Affected Installations
+======================
+
+All instances, that use or extend the mentioned classes.
+
+
+Migration
+=========
+
+Use the new namespaces as mentioned above.
+
+.. index:: Backend, PHP-API
\ No newline at end of file
index 422fa7f..cf0a15d 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 return [
     'TYPO3\\CMS\\Lang\\LanguageService' => \TYPO3\CMS\Core\Localization\LanguageService::class,
-    'TYPO3\\CMS\\ContextHelp\\Controller\\ContextHelpAjaxController' => \TYPO3\CMS\Backend\Controller\ContextHelpAjaxController::class
+    'TYPO3\\CMS\\ContextHelp\\Controller\\ContextHelpAjaxController' => \TYPO3\CMS\Backend\Controller\ContextHelpAjaxController::class,
+    'TYPO3\\CMS\\Sv\\AbstractAuthenticationService' => \TYPO3\CMS\Core\Authentication\AbstractAuthenticationService::class,
+    'TYPO3\\CMS\\Sv\\AuthenticationService' => \TYPO3\CMS\Core\Authentication\AuthenticationService::class
 ];
index 869c201..0e31e02 100644 (file)
@@ -14,3 +14,12 @@ namespace TYPO3\CMS\ContextHelp\Controller {
     {
     }
 }
+
+namespace TYPO3\CMS\Sv {
+    class AbstractAuthenticationService extends \TYPO3\CMS\Core\Authentication\AbstractAuthenticationService
+    {
+    }
+    class AuthenticationService extends \TYPO3\CMS\Core\Authentication\AuthenticationService
+    {
+    }
+}
diff --git a/typo3/sysext/core/Tests/Functional/Authentication/AuthenticationServiceTest.php b/typo3/sysext/core/Tests/Functional/Authentication/AuthenticationServiceTest.php
new file mode 100644 (file)
index 0000000..15921f6
--- /dev/null
@@ -0,0 +1,62 @@
+<?php
+declare(strict_types=1);
+namespace TYPO3\CMS\Core\Tests\Functional\Authentication;
+
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+use TYPO3\CMS\Core\Authentication\AuthenticationService;
+use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
+
+/**
+ * Testcase for class \TYPO3\CMS\Core\Authentication\AuthenticationService
+ */
+class AuthenticationServiceTest extends \TYPO3\TestingFramework\Core\Functional\FunctionalTestCase
+{
+    /**
+     * @var AuthenticationService
+     */
+    protected $subject;
+
+    protected function setUp()
+    {
+        $this->subject = new AuthenticationService();
+        parent::setUp();
+        $this->importDataSet(ORIGINAL_ROOT . 'typo3/sysext/core/Tests/Functional/Fixtures/be_users.xml');
+    }
+
+    /**
+     * @test
+     */
+    public function getUserReturnsOnlyNotDeletedRecords()
+    {
+        $this->subject->pObj = new BackendUserAuthentication();
+        $this->subject->login = [
+            'status' => 'login',
+            'uname' => 'test1',
+            'uident' => 'password',
+            'uident_text' => 'password',
+        ];
+        $this->subject->db_user = [
+            'table' => 'be_users',
+            'check_pid_clause' => '',
+            'enable_clause' => '',
+            'username_column' => 'username',
+        ];
+        $expected = [
+            'username' => 'test1',
+            'deleted' => 0
+        ];
+        $result = $this->subject->getUser();
+        $this->assertArraySubset($expected, $result);
+    }
+}
diff --git a/typo3/sysext/core/Tests/Functional/Fixtures/be_users.xml b/typo3/sysext/core/Tests/Functional/Fixtures/be_users.xml
new file mode 100644 (file)
index 0000000..09cf81f
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<dataset>
+    <be_users>
+        <uid>1</uid>
+        <pid>1</pid>
+        <username>admin</username>
+        <deleted>0</deleted>
+    </be_users>
+    <be_users>
+        <uid>2</uid>
+        <pid>1</pid>
+        <username>test1</username>
+        <deleted>1</deleted>
+    </be_users>
+    <be_users>
+        <uid>3</uid>
+        <pid>1</pid>
+        <username>test1</username>
+        <deleted>0</deleted>
+    </be_users>
+</dataset>
diff --git a/typo3/sysext/core/Tests/Unit/Authentication/AuthenticationServiceTest.php b/typo3/sysext/core/Tests/Unit/Authentication/AuthenticationServiceTest.php
new file mode 100644 (file)
index 0000000..10fe662
--- /dev/null
@@ -0,0 +1,74 @@
+<?php
+namespace TYPO3\CMS\Core\Tests\Unit\Authentication;
+
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+use TYPO3\CMS\Core\Authentication\AuthenticationService;
+
+/**
+ * Testcase for class \TYPO3\CMS\Core\Authentication\AuthenticationService
+ */
+class AuthenticationServiceTest extends \TYPO3\TestingFramework\Core\Unit\UnitTestCase
+{
+    /**
+     * Date provider for processLoginReturnsCorrectData
+     *
+     * @return array
+     */
+    public function processLoginDataProvider()
+    {
+        return [
+            'Backend login with securityLevel "normal"' => [
+                'normal',
+                [
+                    'status' => 'login',
+                    'uname' => 'admin',
+                    'uident' => 'password',
+                ],
+                [
+                    'status' => 'login',
+                    'uname' => 'admin',
+                    'uident' => 'password',
+                    'uident_text' => 'password',
+                ]
+            ],
+            'Frontend login with securityLevel "normal"' => [
+                'normal',
+                [
+                    'status' => 'login',
+                    'uname' => 'admin',
+                    'uident' => 'password',
+                ],
+                [
+                    'status' => 'login',
+                    'uname' => 'admin',
+                    'uident' => 'password',
+                    'uident_text' => 'password',
+                ]
+            ],
+        ];
+    }
+
+    /**
+     * @test
+     * @dataProvider processLoginDataProvider
+     */
+    public function processLoginReturnsCorrectData($passwordSubmissionStrategy, $loginData, $expectedProcessedData)
+    {
+        /** @var $authenticationService AuthenticationService */
+        $authenticationService = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(AuthenticationService::class);
+        // Login data is modified by reference
+        $authenticationService->processLoginData($loginData, $passwordSubmissionStrategy);
+        $this->assertEquals($expectedProcessedData, $loginData);
+    }
+}
index 3250024..2b04e51 100644 (file)
@@ -410,44 +410,29 @@ class DependencyOrderingServiceTest extends \TYPO3\TestingFramework\Core\Unit\Un
                         'before' => [],
                         'after' => ['core'],
                     ],
-                    'sv' => [
-                        'before' => [],
-                        'after' => ['core'],
-                    ],
                 ],
                 [ // graph
                     'core' => [
                         'core' => false,
                         'setup' => false,
-                        'sv' => false,
                         'scheduler' => false,
                         'openid' => false,
                     ],
                     'openid' => [
                         'core' => true,
                         'setup' => true,
-                        'sv' => false,
                         'scheduler' => false,
                         'openid' => false,
                     ],
                     'scheduler' => [
                         'core' => true,
                         'setup' => false,
-                        'sv' => false,
                         'scheduler' => false,
                         'openid' => false,
                     ],
                     'setup' => [
                         'core' => true,
                         'setup' => false,
-                        'sv' => false,
-                        'scheduler' => false,
-                        'openid' => false,
-                    ],
-                    'sv' => [
-                        'core' => true,
-                        'setup' => false,
-                        'sv' => false,
                         'scheduler' => false,
                         'openid' => false,
                     ],
index 89fc87c..aba4f60 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+
 defined('TYPO3_MODE') or die();
 
 /** @var \TYPO3\CMS\Extbase\SignalSlot\Dispatcher $signalSlotDispatcher */
@@ -102,3 +103,21 @@ unset($textExtractorRegistry);
 $extractorRegistry = \TYPO3\CMS\Core\Resource\Index\ExtractorRegistry::getInstance();
 $extractorRegistry->registerExtractionService(\TYPO3\CMS\Core\Resource\OnlineMedia\Metadata\Extractor::class);
 unset($extractorRegistry);
+
+// Register base authentication service
+\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addService(
+    'core',
+    'auth',
+    \TYPO3\CMS\Core\Authentication\AuthenticationService::class,
+    [
+        'title' => 'User authentication',
+        'description' => 'Authentication with username/password.',
+        'subtype' => 'getUserBE,getUserFE,authUserFE,getGroupsFE,processLoginDataBE,processLoginDataFE',
+        'available' => true,
+        'priority' => 50,
+        'quality' => 50,
+        'os' => '',
+        'exec' => '',
+        'className' => TYPO3\CMS\Core\Authentication\AuthenticationService::class
+    ]
+);
index c5331bc..fbf7ea7 100644 (file)
@@ -31,7 +31,7 @@ class EnableFieldsTest extends AbstractDataHandlerActionTestCase
     /**
      * @var array
      */
-    protected $coreExtensionsToLoad = ['sv', 'extbase', 'fluid'];
+    protected $coreExtensionsToLoad = ['core', 'extbase', 'fluid'];
 
     /**
      * Sets up this test suite.
index a4bf731..ca1aeeb 100644 (file)
@@ -17,6 +17,7 @@ namespace TYPO3\CMS\Frontend\Tests\Unit\Authentication;
 
 use Doctrine\DBAL\Statement;
 use Prophecy\Argument;
+use TYPO3\CMS\Core\Authentication\AuthenticationService;
 use TYPO3\CMS\Core\Crypto\Random;
 use TYPO3\CMS\Core\Database\ConnectionPool;
 use TYPO3\CMS\Core\Database\Query\Expression\CompositeExpression;
@@ -27,7 +28,6 @@ use TYPO3\CMS\Core\Session\Backend\SessionBackendInterface;
 use TYPO3\CMS\Core\Session\SessionManager;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Frontend\Authentication\FrontendUserAuthentication;
-use TYPO3\CMS\Sv\AuthenticationService;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 /**
index 85a2a4d..5a2b08a 100644 (file)
@@ -14,16 +14,17 @@ namespace TYPO3\CMS\Rsaauth;
  * The TYPO3 project - inspiring people to share!
  */
 
+use TYPO3\CMS\Core\Authentication\AuthenticationService;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 
 /**
  * Service "RSA authentication" for the "rsaauth" extension. This service will
  * authenticate a user using hos password encoded with one time public key. It
  * uses the standard TYPO3 service to do all dirty work. Firsts, it will decode
- * the password and then pass it to the parent service ('sv'). This ensures that it
+ * the password and then pass it to the parent service ('core'). This ensures that it
  * always works, even if other TYPO3 internals change.
  */
-class RsaAuthService extends \TYPO3\CMS\Sv\AuthenticationService
+class RsaAuthService extends AuthenticationService
 {
     /**
      * @var RsaEncryptionDecoder
index 63cfd6d..ca31e93 100644 (file)
@@ -13,6 +13,7 @@ namespace TYPO3\CMS\Saltedpasswords;
  *
  * The TYPO3 project - inspiring people to share!
  */
+use TYPO3\CMS\Core\Authentication\AbstractAuthenticationService;
 use TYPO3\CMS\Core\Database\ConnectionPool;
 use TYPO3\CMS\Core\TimeTracker\TimeTracker;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
@@ -21,7 +22,7 @@ use TYPO3\CMS\Core\Utility\GeneralUtility;
  * Class implements salted-password hashes authentication service.
  * Contains authentication service class for salted hashed passwords.
  */
-class SaltedPasswordService extends \TYPO3\CMS\Sv\AbstractAuthenticationService
+class SaltedPasswordService extends AbstractAuthenticationService
 {
     /**
      * Keeps class name.
index c8d96a5..12f964f 100644 (file)
@@ -18,7 +18,7 @@ $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/saltedpasswords']['saltMethods']
     'subtype' => 'authUserFE,authUserBE',
     'available' => true,
     'priority' => 70,
-    // must be higher than \TYPO3\CMS\Sv\AuthenticationService (50) and rsaauth (60) but lower than OpenID (75)
+    // must be higher than \TYPO3\CMS\Core\Authentication\AuthenticationService (50) and rsaauth (60) but lower than OpenID (75)
     'quality' => 70,
     'os' => '',
     'exec' => '',
diff --git a/typo3/sysext/sv/Classes/AbstractAuthenticationService.php b/typo3/sysext/sv/Classes/AbstractAuthenticationService.php
deleted file mode 100644 (file)
index ff52a2f..0000000
+++ /dev/null
@@ -1,149 +0,0 @@
-<?php
-namespace TYPO3\CMS\Sv;
-
-/*
- * This file is part of the TYPO3 CMS project.
- *
- * It is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License, either version 2
- * of the License, or any later version.
- *
- * For the full copyright and license information, please read the
- * LICENSE.txt file that was distributed with this source code.
- *
- * The TYPO3 project - inspiring people to share!
- */
-
-use TYPO3\CMS\Core\Authentication\AbstractUserAuthentication;
-use TYPO3\CMS\Core\Service\AbstractService;
-
-/**
- * Authentication services class
- */
-class AbstractAuthenticationService extends AbstractService
-{
-    /**
-     * User object
-     *
-     * @var AbstractUserAuthentication
-     */
-    public $pObj;
-
-    /**
-     * Subtype of the service which is used to call the service.
-     *
-     * @var string
-     */
-    public $mode;
-
-    /**
-     * Submitted login form data
-     *
-     * @var array
-     */
-    public $login = [];
-
-    /**
-     * Various data
-     *
-     * @var array
-     */
-    public $authInfo = [];
-
-    /**
-     * User db table definition
-     *
-     * @var array
-     */
-    public $db_user = [];
-
-    /**
-     * Usergroups db table definition
-     *
-     * @var array
-     */
-    public $db_groups = [];
-
-    /**
-     * If the writelog() functions is called if a login-attempt has be tried without success
-     *
-     * @var bool
-     */
-    public $writeAttemptLog = false;
-
-    /**
-     * If the \TYPO3\CMS\Core\Utility\GeneralUtility::devLog() function should be used
-     *
-     * @var bool
-     */
-    public $writeDevLog = false;
-
-    /**
-     * Initialize authentication service
-     *
-     * @param string $mode Subtype of the service which is used to call the service.
-     * @param array $loginData Submitted login form data
-     * @param array $authInfo Information array. Holds submitted form data etc.
-     * @param AbstractUserAuthentication $pObj Parent object
-     */
-    public function initAuth($mode, $loginData, $authInfo, $pObj)
-    {
-        $this->pObj = $pObj;
-        // Sub type
-        $this->mode = $mode;
-        $this->login = $loginData;
-        $this->authInfo = $authInfo;
-        $this->db_user = $this->getServiceOption('db_user', $authInfo['db_user'], false);
-        $this->db_groups = $this->getServiceOption('db_groups', $authInfo['db_groups'], false);
-        $this->writeAttemptLog = $this->pObj->writeAttemptLog;
-        $this->writeDevLog = $this->pObj->writeDevLog;
-    }
-
-    /**
-     * Check the login data with the user record data for builtin login methods
-     *
-     * @param array $user User data array
-     * @param array $loginData Login data array
-     * @param string $passwordCompareStrategy Password compare strategy
-     * @return bool TRUE if login data matched
-     */
-    public function compareUident(array $user, array $loginData, $passwordCompareStrategy = '')
-    {
-        return $this->pObj->compareUident($user, $loginData, $passwordCompareStrategy);
-    }
-
-    /**
-     * Writes to log database table in pObj
-     *
-     * @param int $type denotes which module that has submitted the entry. This is the current list:  1=tce_db; 2=tce_file; 3=system (eg. sys_history save); 4=modules; 254=Personal settings changed; 255=login / out action: 1=login, 2=logout, 3=failed login (+ errorcode 3), 4=failure_warning_email sent
-     * @param int $action denotes which specific operation that wrote the entry (eg. 'delete', 'upload', 'update' and so on...). Specific for each $type. Also used to trigger update of the interface. (see the log-module for the meaning of each number !!)
-     * @param int $error flag. 0 = message, 1 = error (user problem), 2 = System Error (which should not happen), 3 = security notice (admin)
-     * @param int $details_nr The message number. Specific for each $type and $action. in the future this will make it possible to translate error messages to other languages
-     * @param string $details Default text that follows the message
-     * @param array $data Data that follows the log. Might be used to carry special information. If an array the first 5 entries (0-4) will be sprintf'ed the details-text...
-     * @param string $tablename Special field used by tce_main.php. These ($tablename, $recuid, $recpid) holds the reference to the record which the log-entry is about. (Was used in attic status.php to update the interface.)
-     * @param int|string $recuid Special field used by tce_main.php. These ($tablename, $recuid, $recpid) holds the reference to the record which the log-entry is about. (Was used in attic status.php to update the interface.)
-     * @param int|string $recpid Special field used by tce_main.php. These ($tablename, $recuid, $recpid) holds the reference to the record which the log-entry is about. (Was used in attic status.php to update the interface.)
-     */
-    public function writelog($type, $action, $error, $details_nr, $details, $data, $tablename = '', $recuid = '', $recpid = '')
-    {
-        if ($this->writeAttemptLog) {
-            $this->pObj->writelog($type, $action, $error, $details_nr, $details, $data, $tablename, $recuid, $recpid);
-        }
-    }
-
-    /**
-     * Get a user from DB by username
-     *
-     * @param string $username User name
-     * @param string $extraWhere Additional WHERE clause: " AND ...
-     * @param array|string $dbUserSetup User db table definition, or empty string for $this->db_user
-     * @return mixed User array or FALSE
-     */
-    public function fetchUserRecord($username, $extraWhere = '', $dbUserSetup = '')
-    {
-        $dbUser = is_array($dbUserSetup) ? $dbUserSetup : $this->db_user;
-        $user = $this->pObj->fetchUserRecord($dbUser, $username, $extraWhere);
-        return $user;
-    }
-}
diff --git a/typo3/sysext/sv/Classes/AuthenticationService.php b/typo3/sysext/sv/Classes/AuthenticationService.php
deleted file mode 100644 (file)
index 338bc9d..0000000
+++ /dev/null
@@ -1,267 +0,0 @@
-<?php
-namespace TYPO3\CMS\Sv;
-
-/*
- * This file is part of the TYPO3 CMS project.
- *
- * It is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License, either version 2
- * of the License, or any later version.
- *
- * For the full copyright and license information, please read the
- * LICENSE.txt file that was distributed with this source code.
- *
- * The TYPO3 project - inspiring people to share!
- */
-
-use TYPO3\CMS\Core\Database\Connection;
-use TYPO3\CMS\Core\Database\ConnectionPool;
-use TYPO3\CMS\Core\Database\Query\Restriction\HiddenRestriction;
-use TYPO3\CMS\Core\Utility\GeneralUtility;
-
-/**
- * Authentication services class
- */
-class AuthenticationService extends AbstractAuthenticationService
-{
-    /**
-     * Process the submitted credentials.
-     * In this case hash the clear text password if it has been submitted.
-     *
-     * @param array $loginData Credentials that are submitted and potentially modified by other services
-     * @param string $passwordTransmissionStrategy Keyword of how the password has been hashed or encrypted before submission
-     * @return bool
-     */
-    public function processLoginData(array &$loginData, $passwordTransmissionStrategy)
-    {
-        $isProcessed = false;
-        if ($passwordTransmissionStrategy === 'normal') {
-            $loginData['uident_text'] = $loginData['uident'];
-            $isProcessed = true;
-        }
-        return $isProcessed;
-    }
-
-    /**
-     * Find a user (eg. look up the user record in database when a login is sent)
-     *
-     * @return mixed User array or FALSE
-     */
-    public function getUser()
-    {
-        if ($this->login['status'] !== 'login') {
-            return false;
-        }
-        if ((string)$this->login['uident_text'] === '') {
-            // Failed Login attempt (no password given)
-            $this->writelog(255, 3, 3, 2, 'Login-attempt from %s (%s) for username \'%s\' with an empty password!', [
-                $this->authInfo['REMOTE_ADDR'], $this->authInfo['REMOTE_HOST'], $this->login['uname']
-            ]);
-            GeneralUtility::sysLog(sprintf('Login-attempt from %s (%s), for username \'%s\' with an empty password!', $this->authInfo['REMOTE_ADDR'], $this->authInfo['REMOTE_HOST'], $this->login['uname']), 'Core', GeneralUtility::SYSLOG_SEVERITY_WARNING);
-            return false;
-        }
-
-        $user = $this->fetchUserRecord($this->login['uname']);
-        if (!is_array($user)) {
-            // Failed login attempt (no username found)
-            $this->writelog(255, 3, 3, 2, 'Login-attempt from %s (%s), username \'%s\' not found!!', [$this->authInfo['REMOTE_ADDR'], $this->authInfo['REMOTE_HOST'], $this->login['uname']]);
-            // Logout written to log
-            GeneralUtility::sysLog(sprintf('Login-attempt from %s (%s), username \'%s\' not found!', $this->authInfo['REMOTE_ADDR'], $this->authInfo['REMOTE_HOST'], $this->login['uname']), 'core', GeneralUtility::SYSLOG_SEVERITY_WARNING);
-        } else {
-            if ($this->writeDevLog) {
-                GeneralUtility::devLog('User found: ' . GeneralUtility::arrayToLogString($user, [$this->db_user['userid_column'], $this->db_user['username_column']]), self::class);
-            }
-        }
-        return $user;
-    }
-
-    /**
-     * Authenticate a user (Check various conditions for the user that might invalidate its authentication, eg. password match, domain, IP, etc.)
-     *
-     * @param array $user Data of user.
-     * @return int >= 200: User authenticated successfully.
-     *                     No more checking is needed by other auth services.
-     *             >= 100: User not authenticated; this service is not responsible.
-     *                     Other auth services will be asked.
-     *             > 0:    User authenticated successfully.
-     *                     Other auth services will still be asked.
-     *             <= 0:   Authentication failed, no more checking needed
-     *                     by other auth services.
-     */
-    public function authUser(array $user)
-    {
-        $OK = 100;
-        // This authentication service can only work correctly, if a non empty username along with a non empty password is provided.
-        // Otherwise a different service is allowed to check for other login credentials
-        if ((string)$this->login['uident_text'] !== '' && (string)$this->login['uname'] !== '') {
-            // Checking password match for user:
-            $OK = $this->compareUident($user, $this->login);
-            if (!$OK) {
-                // Failed login attempt (wrong password) - write that to the log!
-                if ($this->writeAttemptLog) {
-                    $this->writelog(255, 3, 3, 1, 'Login-attempt from %s (%s), username \'%s\', password not accepted!', [$this->authInfo['REMOTE_ADDR'], $this->authInfo['REMOTE_HOST'], $this->login['uname']]);
-                    GeneralUtility::sysLog(sprintf('Login-attempt from %s (%s), username \'%s\', password not accepted!', $this->authInfo['REMOTE_ADDR'], $this->authInfo['REMOTE_HOST'], $this->login['uname']), 'core', GeneralUtility::SYSLOG_SEVERITY_WARNING);
-                }
-                if ($this->writeDevLog) {
-                    GeneralUtility::devLog('Password not accepted: ' . $this->login['uident'], self::class, 2);
-                }
-            }
-            // Checking the domain (lockToDomain)
-            if ($OK && $user['lockToDomain'] && $user['lockToDomain'] !== $this->authInfo['HTTP_HOST']) {
-                // Lock domain didn't match, so error:
-                if ($this->writeAttemptLog) {
-                    $this->writelog(255, 3, 3, 1, 'Login-attempt from %s (%s), username \'%s\', locked domain \'%s\' did not match \'%s\'!', [$this->authInfo['REMOTE_ADDR'], $this->authInfo['REMOTE_HOST'], $user[$this->db_user['username_column']], $user['lockToDomain'], $this->authInfo['HTTP_HOST']]);
-                    GeneralUtility::sysLog(sprintf('Login-attempt from %s (%s), username \'%s\', locked domain \'%s\' did not match \'%s\'!', $this->authInfo['REMOTE_ADDR'], $this->authInfo['REMOTE_HOST'], $user[$this->db_user['username_column']], $user['lockToDomain'], $this->authInfo['HTTP_HOST']), 'core', GeneralUtility::SYSLOG_SEVERITY_WARNING);
-                }
-                $OK = 0;
-            }
-        }
-        return $OK;
-    }
-
-    /**
-     * Find usergroup records, currently only for frontend
-     *
-     * @param array $user Data of user.
-     * @param array $knownGroups Group data array of already known groups. This is handy if you want select other related groups. Keys in this array are unique IDs of those groups.
-     * @return mixed Groups array, keys = uid which must be unique
-     */
-    public function getGroups($user, $knownGroups)
-    {
-        /*
-         * Attention: $knownGroups is not used within this method, but other services can use it.
-         * This parameter should not be removed!
-         * The FrontendUserAuthentication call getGroups and handover the previous detected groups.
-         */
-        $groupDataArr = [];
-        if ($this->mode === 'getGroupsFE') {
-            $groups = [];
-            if (is_array($user) && $user[$this->db_user['usergroup_column']]) {
-                $groupList = $user[$this->db_user['usergroup_column']];
-                $groups = [];
-                $this->getSubGroups($groupList, '', $groups);
-            }
-            // ADD group-numbers if the IPmask matches.
-            if (is_array($GLOBALS['TYPO3_CONF_VARS']['FE']['IPmaskMountGroups'])) {
-                foreach ($GLOBALS['TYPO3_CONF_VARS']['FE']['IPmaskMountGroups'] as $IPel) {
-                    if ($this->authInfo['REMOTE_ADDR'] && $IPel[0] && GeneralUtility::cmpIP($this->authInfo['REMOTE_ADDR'], $IPel[0])) {
-                        $groups[] = (int)$IPel[1];
-                    }
-                }
-            }
-            $groups = array_unique($groups);
-            if (!empty($groups)) {
-                if ($this->writeDevLog) {
-                    GeneralUtility::devLog('Get usergroups with id: ' . implode(',', $groups), __CLASS__);
-                }
-                $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
-                    ->getQueryBuilderForTable($this->db_groups['table']);
-                if (!empty($this->authInfo['showHiddenRecords'])) {
-                    $queryBuilder->getRestrictions()->removeByType(HiddenRestriction::class);
-                }
-
-                $res = $queryBuilder->select('*')
-                    ->from($this->db_groups['table'])
-                    ->where(
-                        $queryBuilder->expr()->in(
-                            'uid',
-                            $queryBuilder->createNamedParameter($groups, Connection::PARAM_INT_ARRAY)
-                        ),
-                        $queryBuilder->expr()->orX(
-                            $queryBuilder->expr()->eq(
-                                'lockToDomain',
-                                $queryBuilder->createNamedParameter('', \PDO::PARAM_STR)
-                            ),
-                            $queryBuilder->expr()->isNull('lockToDomain'),
-                            $queryBuilder->expr()->eq(
-                                'lockToDomain',
-                                $queryBuilder->createNamedParameter($this->authInfo['HTTP_HOST'], \PDO::PARAM_STR)
-                            )
-                        )
-                    )
-                    ->execute();
-
-                while ($row = $res->fetch()) {
-                    $groupDataArr[$row['uid']] = $row;
-                }
-            } else {
-                if ($this->writeDevLog) {
-                    GeneralUtility::devLog('No usergroups found.', self::class, 2);
-                }
-            }
-        }
-        return $groupDataArr;
-    }
-
-    /**
-     * Fetches subgroups of groups. Function is called recursively for each subgroup.
-     * Function was previously copied from
-     * \TYPO3\CMS\Core\Authentication\BackendUserAuthentication->fetchGroups and has been slightly modified.
-     *
-     * @param string $grList Commalist of fe_groups uid numbers
-     * @param string $idList List of already processed fe_groups-uids so the function will not fall into an eternal recursion.
-     * @param array $groups
-     * @return array
-     * @access private
-     */
-    public function getSubGroups($grList, $idList = '', &$groups)
-    {
-        // Fetching records of the groups in $grList (which are not blocked by lockedToDomain either):
-        $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('fe_groups');
-        if (!empty($this->authInfo['showHiddenRecords'])) {
-            $queryBuilder->getRestrictions()->removeByType(HiddenRestriction::class);
-        }
-
-        $res = $queryBuilder
-            ->select('uid', 'subgroup')
-            ->from($this->db_groups['table'])
-            ->where(
-                $queryBuilder->expr()->in(
-                    'uid',
-                    $queryBuilder->createNamedParameter(
-                        GeneralUtility::intExplode(',', $grList, true),
-                        Connection::PARAM_INT_ARRAY
-                    )
-                ),
-                $queryBuilder->expr()->orX(
-                    $queryBuilder->expr()->eq(
-                        'lockToDomain',
-                        $queryBuilder->createNamedParameter('', \PDO::PARAM_STR)
-                    ),
-                    $queryBuilder->expr()->isNull('lockToDomain'),
-                    $queryBuilder->expr()->eq(
-                        'lockToDomain',
-                        $queryBuilder->createNamedParameter($this->authInfo['HTTP_HOST'], \PDO::PARAM_STR)
-                    )
-                )
-            )
-            ->execute();
-
-        // Internal group record storage
-        $groupRows = [];
-        // The groups array is filled
-        while ($row = $res->fetch()) {
-            if (!in_array($row['uid'], $groups)) {
-                $groups[] = $row['uid'];
-            }
-            $groupRows[$row['uid']] = $row;
-        }
-        // Traversing records in the correct order
-        $include_staticArr = GeneralUtility::intExplode(',', $grList);
-        // traversing list
-        foreach ($include_staticArr as $uid) {
-            // Get row:
-            $row = $groupRows[$uid];
-            // Must be an array and $uid should not be in the idList, because then it is somewhere previously in the grouplist
-            if (is_array($row) && !GeneralUtility::inList($idList, $uid)) {
-                // Include sub groups
-                if (trim($row['subgroup'])) {
-                    // Make integer list
-                    $theList = implode(',', GeneralUtility::intExplode(',', $row['subgroup']));
-                    // Call recursively, pass along list of already processed groups so they are not processed again.
-                    $this->getSubGroups($theList, $idList . ',' . $uid, $groups);
-                }
-            }
-        }
-    }
-}
diff --git a/typo3/sysext/sv/LICENSE.txt b/typo3/sysext/sv/LICENSE.txt
deleted file mode 100644 (file)
index 95d36a7..0000000
+++ /dev/null
@@ -1,345 +0,0 @@
-Some icons used in the TYPO3 project are retrieved from the "Silk" icon set of
-Mark James, which can be found at http://famfamfam.com/lab/icons/silk/. This
-set is distributed under a Creative Commons Attribution 2.5 License. The
-license can be found at http://creativecommons.org/licenses/by/2.5/.
----------------------------------
-
-                    GNU GENERAL PUBLIC LICENSE
-                       Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-                            Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Lesser General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-                    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-                            NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-                     END OF TERMS AND CONDITIONS
-
-            How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program 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.
-
-    This program 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
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License along
-    with this program; if not, write to the Free Software Foundation, Inc.,
-    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.
diff --git a/typo3/sysext/sv/Resources/Public/Icons/Extension.png b/typo3/sysext/sv/Resources/Public/Icons/Extension.png
deleted file mode 100644 (file)
index c782b5b..0000000
Binary files a/typo3/sysext/sv/Resources/Public/Icons/Extension.png and /dev/null differ
diff --git a/typo3/sysext/sv/Tests/Functional/AuthenticationServiceTest.php b/typo3/sysext/sv/Tests/Functional/AuthenticationServiceTest.php
deleted file mode 100644 (file)
index a7fa385..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-<?php
-declare(strict_types=1);
-namespace TYPO3\CMS\Sv\Tests\Functional;
-
-/*
- * This file is part of the TYPO3 CMS project.
- *
- * It is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License, either version 2
- * of the License, or any later version.
- *
- * For the full copyright and license information, please read the
- * LICENSE.txt file that was distributed with this source code.
- *
- * The TYPO3 project - inspiring people to share!
- */
-use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
-use TYPO3\CMS\Sv\AuthenticationService;
-
-/**
- * Testcase for class \TYPO3\CMS\Sv\AuthenticationService
- */
-class AuthenticationServiceTest extends \TYPO3\TestingFramework\Core\Functional\FunctionalTestCase
-{
-    /**
-     * @var AuthenticationService
-     */
-    protected $subject;
-
-    protected function setUp()
-    {
-        $this->subject = new AuthenticationService();
-        parent::setUp();
-        $this->importDataSet(ORIGINAL_ROOT . 'typo3/sysext/sv/Tests/Functional/Fixtures/be_users.xml');
-    }
-
-    /**
-     * @test
-     */
-    public function getUserReturnsOnlyNotDeletedRecords()
-    {
-        $this->subject->pObj = new BackendUserAuthentication();
-        $this->subject->login = [
-            'status' => 'login',
-            'uname' => 'test1',
-            'uident' => 'password',
-            'uident_text' => 'password',
-        ];
-        $this->subject->db_user = [
-            'table' => 'be_users',
-            'check_pid_clause' => '',
-            'enable_clause' => '',
-            'username_column' => 'username',
-        ];
-        $expected = [
-            'username' => 'test1',
-            'deleted' => 0
-        ];
-        $result = $this->subject->getUser();
-        $this->assertArraySubset($expected, $result);
-    }
-}
diff --git a/typo3/sysext/sv/Tests/Functional/Fixtures/be_users.xml b/typo3/sysext/sv/Tests/Functional/Fixtures/be_users.xml
deleted file mode 100644 (file)
index 09cf81f..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<dataset>
-    <be_users>
-        <uid>1</uid>
-        <pid>1</pid>
-        <username>admin</username>
-        <deleted>0</deleted>
-    </be_users>
-    <be_users>
-        <uid>2</uid>
-        <pid>1</pid>
-        <username>test1</username>
-        <deleted>1</deleted>
-    </be_users>
-    <be_users>
-        <uid>3</uid>
-        <pid>1</pid>
-        <username>test1</username>
-        <deleted>0</deleted>
-    </be_users>
-</dataset>
diff --git a/typo3/sysext/sv/Tests/Unit/AuthenticationServiceTest.php b/typo3/sysext/sv/Tests/Unit/AuthenticationServiceTest.php
deleted file mode 100644 (file)
index db4e348..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-<?php
-namespace TYPO3\CMS\Sv\Tests\Unit;
-
-/*
- * This file is part of the TYPO3 CMS project.
- *
- * It is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License, either version 2
- * of the License, or any later version.
- *
- * For the full copyright and license information, please read the
- * LICENSE.txt file that was distributed with this source code.
- *
- * The TYPO3 project - inspiring people to share!
- */
-
-/**
- * Testcase for class \TYPO3\CMS\Sv\AuthenticationService
- */
-class AuthenticationServiceTest extends \TYPO3\TestingFramework\Core\Unit\UnitTestCase
-{
-    /**
-     * Date provider for processLoginReturnsCorrectData
-     *
-     * @return array
-     */
-    public function processLoginDataProvider()
-    {
-        return [
-            'Backend login with securityLevel "normal"' => [
-                'normal',
-                [
-                    'status' => 'login',
-                    'uname' => 'admin',
-                    'uident' => 'password',
-                ],
-                [
-                    'status' => 'login',
-                    'uname' => 'admin',
-                    'uident' => 'password',
-                    'uident_text' => 'password',
-                ]
-            ],
-            'Frontend login with securityLevel "normal"' => [
-                'normal',
-                [
-                    'status' => 'login',
-                    'uname' => 'admin',
-                    'uident' => 'password',
-                ],
-                [
-                    'status' => 'login',
-                    'uname' => 'admin',
-                    'uident' => 'password',
-                    'uident_text' => 'password',
-                ]
-            ],
-        ];
-    }
-
-    /**
-     * @test
-     * @dataProvider processLoginDataProvider
-     */
-    public function processLoginReturnsCorrectData($passwordSubmissionStrategy, $loginData, $expectedProcessedData)
-    {
-        /** @var $authenticationService \TYPO3\CMS\Sv\AuthenticationService */
-        $authenticationService = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Sv\AuthenticationService::class);
-        // Login data is modified by reference
-        $authenticationService->processLoginData($loginData, $passwordSubmissionStrategy);
-        $this->assertEquals($expectedProcessedData, $loginData);
-    }
-}
diff --git a/typo3/sysext/sv/composer.json b/typo3/sysext/sv/composer.json
deleted file mode 100644 (file)
index 811caa1..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-{
-       "name": "typo3/cms-sv",
-       "type": "typo3-cms-framework",
-       "description": "TYPO3 Core",
-       "homepage": "https://typo3.org",
-       "license": ["GPL-2.0+"],
-
-       "require": {
-               "typo3/cms-core": "*"
-       },
-       "replace": {
-               "sv": "*"
-       },
-       "extra": {
-               "typo3/cms": {
-                       "Package": {
-                               "protected": true,
-                               "partOfFactoryDefault": true,
-                               "partOfMinimalUsableSystem": true
-                       }
-               }
-       },
-       "autoload": {
-               "psr-4": {
-                       "TYPO3\\CMS\\Sv\\": "Classes/"
-               }
-       },
-       "autoload-dev": {
-               "psr-4": {
-                       "TYPO3\\CMS\\Sv\\Tests\\": "Tests/"
-               }
-       }
-}
diff --git a/typo3/sysext/sv/ext_emconf.php b/typo3/sysext/sv/ext_emconf.php
deleted file mode 100644 (file)
index 99d15e7..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-$EM_CONF[$_EXTKEY] = [
-    'title' => 'TYPO3 System Services',
-    'description' => 'The core/default services. This includes the default authentication services for now.',
-    'category' => 'services',
-    'state' => 'stable',
-    'uploadfolder' => 0,
-    'createDirs' => '',
-    'clearCacheOnLoad' => 1,
-    'author' => 'Rene Fritz',
-    'author_email' => 'r.fritz@colorcube.de',
-    'author_company' => 'Colorcube',
-    'version' => '9.0.0',
-    'constraints' => [
-        'depends' => [
-            'typo3' => '9.0.0-9.0.99',
-        ],
-        'conflicts' => [],
-        'suggests' => [],
-    ],
-];
diff --git a/typo3/sysext/sv/ext_localconf.php b/typo3/sysext/sv/ext_localconf.php
deleted file mode 100644 (file)
index 5182966..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-defined('TYPO3_MODE') or die();
-
-// Register base authentication service
-\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addService(
-    'sv',
-    'auth',
-    \TYPO3\CMS\Sv\AuthenticationService::class,
-    [
-        'title' => 'User authentication',
-        'description' => 'Authentication with username/password.',
-        'subtype' => 'getUserBE,getUserFE,authUserFE,getGroupsFE,processLoginDataBE,processLoginDataFE',
-        'available' => true,
-        'priority' => 50,
-        'quality' => 50,
-        'os' => '',
-        'exec' => '',
-        'className' => \TYPO3\CMS\Sv\AuthenticationService::class
-    ]
-);