From 7eaf1907fa503793cebbb559e39df2090b40352b Mon Sep 17 00:00:00 2001
From: Andreas Fernandez <a.fernandez@scripting-base.de>
Date: Wed, 18 Oct 2017 08:57:41 +0200
Subject: [PATCH] [BUGFIX] Delete unavailable "recently switched to" users from
 UC

If a user who appears in the "Recently switched to" list became
unavailable for some reason, only the placeholder avatar was rendered,
giving a slight hint of life in the past.

Such users are now deleted from UC and do not appear in the list anymore.
Furthermore, the section label was slightly modified to be more
understandable.

For performance reasons, only one query is triggered now and sorting is
done based on the array of UIDs stored in UC.

Resolves: #82796
Related: #80581
Releases: master
Change-Id: Ieff8a779639f277de1c0cb7feaa0fe2b82bd97c5
Reviewed-on: https://review.typo3.org/54433
Reviewed-by: Mathias Schreiber <mathias.schreiber@typo3.com>
Tested-by: Mathias Schreiber <mathias.schreiber@typo3.com>
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Joerg Boesche <typo3@joergboesche.de>
Tested-by: Joerg Boesche <typo3@joergboesche.de>
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
---
 .../Backend/ToolbarItems/UserToolbarItem.php  | 38 +++++++++++++++----
 .../Resources/Private/Language/locallang.xlf  |  2 +-
 2 files changed, 32 insertions(+), 8 deletions(-)

diff --git a/typo3/sysext/backend/Classes/Backend/ToolbarItems/UserToolbarItem.php b/typo3/sysext/backend/Classes/Backend/ToolbarItems/UserToolbarItem.php
index 0a4c44fb580b..4b36257c9594 100644
--- a/typo3/sysext/backend/Classes/Backend/ToolbarItems/UserToolbarItem.php
+++ b/typo3/sysext/backend/Classes/Backend/ToolbarItems/UserToolbarItem.php
@@ -17,6 +17,8 @@ namespace TYPO3\CMS\Backend\Backend\ToolbarItems;
 use TYPO3\CMS\Backend\Domain\Repository\Module\BackendModuleRepository;
 use TYPO3\CMS\Backend\Toolbar\ToolbarItemInterface;
 use TYPO3\CMS\Backend\Utility\BackendUtility;
+use TYPO3\CMS\Core\Database\Connection;
+use TYPO3\CMS\Core\Database\ConnectionPool;
 use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Fluid\View\StandaloneView;
@@ -71,15 +73,37 @@ class UserToolbarItem implements ToolbarItemInterface
             && isset($backendUser->uc['recentSwitchedToUsers'])
             && is_array($backendUser->uc['recentSwitchedToUsers'])
         ) {
-            foreach ($backendUser->uc['recentSwitchedToUsers'] as $userUid) {
-                $backendUserRecord = BackendUtility::getRecord('be_users', $userUid);
-                $backendUserRecord['switchUserLink'] = BackendUtility::getModuleUrl(
+            $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('be_users');
+            $result = $queryBuilder
+                ->select('uid', 'username', 'realName')
+                ->from('be_users')
+                ->where(
+                    $queryBuilder->expr()->in('uid', $queryBuilder->createNamedParameter($backendUser->uc['recentSwitchedToUsers'], Connection::PARAM_INT_ARRAY))
+                )->execute();
+
+            // Flip the array to have a "sorted" list of items
+            $mostRecentUsers = array_flip($backendUser->uc['recentSwitchedToUsers']);
+
+            while ($row = $result->fetch()) {
+                $row['switchUserLink'] = BackendUtility::getModuleUrl(
                     'system_BeuserTxBeuser',
-                        [
-                            'SwitchUser' => $backendUserRecord['uid']
-                        ]
+                    [
+                        'SwitchUser' => $row['uid']
+                    ]
                 );
-                $mostRecentUsers[] = $backendUserRecord;
+
+                $mostRecentUsers[$row['uid']] = $row;
+            }
+
+            // Remove any item that is not an array (means, the stored uid is not available anymore)
+            $mostRecentUsers = array_filter($mostRecentUsers, function ($record) {
+                return is_array($record);
+            });
+
+            $availableUsers = array_keys($mostRecentUsers);
+            if (!empty(array_diff($backendUser->uc['recentSwitchedToUsers'], $availableUsers))) {
+                $backendUser->uc['recentSwitchedToUsers'] = $availableUsers;
+                $backendUser->writeUC();
             }
         }
 
diff --git a/typo3/sysext/backend/Resources/Private/Language/locallang.xlf b/typo3/sysext/backend/Resources/Private/Language/locallang.xlf
index a2d1f3efae28..415e7351619c 100644
--- a/typo3/sysext/backend/Resources/Private/Language/locallang.xlf
+++ b/typo3/sysext/backend/Resources/Private/Language/locallang.xlf
@@ -20,7 +20,7 @@
 Have a nice day.</source>
 			</trans-unit>
 			<trans-unit id="usermodule.su.list">
-				<source>Recently 'switched to' users</source>
+				<source>Recently switched to</source>
 			</trans-unit>
 			<trans-unit id="usermodule.su.tooltip">
 				<source>Switch to user %s</source>
-- 
GitLab