Merge branch 'origin/master' into Weblate.
[phpmyadmin.git] / src / Application.php
blob0a8faaa1ed118b4c0f543f24b8f85be6eb75a3de
1 <?php
3 declare(strict_types=1);
5 namespace PhpMyAdmin;
7 use Fig\Http\Message\StatusCodeInterface;
8 use Laminas\HttpHandlerRunner\Emitter\SapiEmitter;
9 use Laminas\HttpHandlerRunner\RequestHandlerRunner;
10 use PhpMyAdmin\Http\Factory\ResponseFactory;
11 use PhpMyAdmin\Http\Factory\ServerRequestFactory;
12 use PhpMyAdmin\Http\Handler\ApplicationHandler;
13 use PhpMyAdmin\Http\Handler\QueueRequestHandler;
14 use PhpMyAdmin\Http\Middleware\Authentication;
15 use PhpMyAdmin\Http\Middleware\ConfigErrorAndPermissionChecking;
16 use PhpMyAdmin\Http\Middleware\ConfigLoading;
17 use PhpMyAdmin\Http\Middleware\CurrentServerGlobalSetting;
18 use PhpMyAdmin\Http\Middleware\DatabaseAndTableSetting;
19 use PhpMyAdmin\Http\Middleware\DatabaseServerVersionChecking;
20 use PhpMyAdmin\Http\Middleware\EncryptedQueryParamsHandling;
21 use PhpMyAdmin\Http\Middleware\ErrorHandling;
22 use PhpMyAdmin\Http\Middleware\LanguageAndThemeCookieSaving;
23 use PhpMyAdmin\Http\Middleware\LanguageLoading;
24 use PhpMyAdmin\Http\Middleware\LoginCookieValiditySetting;
25 use PhpMyAdmin\Http\Middleware\MinimumCommonRedirection;
26 use PhpMyAdmin\Http\Middleware\OutputBuffering;
27 use PhpMyAdmin\Http\Middleware\PhpExtensionsChecking;
28 use PhpMyAdmin\Http\Middleware\PhpSettingsConfiguration;
29 use PhpMyAdmin\Http\Middleware\ProfilingChecking;
30 use PhpMyAdmin\Http\Middleware\RequestProblemChecking;
31 use PhpMyAdmin\Http\Middleware\ResponseRendererLoading;
32 use PhpMyAdmin\Http\Middleware\RouteParsing;
33 use PhpMyAdmin\Http\Middleware\ServerConfigurationChecking;
34 use PhpMyAdmin\Http\Middleware\SessionHandling;
35 use PhpMyAdmin\Http\Middleware\SetupPageRedirection;
36 use PhpMyAdmin\Http\Middleware\SqlDelimiterSetting;
37 use PhpMyAdmin\Http\Middleware\SqlQueryGlobalSetting;
38 use PhpMyAdmin\Http\Middleware\ThemeInitialization;
39 use PhpMyAdmin\Http\Middleware\TokenMismatchChecking;
40 use PhpMyAdmin\Http\Middleware\TokenRequestParamChecking;
41 use PhpMyAdmin\Http\Middleware\TrackerEnabling;
42 use PhpMyAdmin\Http\Middleware\UriSchemeUpdating;
43 use PhpMyAdmin\Http\Middleware\UrlParamsSetting;
44 use PhpMyAdmin\Http\Middleware\UrlRedirection;
45 use PhpMyAdmin\Http\Middleware\UserPreferencesLoading;
46 use PhpMyAdmin\Http\Middleware\ZeroConfPostConnection;
47 use PhpMyAdmin\Http\Response;
48 use PhpMyAdmin\Http\ServerRequest;
49 use PhpMyAdmin\Routing\Routing;
50 use Psr\Http\Message\ResponseInterface;
51 use Psr\Http\Message\ServerRequestInterface;
52 use Throwable;
54 use function sprintf;
56 class Application
58 public function __construct(
59 private readonly ErrorHandler $errorHandler,
60 private readonly Config $config,
61 private readonly Template $template,
62 private readonly ResponseFactory $responseFactory,
63 ) {
66 public static function init(): self
68 /** @var Application $application */
69 $application = Core::getContainerBuilder()->get(self::class);
71 return $application;
74 public function run(bool $isSetupPage = false): void
76 $requestHandler = new QueueRequestHandler(new ApplicationHandler($this));
77 $requestHandler->add(new ErrorHandling($this->errorHandler));
78 $requestHandler->add(new OutputBuffering());
79 $requestHandler->add(new PhpExtensionsChecking($this->template, $this->responseFactory));
80 $requestHandler->add(new ServerConfigurationChecking($this->template, $this->responseFactory));
81 $requestHandler->add(new PhpSettingsConfiguration());
82 $requestHandler->add(new RouteParsing());
83 $requestHandler->add(new ConfigLoading($this->config, $this->template, $this->responseFactory));
84 $requestHandler->add(new UriSchemeUpdating($this->config));
85 $requestHandler->add(new SessionHandling(
86 $this->config,
87 $this->errorHandler,
88 $this->template,
89 $this->responseFactory,
90 ));
91 $requestHandler->add(new EncryptedQueryParamsHandling());
92 $requestHandler->add(new UrlParamsSetting($this->config));
93 $requestHandler->add(new TokenRequestParamChecking());
94 $requestHandler->add(new DatabaseAndTableSetting());
95 $requestHandler->add(new SqlQueryGlobalSetting());
96 $requestHandler->add(new LanguageLoading());
97 $requestHandler->add(new ConfigErrorAndPermissionChecking(
98 $this->config,
99 $this->template,
100 $this->responseFactory,
102 $requestHandler->add(new RequestProblemChecking($this->template, $this->responseFactory));
103 $requestHandler->add(new CurrentServerGlobalSetting($this->config));
104 $requestHandler->add(new ThemeInitialization());
105 $requestHandler->add(new UrlRedirection($this->config));
106 $requestHandler->add(new SetupPageRedirection($this->config, $this->responseFactory));
107 $requestHandler->add(new MinimumCommonRedirection($this->config, $this->responseFactory));
108 $requestHandler->add(new LanguageAndThemeCookieSaving($this->config));
109 $requestHandler->add(new LoginCookieValiditySetting($this->config));
110 $requestHandler->add(new Authentication($this->config, $this->template, $this->responseFactory));
111 $requestHandler->add(new DatabaseServerVersionChecking($this->config, $this->template, $this->responseFactory));
112 $requestHandler->add(new SqlDelimiterSetting($this->config));
113 $requestHandler->add(new ResponseRendererLoading($this->config));
114 $requestHandler->add(new TokenMismatchChecking());
115 $requestHandler->add(new ProfilingChecking());
116 $requestHandler->add(new UserPreferencesLoading($this->config));
117 $requestHandler->add(new TrackerEnabling());
118 $requestHandler->add(new ZeroConfPostConnection($this->config));
120 $runner = new RequestHandlerRunner(
121 $requestHandler,
122 new SapiEmitter(),
123 static fn (): ServerRequestInterface => ServerRequestFactory::create()
124 ->fromGlobals()
125 ->withAttribute('isSetupPage', $isSetupPage),
126 function (Throwable $throwable): ResponseInterface {
127 $response = $this->responseFactory->createResponse(StatusCodeInterface::STATUS_INTERNAL_SERVER_ERROR);
128 $response->getBody()->write(sprintf('An error occurred: %s', $throwable->getMessage()));
130 return $response;
134 $runner->run();
137 public function handle(ServerRequest $request): Response|null
139 return Routing::callControllerForRoute(
140 $request,
141 Routing::getDispatcher(),
142 Core::getContainerBuilder(),
143 $this->responseFactory,