2 declare(strict_types = 1);
18 use Psr\Http\Message\ResponseInterface;
19 use Psr\Http\Message\ServerRequestInterface;
20 use TYPO3\CMS\Core\Configuration\ConfigurationManager;
53 public function cardsAction(ServerRequestInterface $request): ResponseInterface
58 'html' => $view->render(),
69 GeneralUtility::makeInstance(ClearCacheService::class)->clearAll();
70 GeneralUtility::makeInstance(OpcodeCacheService::class)->clearAllActive();
72 new FlashMessage(
'Successfully cleared all caches and all available opcode caches.',
'Caches cleared')
76 'status' => $messageQueue,
91 $view->assignMultiple([
92 'clearTypo3tempFilesToken' => $formProtection->generateToken(
'installTool',
'clearTypo3tempFiles'),
98 'html' => $view->render(),
114 $folder = $request->getParsedBody()[
'install'][
'folder'];
116 $storageUid = $request->getParsedBody()[
'install'][
'storageUid'] ??
null;
117 if ($storageUid ===
null) {
118 $typo3tempFileService->clearAssetsFolder($folder);
119 $messageQueue->enqueue(
new FlashMessage(
'Cleared files in "' . $folder .
'" folder'));
121 $storageUid = (int)$storageUid;
122 $failedDeletions = $typo3tempFileService->clearProcessedFiles($storageUid);
123 if ($failedDeletions) {
125 'Failed to delete ' . $failedDeletions .
' processed files. See TYPO3 log (by default typo3temp/var/log/typo3_*.log)',
130 $messageQueue->enqueue(
new FlashMessage(
'Cleared processed files'));
135 'status' => $messageQueue,
149 'Skipped generating additional class loading information in composer mode.',
156 'Successfully dumped class loading information for extensions.'
161 'status' => $messageQueue,
175 $view->assignMultiple([
176 'databaseAnalyzerExecuteToken' => $formProtection->generateToken(
'installTool',
'databaseAnalyzerExecute'),
180 'html' => $view->render(),
196 $sqlReader = GeneralUtility::makeInstance(SqlReader::class);
197 $sqlStatements = $sqlReader->getCreateTableStatementArray($sqlReader->getTablesDefinitionString());
198 $schemaMigrationService = GeneralUtility::makeInstance(SchemaMigrator::class);
199 $addCreateChange = $schemaMigrationService->getUpdateSuggestions($sqlStatements);
202 $addCreateChange = array_merge_recursive(...array_values($addCreateChange));
203 if (!empty($addCreateChange[
'create_table'])) {
206 'label' =>
'Add tables',
210 foreach ($addCreateChange[
'create_table'] as $hash => $statement) {
211 $suggestion[
'children'][] = [
213 'statement' => $statement,
216 $suggestions[] = $suggestion;
218 if (!empty($addCreateChange[
'add'])) {
221 'label' =>
'Add fields to tables',
225 foreach ($addCreateChange[
'add'] as $hash => $statement) {
226 $suggestion[
'children'][] = [
228 'statement' => $statement,
231 $suggestions[] = $suggestion;
233 if (!empty($addCreateChange[
'change'])) {
236 'label' =>
'Change fields',
240 foreach ($addCreateChange[
'change'] as $hash => $statement) {
243 'statement' => $statement,
245 if (isset($addCreateChange[
'change_currentValue'][$hash])) {
246 $child[
'current'] = $addCreateChange[
'change_currentValue'][$hash];
248 $suggestion[
'children'][] = $child;
250 $suggestions[] = $suggestion;
254 $dropRename = $schemaMigrationService->getUpdateSuggestions($sqlStatements,
true);
257 $dropRename = array_merge_recursive(...array_values($dropRename));
258 if (!empty($dropRename[
'change_table'])) {
260 'key' =>
'renameTableToUnused',
261 'label' =>
'Remove tables (rename with prefix)',
265 foreach ($dropRename[
'change_table'] as $hash => $statement) {
268 'statement' => $statement,
270 if (!empty($dropRename[
'tables_count'][$hash])) {
271 $child[
'rowCount'] = $dropRename[
'tables_count'][$hash];
273 $suggestion[
'children'][] = $child;
275 $suggestions[] = $suggestion;
277 if (!empty($dropRename[
'change'])) {
279 'key' =>
'renameTableFieldToUnused',
280 'label' =>
'Remove unused fields (rename with prefix)',
284 foreach ($dropRename[
'change'] as $hash => $statement) {
285 $suggestion[
'children'][] = [
287 'statement' => $statement,
290 $suggestions[] = $suggestion;
292 if (!empty($dropRename[
'drop'])) {
294 'key' =>
'deleteField',
295 'label' =>
'Drop fields (really!)',
299 foreach ($dropRename[
'drop'] as $hash => $statement) {
300 $suggestion[
'children'][] = [
302 'statement' => $statement,
305 $suggestions[] = $suggestion;
307 if (!empty($dropRename[
'drop_table'])) {
309 'key' =>
'deleteTable',
310 'label' =>
'Drop tables (really!)',
314 foreach ($dropRename[
'drop_table'] as $hash => $statement) {
317 'statement' => $statement,
319 if (!empty($dropRename[
'tables_count'][$hash])) {
320 $child[
'rowCount'] = $dropRename[
'tables_count'][$hash];
322 $suggestion[
'children'][] = $child;
324 $suggestions[] = $suggestion;
329 'Database analysis failed',
335 'status' => $messageQueue,
336 'suggestions' => $suggestions,
350 $selectedHashes = $request->getParsedBody()[
'install'][
'hashes'] ?? [];
351 if (empty($selectedHashes)) {
354 'No database changes selected',
358 $sqlReader = GeneralUtility::makeInstance(SqlReader::class);
359 $sqlStatements = $sqlReader->getCreateTableStatementArray($sqlReader->getTablesDefinitionString());
360 $schemaMigrationService = GeneralUtility::makeInstance(SchemaMigrator::class);
361 $statementHashesToPerform = array_flip($selectedHashes);
362 $results = $schemaMigrationService->migrate($sqlStatements, $statementHashesToPerform);
364 foreach ($results as $errorMessage) {
366 'Error: ' . $errorMessage,
367 'Database update failed',
372 'Executed database updates',
373 'Executed database updates'
378 'status' => $messageQueue,
392 $view->assignMultiple([
393 'clearTablesClearToken' => $formProtection->generateToken(
'installTool',
'clearTablesClear'),
398 'html' => $view->render(),
411 $table = $request->getParsedBody()[
'install'][
'table'];
413 throw new \RuntimeException(
414 'No table name given',
424 'status' => $messageQueue
437 $view->assignMultiple([
438 'createAdminToken' => $formProtection->generateToken(
'installTool',
'createAdmin'),
442 'html' => $view->render(),
454 $username = preg_replace(
'/\\s/i',
'', $request->getParsedBody()[
'install'][
'userName']);
455 $password = $request->getParsedBody()[
'install'][
'userPassword'];
456 $passwordCheck = $request->getParsedBody()[
'install'][
'userPasswordCheck'];
457 $isSystemMaintainer = ((bool)$request->getParsedBody()[
'install'][
'userSystemMaintainer'] ==
'1') ?
true :
false;
461 if (strlen($username) < 1) {
463 'No valid username given.',
464 'Administrator user not created',
467 } elseif ($password !== $passwordCheck) {
469 'Passwords do not match.',
470 'Administrator user not created',
473 } elseif (strlen($password) < 8) {
475 'Password must be at least eight characters long.',
476 'Administrator user not created',
480 $connectionPool = GeneralUtility::makeInstance(ConnectionPool::class);
481 $userExists = $connectionPool->getConnectionForTable(
'be_users')
485 [
'username' => $username]
489 'A user with username "' . $username .
'" exists already.',
490 'Administrator user not created',
494 $hashInstance = GeneralUtility::makeInstance(PasswordHashFactory::class)->getDefaultHashInstance(
'BE');
495 $hashedPassword = $hashInstance->getHashedPassword($password);
497 'username' => $username,
498 'password' => $hashedPassword,
503 $connectionPool->getConnectionForTable(
'be_users')->insert(
'be_users', $adminUserFields);
505 if ($isSystemMaintainer) {
508 $newAdminUserUid = (int)$connectionPool->getConnectionForTable(
'be_users')->lastInsertId(
'be_users');
511 $existingSystemMaintainersList =
$GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'systemMaintainers'] ?? [];
514 $newSystemMaintainersList = $existingSystemMaintainersList;
515 $newSystemMaintainersList[] = $newAdminUserUid;
518 $configurationManager = GeneralUtility::makeInstance(ConfigurationManager::class);
519 $configurationManager->setLocalConfigurationValuesByPathValuePairs(
520 [
'SYS/systemMaintainers' => $newSystemMaintainersList]
526 'Administrator created with username "' . $username .
'".'
532 'status' => $messages,
548 $view->assignMultiple([
549 'languagePacksActivateLanguageToken' => $formProtection->generateToken(
'installTool',
'languagePacksActivateLanguage'),
550 'languagePacksDeactivateLanguageToken' => $formProtection->generateToken(
'installTool',
'languagePacksDeactivateLanguage'),
551 'languagePacksUpdatePackToken' => $formProtection->generateToken(
'installTool',
'languagePacksUpdatePack'),
552 'languagePacksUpdateIsoTimesToken' => $formProtection->generateToken(
'installTool',
'languagePacksUpdateIsoTimes'),
556 $languagePacksService = GeneralUtility::makeInstance(LanguagePackService::class);
557 $languagePacksService->updateMirrorBaseUrl();
558 $extensions = $languagePacksService->getExtensionLanguagePackDetails();
561 'languages' => $languagePacksService->getLanguageDetails(),
562 'extensions' => $extensions,
563 'activeLanguages' => $languagePacksService->getActiveLanguages(),
564 'activeExtensions' => array_column($extensions,
'key'),
565 'html' => $view->render(),
578 $languagePackService = GeneralUtility::makeInstance(LanguagePackService::class);
579 $locales = GeneralUtility::makeInstance(Locales::class);
580 $availableLanguages = $languagePackService->getAvailableLanguages();
581 $activeLanguages = $languagePackService->getActiveLanguages();
582 $iso = $request->getParsedBody()[
'install'][
'iso'];
584 foreach ($availableLanguages as $availableIso => $name) {
585 if ($availableIso === $iso && !in_array($availableIso, $activeLanguages,
true)) {
586 $activateArray[] = $iso;
587 $dependencies =
$locales->getLocaleDependencies($availableIso);
588 if (!empty($dependencies)) {
589 foreach ($dependencies as $dependency) {
590 if (!in_array($dependency, $activeLanguages,
true)) {
591 $activateArray[] = $dependency;
597 if (!empty($activateArray)) {
598 $activeLanguages = array_merge($activeLanguages, $activateArray);
599 sort($activeLanguages);
600 $configurationManager = GeneralUtility::makeInstance(ConfigurationManager::class);
601 $configurationManager->setLocalConfigurationValueByPath(
603 [
'availableLanguages' => $activeLanguages]
605 $activationArray = [];
606 foreach ($activateArray as $activateIso) {
607 $activationArray[] = $availableLanguages[$activateIso] .
' (' . $activateIso .
')';
609 $messageQueue->enqueue(
611 'These languages have been activated: ' . implode(
', ', $activationArray)
615 $messageQueue->enqueue(
621 'status' => $messageQueue,
635 $languagePackService = GeneralUtility::makeInstance(LanguagePackService::class);
636 $locales = GeneralUtility::makeInstance(Locales::class);
637 $availableLanguages = $languagePackService->getAvailableLanguages();
638 $activeLanguages = $languagePackService->getActiveLanguages();
639 $iso = $request->getParsedBody()[
'install'][
'iso'];
641 throw new \RuntimeException(
'No iso code given', 1520109807);
643 $otherActiveLanguageDependencies = [];
644 foreach ($activeLanguages as $activeLanguage) {
645 if ($activeLanguage === $iso) {
648 $dependencies =
$locales->getLocaleDependencies($activeLanguage);
649 if (in_array($iso, $dependencies,
true)) {
650 $otherActiveLanguageDependencies[] = $activeLanguage;
653 if (!empty($otherActiveLanguageDependencies)) {
655 $dependentArray = [];
656 foreach ($otherActiveLanguageDependencies as $dependency) {
657 $dependentArray[] = $availableLanguages[$dependency] .
' (' . $dependency .
')';
659 $messageQueue->enqueue(
661 'Language "' . $availableLanguages[$iso] .
' (' . $iso .
')" can not be deactivated. These'
662 .
' other languages depend on it and need to be deactivated before:'
663 . implode(
', ', $dependentArray),
669 if (in_array($iso, $activeLanguages,
true)) {
671 $newActiveLanguages = [];
672 foreach ($activeLanguages as $activeLanguage) {
673 if ($activeLanguage === $iso) {
676 $newActiveLanguages[] = $activeLanguage;
678 $configurationManager = GeneralUtility::makeInstance(ConfigurationManager::class);
679 $configurationManager->setLocalConfigurationValueByPath(
681 [
'availableLanguages' => $newActiveLanguages]
683 $messageQueue->enqueue(
685 'Language "' . $availableLanguages[$iso] .
' (' . $iso .
')" has been deactivated'
689 $messageQueue->enqueue(
691 'Language "' . $availableLanguages[$iso] .
' (' . $iso .
')" has not been deactivated',
700 'status' => $messageQueue,
714 $iso = $request->getParsedBody()[
'install'][
'iso'];
715 $key = $request->getParsedBody()[
'install'][
'extension'];
716 $languagePackService = GeneralUtility::makeInstance(LanguagePackService::class);
719 'packResult' => $languagePackService->languagePackDownload($key, $iso)
731 $isos = $request->getParsedBody()[
'install'][
'isos'];
732 $languagePackService = GeneralUtility::makeInstance(LanguagePackService::class);
733 $languagePackService->setLastUpdatedIsoCode($isos);
741 $cacheManager = new \TYPO3\CMS\Core\Cache\CacheManager();
742 $cacheManager->setCacheConfigurations(
$GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'caching'][
'cacheConfigurations']);
743 $cacheManager->getCache(
'l10n')->flush();
755 GeneralUtility::makeInstance(ConnectionPool::class)
756 ->getQueryBuilderForTable(
'be_users')
762 'Preferences of all backend users have been reset',
763 'Reset preferences of all backend users'
767 'status' => $messageQueue