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/DistributionFileMaintenanceModeManager.php b/Classes/DistributionFileMaintenanceModeManager.php new file mode 100644 index 0000000..c813073 --- /dev/null +++ b/Classes/DistributionFileMaintenanceModeManager.php @@ -0,0 +1,21 @@ +pathToCheck)) { + return true; + } + return false; + } +} 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 @@ + + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..22bd216 --- /dev/null +++ b/README.md @@ -0,0 +1,19 @@ +# DigiComp.FlowMaintenanceMode + +This package assists in presenting each visitor of your system a page showing working on maintenance. + +It allows you to use usual error page rendering for that purpose - the idea is, that those layouts, should exist anyway. + +If you want to bypass the maintenance mode, you can do so by configuring a cookie based exception: + +```yaml +DigiComp: + FlowMaintenanceMode: + allowCookie: + name: name + value: value +``` + +That would allow you to bypass the maintenance answer, if you had a cookie named 'name' with a value of 'value'. If you set 'value' to `null` only the name is matched. + +You can extend the exception behavior, by implementing the `AllowModuleInterface` and add it to `DigiComp.FlowMaintenanceMode.allowModules`. This list is handled by `PositionalArraySorter`. You can use position keys to order them, or set their value to null to exclude them from being used. diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..aa57ae7 --- /dev/null +++ b/composer.json @@ -0,0 +1,26 @@ +{ + "name": "digicomp/flow-maintenance-mode", + "description": "Maintenance mode for Flow based systems", + "type": "neos-package", + "require": { + "neos/flow": "^7.3", + "php": "^8.1" + }, + "autoload": { + "psr-4": { + "DigiComp\\FlowMaintenanceMode\\": "Classes" + } + }, + "homepage": "https://git.digital-competence.de/Packages/DigiComp.FlowMaintenanceMode", + "license": "MIT", + "extra": { + "neos": { + "package-key": "DigiComp.FlowMaintenanceMode" + }, + "branch-alias": { + "dev-develop": "1.0.x-dev" + }, + "applied-flow-migrations": [ + ] + } +}