getAffectedBackendUsers() as $backendUser) { $userConfig = $this->unserializeUserConfig($backendUser['uc']); if (!is_array($userConfig)) { continue; } array_walk_recursive($userConfig, function (&$item) use (&$needsExecution) { if ($item instanceof \stdClass) { $needsExecution = true; } }); if ($needsExecution) { break; } } return $needsExecution; } /** * @return string[] All new fields and tables must exist */ public function getPrerequisites(): array { return [ DatabaseUpdatedPrerequisite::class ]; } /** * Performs the database update for be_users * * @return bool */ public function executeUpdate(): bool { foreach ($this->getAffectedBackendUsers() as $backendUser) { $userConfig = $this->unserializeUserConfig($backendUser['uc']); if (!is_array($userConfig)) { continue; } array_walk_recursive($userConfig, function (&$item) { if ($item instanceof \stdClass) { $item = json_decode(json_encode($item), true); } }); $this->updateBackendUser((int)$backendUser['uid'], $userConfig); } return true; } private function unserializeUserConfig(string $userConfig) { return unserialize($userConfig, ['allowed_classes' => ['stdClass']]); } private function getAffectedBackendUsers(): iterable { $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class) ->getQueryBuilderForTable('be_users'); $queryBuilder->getRestrictions()->removeAll(); $statement = $queryBuilder ->select('uid', 'uc') ->from('be_users') ->where( $queryBuilder->expr()->like( 'uc', $queryBuilder->createNamedParameter( '%"stdClass"%' ) ) ); return $statement->execute(); } private function updateBackendUser(int $userId, array $userConfig): void { $connection = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('be_users'); $connection->update('be_users', ['uc' => serialize($userConfig)], ['uid' => $userId], [\PDO::PARAM_LOB, \PDO::PARAM_INT]); } }