Files
cms-install/Classes/ServiceProvider.php
T

445 lines
18 KiB
PHP

<?php
declare(strict_types=1);
/*
* 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!
*/
namespace TYPO3\CMS\Install;
use Psr\Container\ContainerInterface;
use TYPO3\CMS\Core\Cache\CacheManager;
use TYPO3\CMS\Core\Configuration\ConfigurationManager;
use TYPO3\CMS\Core\Console\CommandRegistry;
use TYPO3\CMS\Core\Context\Context;
use TYPO3\CMS\Core\Crypto\HashService;
use TYPO3\CMS\Core\Crypto\PasswordHashing\PasswordHashFactory;
use TYPO3\CMS\Core\Crypto\Random;
use TYPO3\CMS\Core\DependencyInjection\ContainerBuilder;
use TYPO3\CMS\Core\FormProtection\FormProtectionFactory;
use TYPO3\CMS\Core\Html\SanitizerBuilderFactory;
use TYPO3\CMS\Core\Http\MiddlewareDispatcher;
use TYPO3\CMS\Core\Imaging\IconFactory;
use TYPO3\CMS\Core\Imaging\IconRegistry;
use TYPO3\CMS\Core\Localization\LanguageServiceFactory;
use TYPO3\CMS\Core\Localization\Locales;
use TYPO3\CMS\Core\Localization\TranslationDomainResolver;
use TYPO3\CMS\Core\Log\LogManager;
use TYPO3\CMS\Core\Mail\Mailer;
use TYPO3\CMS\Core\Mail\TemplatedEmailFactory;
use TYPO3\CMS\Core\Middleware\NormalizedParamsAttribute as NormalizedParamsMiddleware;
use TYPO3\CMS\Core\Middleware\ResponsePropagation as ResponsePropagationMiddleware;
use TYPO3\CMS\Core\Package\AbstractServiceProvider;
use TYPO3\CMS\Core\Package\FailsafePackageManager;
use TYPO3\CMS\Core\Package\PackageManager;
use TYPO3\CMS\Core\Page\ResourceHashCollection;
use TYPO3\CMS\Core\PasswordPolicy\Generator\PasswordGenerator;
use TYPO3\CMS\Core\PasswordPolicy\PasswordService;
use TYPO3\CMS\Core\Routing\BackendEntryPointResolver;
use TYPO3\CMS\Core\Security\ContentSecurityPolicy\DirectiveHashCollection;
use TYPO3\CMS\Core\Service\SilentConfigurationUpgradeService;
use TYPO3\CMS\Core\SystemResource\Publishing\SystemResourcePublisherInterface;
use TYPO3\CMS\Core\SystemResource\SystemResourceFactory;
use TYPO3\CMS\Core\TypoScript\AST\CommentAwareAstBuilder;
use TYPO3\CMS\Core\TypoScript\AST\Traverser\AstTraverser;
use TYPO3\CMS\Core\TypoScript\Tokenizer\LosslessTokenizer;
use TYPO3\CMS\Core\ViewHelpers\IconViewHelper;
use TYPO3\CMS\Core\ViewHelpers\NormalizedUrlViewHelper;
use TYPO3\CMS\Fluid\ViewHelpers\Be\InfoboxViewHelper;
use TYPO3\CMS\Fluid\ViewHelpers\Sanitize\HtmlViewHelper;
use TYPO3\CMS\Install\Service\LateBootService;
use TYPO3\CMS\Install\Service\SessionService;
use TYPO3\CMS\Install\Service\WebServerConfigurationFileService;
/**
* @internal
*/
class ServiceProvider extends AbstractServiceProvider
{
protected static function getPackagePath(): string
{
return __DIR__ . '/../';
}
protected static function getPackageName(): string
{
return 'typo3/cms-install';
}
public function getFactories(): array
{
return [
Authentication\AuthenticationService::class => self::getAuthenticationService(...),
Http\Application::class => self::getApplication(...),
Http\NotFoundRequestHandler::class => self::getNotFoundRequestHandler(...),
Factory\ImportMapFactory::class => self::getImportMapFactory(...),
Service\ClearCacheService::class => self::getClearCacheService(...),
Service\CoreUpdateService::class => self::getCoreUpdateService(...),
Service\CoreVersionService::class => self::getCoreVersionService(...),
Service\LateBootService::class => self::getLateBootService(...),
Service\SilentTemplateFileUpgradeService::class => self::getSilentTemplateFileUpgradeService(...),
Service\WebServerConfigurationFileService::class => self::getWebServerConfigurationFileService(...),
Service\SessionService::class => self::getSessionService(...),
Middleware\Installer::class => self::getInstallerMiddleware(...),
Middleware\Maintenance::class => self::getMaintenanceMiddleware(...),
Middleware\AssetPublishing::class => self::getAssetPublishing(...),
Middleware\JavaScriptLanguageDomainProvider::class => self::getJavaScriptLanguageDomainProvider(...),
Controller\EnvironmentController::class => self::getEnvironmentController(...),
Controller\IconController::class => self::getIconController(...),
Controller\LayoutController::class => self::getLayoutController(...),
Controller\LoginController::class => self::getLoginController(...),
Controller\MaintenanceController::class => self::getMaintenanceController(...),
Controller\SettingsController::class => self::getSettingsController(...),
Controller\UpgradeController::class => self::getUpgradeController(...),
Command\PasswordSetCommand::class => self::getPasswordGenerateCommand(...),
Command\SetupCommand::class => self::getSetupCommand(...),
Command\SetupDefaultBackendUserGroupsCommand::class => self::getSetupDefaultBackendUserGroupsCommand(...),
IconViewHelper::class => self::getIconViewHelper(...),
HtmlViewHelper::class => self::getHtmlViewHelper(...),
InfoboxViewHelper::class => self::getInfoboxViewHelper(...),
NormalizedUrlViewHelper::class => self::getNormalizedUrlViewHelper(...),
PasswordGenerator::class => self::getPasswordGenerator(...),
Random::class => self::getRandom(...),
];
}
public function getExtensions(): array
{
return [
'backend.routes' => [ static::class, 'configureBackendRoutes' ],
'backend.modules' => [ static::class, 'configureBackendModules' ],
'icons' => [ static::class, 'configureIcons' ],
CommandRegistry::class => self::configureCommands(...),
DirectiveHashCollection::class => self::provideFallbackDirectiveHashCollection(...),
Service\SetupService::class => self::provideSetupService(...),
];
}
public static function getAuthenticationService(ContainerInterface $container): Authentication\AuthenticationService
{
return new Authentication\AuthenticationService(
$container->get(Mailer::class),
$container->get(TemplatedEmailFactory::class)
);
}
public static function getApplication(ContainerInterface $container): Http\Application
{
$requestHandler = $container->get(Http\NotFoundRequestHandler::class);
$dispatcher = new MiddlewareDispatcher($requestHandler, [], $container);
// Stack of middlewares, executed LIFO
$dispatcher->lazy(ResponsePropagationMiddleware::class);
$dispatcher->lazy(Middleware\Installer::class);
$dispatcher->add($container->get(Middleware\Maintenance::class));
$dispatcher->add($container->get(Middleware\AssetPublishing::class));
$dispatcher->add($container->get(Middleware\JavaScriptLanguageDomainProvider::class));
$dispatcher->lazy(NormalizedParamsMiddleware::class);
return self::new($container, Http\Application::class, [
$dispatcher,
$container->get(Context::class),
]);
}
public static function getNotFoundRequestHandler(ContainerInterface $container): Http\NotFoundRequestHandler
{
return new Http\NotFoundRequestHandler();
}
public static function getImportMapFactory(ContainerInterface $container): Factory\ImportMapFactory
{
return new Factory\ImportMapFactory(
$container->get(FailsafePackageManager::class),
$container->get(HashService::class),
);
}
public static function getClearCacheService(ContainerInterface $container): Service\ClearCacheService
{
return new Service\ClearCacheService(
$container->get(Service\LateBootService::class),
$container->get('cache.di')
);
}
public static function getCoreUpdateService(ContainerInterface $container): Service\CoreUpdateService
{
return new Service\CoreUpdateService(
$container->get(Service\CoreVersionService::class)
);
}
public static function getCoreVersionService(ContainerInterface $container): Service\CoreVersionService
{
return new Service\CoreVersionService();
}
public static function getLateBootService(ContainerInterface $container): Service\LateBootService
{
return new Service\LateBootService(
$container->get(ContainerBuilder::class),
$container
);
}
public static function getSilentTemplateFileUpgradeService(ContainerInterface $container): Service\SilentTemplateFileUpgradeService
{
return new Service\SilentTemplateFileUpgradeService(
$container->get(WebServerConfigurationFileService::class)
);
}
public static function getWebServerConfigurationFileService(ContainerInterface $container): Service\WebServerConfigurationFileService
{
return self::new($container, Service\WebServerConfigurationFileService::class);
}
public static function getSessionService(ContainerInterface $container): Service\SessionService
{
return new Service\SessionService(
$container->get(Service\LateBootService::class),
$container->get(LogManager::class)->getLogger(Service\SessionService::class)
);
}
public static function provideSetupService(ContainerInterface $container, ?Service\SetupService $setupService): Service\SetupService
{
if ($setupService === null) {
$lateBootService = $container->get(Service\LateBootService::class);
$setupService = $lateBootService->getContainer(true)->get(Service\SetupService::class);
$lateBootService->unsetInternalContainerInstance();
}
return $setupService;
}
public static function getInstallerMiddleware(ContainerInterface $container): Middleware\Installer
{
return new Middleware\Installer(
$container->get(Service\LateBootService::class),
$container->get(FormProtectionFactory::class),
$container->get(SessionService::class),
);
}
public static function getMaintenanceMiddleware(ContainerInterface $container): Middleware\Maintenance
{
return new Middleware\Maintenance(
$container->get(FailsafePackageManager::class),
$container->get(ConfigurationManager::class),
$container->get(PasswordHashFactory::class),
$container,
$container->get(FormProtectionFactory::class),
$container->get(SessionService::class),
);
}
public static function getJavaScriptLanguageDomainProvider(ContainerInterface $container): Middleware\JavaScriptLanguageDomainProvider
{
return new Middleware\JavaScriptLanguageDomainProvider(
$container->get(LanguageServiceFactory::class),
$container->get(TranslationDomainResolver::class),
);
}
public static function getAssetPublishing(ContainerInterface $container): Middleware\AssetPublishing
{
return new Middleware\AssetPublishing(
$container->get(PackageManager::class),
$container->get(SystemResourcePublisherInterface::class),
);
}
public static function getEnvironmentController(ContainerInterface $container): Controller\EnvironmentController
{
return new Controller\EnvironmentController(
$container->get(Service\LateBootService::class),
$container->get(FormProtectionFactory::class),
$container->get(Mailer::class),
$container->get(TemplatedEmailFactory::class),
);
}
public static function getIconController(ContainerInterface $container): Controller\IconController
{
return new Controller\IconController(
$container->get(IconFactory::class)
);
}
public static function getLayoutController(ContainerInterface $container): Controller\LayoutController
{
return new Controller\LayoutController(
$container->get(SilentConfigurationUpgradeService::class),
$container->get(Service\SilentTemplateFileUpgradeService::class),
$container->get(BackendEntryPointResolver::class),
$container->get(Factory\ImportMapFactory::class),
$container->get(HashService::class),
$container->get(IconRegistry::class),
$container->get(DirectiveHashCollection::class),
);
}
public static function getLoginController(ContainerInterface $container): Controller\LoginController
{
return new Controller\LoginController(
$container->get(FormProtectionFactory::class),
$container->get(ConfigurationManager::class),
);
}
public static function getMaintenanceController(ContainerInterface $container): Controller\MaintenanceController
{
return new Controller\MaintenanceController(
$container->get(Service\LateBootService::class),
$container->get(Service\ClearCacheService::class),
$container->get(ConfigurationManager::class),
$container->get(PasswordHashFactory::class),
$container->get(Locales::class),
$container->get(LanguageServiceFactory::class),
$container->get(FormProtectionFactory::class),
);
}
public static function getSettingsController(ContainerInterface $container): Controller\SettingsController
{
return new Controller\SettingsController(
$container->get(Service\LateBootService::class),
$container->get(PackageManager::class),
$container->get(LanguageServiceFactory::class),
$container->get(CommentAwareAstBuilder::class),
$container->get(LosslessTokenizer::class),
$container->get(AstTraverser::class),
$container->get(FormProtectionFactory::class),
$container->get(ConfigurationManager::class),
$container->get(PasswordService::class),
);
}
public static function getUpgradeController(ContainerInterface $container): Controller\UpgradeController
{
return new Controller\UpgradeController(
$container->get(PackageManager::class),
$container->get(Service\LateBootService::class),
$container->get(FormProtectionFactory::class),
);
}
public static function getSetupCommand(ContainerInterface $container): Command\SetupCommand
{
return new Command\SetupCommand(
'setup',
$container->get(Service\SetupService::class),
$container->get(ConfigurationManager::class),
$container->get(LateBootService::class),
$container->get(FailsafePackageManager::class),
);
}
public function getSetupDefaultBackendUserGroupsCommand(ContainerInterface $container): Command\SetupDefaultBackendUserGroupsCommand
{
return new Command\SetupDefaultBackendUserGroupsCommand(
'setup:begroups:default',
$container->get(Service\SetupService::class),
);
}
public function getPasswordGenerateCommand(ContainerInterface $container): Command\PasswordSetCommand
{
return new Command\PasswordSetCommand(
'install:password:set',
$container->get(PasswordHashFactory::class),
$container->get(ConfigurationManager::class),
$container->get(LanguageServiceFactory::class),
$container->get(PasswordService::class),
);
}
public static function getPermissionsCheck(ContainerInterface $container): Database\PermissionsCheck
{
return new Database\PermissionsCheck();
}
public static function getIconViewHelper(ContainerInterface $container): IconViewHelper
{
return self::new($container, IconViewHelper::class, [
$container->get(IconFactory::class),
]);
}
public static function getHtmlViewHelper(ContainerInterface $container): HtmlViewHelper
{
return self::new($container, HtmlViewHelper::class, [
new SanitizerBuilderFactory(),
]);
}
public static function getInfoboxViewHelper(ContainerInterface $container): InfoboxViewHelper
{
return self::new($container, InfoboxViewHelper::class, [
$container->get(IconFactory::class),
]);
}
public static function getNormalizedUrlViewHelper(ContainerInterface $container): NormalizedUrlViewHelper
{
return self::new($container, NormalizedUrlViewHelper::class, [
$container->get(SystemResourceFactory::class),
$container->get(SystemResourcePublisherInterface::class),
]);
}
public static function getPasswordGenerator(ContainerInterface $container): PasswordGenerator
{
return self::new($container, PasswordGenerator::class, [$container->get(Random::class)]);
}
public static function provideFallbackDirectiveHashCollection(
ContainerInterface $container,
?DirectiveHashCollection $directiveHashCollection = null,
): DirectiveHashCollection {
return $directiveHashCollection ?? self::new($container, DirectiveHashCollection::class, [
new ResourceHashCollection(
$container->get(LogManager::class)->getLogger(ResourceHashCollection::class),
$container->get(SystemResourceFactory::class),
$container->get(CacheManager::class)->getCache('assets'),
),
]);
}
public static function getRandom(ContainerInterface $container): Random
{
return self::new($container, Random::class);
}
public static function configureCommands(ContainerInterface $container, CommandRegistry $commandRegistry): CommandRegistry
{
$commandRegistry->addLazyCommand(
'setup',
Command\SetupCommand::class,
'Setup TYPO3 via CLI.'
);
$commandRegistry->addLazyCommand(
'setup:begroups:default',
Command\SetupDefaultBackendUserGroupsCommand::class,
'Setup default backend user groups "Editor" and "Advanced Editor".'
);
$commandRegistry->addLazyCommand(
'install:password:set',
Command\PasswordSetCommand::class,
'Set or generate a new install tool password'
);
return $commandRegistry;
}
}