2 declare(strict_types = 1);
18 use Psr\Http\Message\ResponseInterface;
19 use Psr\Http\Message\ServerRequestInterface;
20 use Psr\Http\Server\RequestHandlerInterface as PsrRequestHandlerInterface;
21 use TYPO3\CMS\Core\Configuration\ConfigurationManager;
34 use TYPO3\CMS\Core\Package\PackageManager;
64 'icon' => IconController::class,
65 'layout' => LayoutController::class,
66 'login' => LoginController::class,
67 'maintenance' => MaintenanceController::class,
68 'settings' => SettingsController::class,
69 'upgrade' => UpgradeController::class,
70 'environment' => EnvironmentController::class,
87 public function handleRequest(ServerRequestInterface $request): ResponseInterface
89 return $this->
handle($request);
98 public function handle(ServerRequestInterface $request): ResponseInterface
100 $controllerName = $request->getQueryParams()[
'install'][
'controller'] ??
'layout';
101 $actionName = $request->getParsedBody()[
'install'][
'action'] ?? $request->getQueryParams()[
'install'][
'action'] ??
'init';
104 $actionName =
'showLogin';
107 $action = $actionName .
'Action';
110 if ($actionName ===
'preAccessCheck') {
113 'isAuthorized' => $session->isAuthorized()
115 } elseif ($actionName ===
'init') {
117 $response = $controller->initAction($request);
118 } elseif ($actionName ===
'checkEnableInstallToolFile') {
122 } elseif ($actionName ===
'showEnableInstallToolFile') {
124 $response = $controller->showEnableInstallToolFileAction($request);
125 } elseif ($actionName ===
'checkLogin') {
127 throw new \RuntimeException(
'Not authorized', 1505563556);
129 if ($session->isExpired() || !$session->isAuthorized()) {
131 $session->resetSession();
132 $session->startSession();
137 $session->refreshSession();
142 } elseif ($actionName ===
'showLogin') {
144 throw new \RuntimeException(
'Not authorized', 1505564888);
147 $response = $controller->showLoginAction($request);
148 } elseif ($actionName ===
'login') {
150 throw new \RuntimeException(
'Not authorized', 1505567462);
154 $password = $request->getParsedBody()[
'install'][
'password'] ??
null;
156 if ($authService->loginWithPassword($password)) {
161 if ($password ===
null || empty($password)) {
166 $hashInstance = GeneralUtility::makeInstance(PasswordHashFactory::class)->getDefaultHashInstance(
'BE');
167 $hashedPassword = $hashInstance->getHashedPassword($password);
170 'Given password does not match the install tool login password. Calculated hash: ' . $hashedPassword,
178 'status' => $messageQueue,
181 } elseif ($actionName ===
'logout') {
186 InstallToolFormProtection::class
188 $formProtection->clean();
189 $session->destroySession();
195 if ($enforceReferrerResponse instanceof ResponseInterface) {
196 return $enforceReferrerResponse;
201 || !$session->isAuthorized()
205 $session->refreshSession();
206 if (!array_key_exists($controllerName, $this->controllers)) {
207 throw new \RuntimeException(
208 'Unknown controller ' . $controllerName,
214 $controller =
new $this->controllers[$controllerName];
215 if (!method_exists($controller, $action)) {
216 throw new \RuntimeException(
217 'Unknown action method ' . $action .
' in controller ' . $controllerName,
221 $response = $controller->$action($request);
238 && !empty(
$GLOBALS[
'TYPO3_CONF_VARS'][
'BE'][
'installToolPassword'])
240 if (!$basicIntegrity) {
276 if (!$session->hasSession()) {
277 $session->startSession();
291 $postValues = $request->getParsedBody()[
'install'];
293 if (empty($postValues)) {
298 if (isset($postValues[
'token'])) {
300 InstallToolFormProtection::class
302 $action = (string)$postValues[
'action'];
303 if ($action ===
'') {
304 throw new \RuntimeException(
305 'No POST action given for token check',
309 $tokenOk = $formProtection->validateToken($postValues[
'token'],
'installTool', $action);
343 return file_exists($this->configurationManager->getLocalConfigurationFileLocation());
359 $packageManager = GeneralUtility::makeInstance(PackageManager::class);
360 $packages = $packageManager->getAvailablePackages();
361 foreach ($packages as $package) {
363 $packageManager->activatePackage($package->getPackageKey());
366 $packageManager->forceSortAndSavePackageStates();
378 protected function enforceReferrer(ServerRequestInterface $request): ?ResponseInterface
380 if (!(
new Features())->isFeatureEnabled(
'security.backend.enforceReferrer')) {
384 'flags' => [
'refresh-always'],
385 'subject' =>
'Install Tool',