[BUGFIX] Avoid storing Extbase reflection in be_users.uc 17/61117/5
authorOliver Hader <oliver@typo3.org>
Fri, 21 Jun 2019 19:28:37 +0000 (21:28 +0200)
committerBenjamin Franzke <bfr@qbus.de>
Mon, 15 Jul 2019 07:30:44 +0000 (09:30 +0200)
The backend users module (ext:beuser) persists previously defined
filter combinations in be_users.uc fields of the according user. When
a "user group" is defined in the filter, Extbase architecture internals
get serialized and persisted as well which has performance impacts and
most probably will exceed storage (16M) of be_users.uc field.

It is enough to store the uid of the according be_groups entity.

Resolves: #86361
Releases: master, 9.5, 8.7
Change-Id: I61ba4993d9594b1074546255e7d5c2d5506819fb
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/61117
Tested-by: TYPO3com <noreply@typo3.com>
Tested-by: Markus Klein <markus.klein@typo3.org>
Tested-by: Alexander Schnitzler <review.typo3.org@alexanderschnitzler.de>
Tested-by: Benjamin Franzke <bfr@qbus.de>
Reviewed-by: Markus Klein <markus.klein@typo3.org>
Reviewed-by: Julian Geils <j_geils@web.de>
Reviewed-by: Daniel Goerz <daniel.goerz@posteo.de>
Reviewed-by: Alexander Schnitzler <review.typo3.org@alexanderschnitzler.de>
Reviewed-by: Benjamin Franzke <bfr@qbus.de>
typo3/sysext/beuser/Classes/Domain/Model/Demand.php
typo3/sysext/beuser/Classes/Domain/Repository/BackendUserRepository.php
typo3/sysext/beuser/Classes/Service/ModuleDataStorageService.php

index debf4ff..2f2a2e8 100644 (file)
@@ -69,9 +69,9 @@ class Demand extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
     protected $logins = 0;
 
     /**
-     * @var \TYPO3\CMS\Beuser\Domain\Model\BackendUserGroup
+     * @var int
      */
-    protected $backendUserGroup;
+    protected $backendUserGroup = 0;
 
     /**
      * @param string $userName
@@ -138,7 +138,7 @@ class Demand extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
     }
 
     /**
-     * @param BackendUserGroup $backendUserGroup
+     * @param int $backendUserGroup
      */
     public function setBackendUserGroup($backendUserGroup)
     {
@@ -146,7 +146,7 @@ class Demand extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
     }
 
     /**
-     * @return BackendUserGroup
+     * @return int
      */
     public function getBackendUserGroup()
     {
index c79ac3f..c1abfae 100644 (file)
@@ -98,12 +98,11 @@ class BackendUserRepository extends BackendUserGroupRepository
         // @TODO: Refactor for real n:m relations
         if ($demand->getBackendUserGroup()) {
             $constraints[] = $query->logicalOr([
-                $query->equals('usergroup', (int)$demand->getBackendUserGroup()->getUid()),
-                $query->like('usergroup', (int)$demand->getBackendUserGroup()->getUid() . ',%'),
-                $query->like('usergroup', '%,' . (int)$demand->getBackendUserGroup()->getUid()),
-                $query->like('usergroup', '%,' . (int)$demand->getBackendUserGroup()->getUid() . ',%')
+                $query->equals('usergroup', (int)$demand->getBackendUserGroup()),
+                $query->like('usergroup', (int)$demand->getBackendUserGroup() . ',%'),
+                $query->like('usergroup', '%,' . (int)$demand->getBackendUserGroup()),
+                $query->like('usergroup', '%,' . (int)$demand->getBackendUserGroup() . ',%')
             ]);
-            $query->contains('usergroup', $demand->getBackendUserGroup());
         }
         $query->matching($query->logicalAnd($constraints));
         /** @var QueryResult $result */
index 18346d8..652573d 100644 (file)
@@ -1,6 +1,9 @@
 <?php
 namespace TYPO3\CMS\Beuser\Service;
 
+use TYPO3\CMS\Beuser\Domain\Model\Demand;
+use TYPO3\CMS\Beuser\Domain\Model\ModuleData;
+
 /*
  * This file is part of the TYPO3 CMS project.
  *
@@ -40,19 +43,21 @@ class ModuleDataStorageService implements \TYPO3\CMS\Core\SingletonInterface
     }
 
     /**
-     * Loads module data for user settings or returns a fresh object initially
+     * Loads module data for user settings or returns a fresh object if module data is invalid or unset
      *
      * @return \TYPO3\CMS\Beuser\Domain\Model\ModuleData
      */
     public function loadModuleData()
     {
-        $moduleData = $GLOBALS['BE_USER']->getModuleData(self::KEY);
-        if (empty($moduleData) || !$moduleData) {
-            $moduleData = $this->objectManager->get(\TYPO3\CMS\Beuser\Domain\Model\ModuleData::class);
-        } else {
-            $moduleData = @unserialize($moduleData);
+        $moduleData = $GLOBALS['BE_USER']->getModuleData(self::KEY) ?? '';
+        if ($moduleData !== '') {
+            $moduleData = @unserialize($moduleData, ['allowed_classes' => [ModuleData::class, Demand::class]]);
+            if ($moduleData instanceof ModuleData) {
+                return $moduleData;
+            }
         }
-        return $moduleData;
+
+        return $this->objectManager->get(ModuleData::class);
     }
 
     /**