diff --git a/Classes/AllowModules/AllowModuleInterface.php b/Classes/AllowModules/AllowModuleInterface.php new file mode 100644 index 0000000..959d323 --- /dev/null +++ b/Classes/AllowModules/AllowModuleInterface.php @@ -0,0 +1,12 @@ +cookieName = $cookieName; + $this->cookieValue = $cookieValue; + } + + public function isRequestAllowed(ServerRequestInterface $request): bool + { + $cookies = $request->getCookieParams(); + if ($this->cookieName === null || !isset($cookies[$this->cookieName])) { + return false; + } + if ($this->cookieValue !== null && $cookies[$this->cookieName] !== $this->cookieValue) { + return false; + } + return true; + } +} diff --git a/Classes/Exception.php b/Classes/Exception.php new file mode 100644 index 0000000..cd10935 --- /dev/null +++ b/Classes/Exception.php @@ -0,0 +1,9 @@ + + */ + protected array $allowModules; + + public function __construct( + MaintenanceModeManagerInterface $maintenanceModeManager, + AllowModuleInterface ...$allowModules + ) { + $this->maintenanceModeManager = $maintenanceModeManager; + $this->allowModules = $allowModules; + } + + public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface + { + if ($this->maintenanceModeManager->isMaintenanceMode()) { + foreach ($this->allowModules as $allowModule) { + if ($allowModule->isRequestAllowed($request)) { + return $handler->handle($request); + } + } + throw new MaintenanceModeActiveException('Maintenance is active'); + } + return $handler->handle($request); + } +} diff --git a/Classes/Http/MaintenanceModeMiddlewareFactory.php b/Classes/Http/MaintenanceModeMiddlewareFactory.php new file mode 100644 index 0000000..cc52efb --- /dev/null +++ b/Classes/Http/MaintenanceModeMiddlewareFactory.php @@ -0,0 +1,40 @@ +objectManager = $objectManager; + } + + public function create(): MaintenanceModeMiddleware + { + $allowModules = []; + $sorter = new PositionalArraySorter($this->allowModuleNames); + foreach ($sorter->getSortedKeys() as $moduleName) { + $allowModules[] = $this->objectManager->get($moduleName); + } + + return new MaintenanceModeMiddleware( + $this->objectManager->get(MaintenanceModeManagerInterface::class), + ...$allowModules + ); + } +} diff --git a/Classes/MaintenanceModeActiveException.php b/Classes/MaintenanceModeActiveException.php new file mode 100644 index 0000000..48b1824 --- /dev/null +++ b/Classes/MaintenanceModeActiveException.php @@ -0,0 +1,10 @@ +