diff options
| author | Greg Roach <greg@subaqua.co.uk> | 2022-02-22 11:28:26 +0000 |
|---|---|---|
| committer | Greg Roach <greg@subaqua.co.uk> | 2022-02-23 10:22:28 +0000 |
| commit | b55cbc6b43247e8b2ad14af6f6d24dc6747195ff (patch) | |
| tree | 7c48ed3c99e4c7887dee5e923035c862fdff92cd /app | |
| parent | 709c7e1a4da00208ea2ab538eb0a1f2d46f63629 (diff) | |
| download | webtrees-b55cbc6b43247e8b2ad14af6f6d24dc6747195ff.tar.gz webtrees-b55cbc6b43247e8b2ad14af6f6d24dc6747195ff.tar.bz2 webtrees-b55cbc6b43247e8b2ad14af6f6d24dc6747195ff.zip | |
Update and use Validation class
Diffstat (limited to 'app')
290 files changed, 1358 insertions, 1915 deletions
diff --git a/app/Auth.php b/app/Auth.php index b3bee2ed54..811d1fd2d9 100644 --- a/app/Auth.php +++ b/app/Auth.php @@ -170,7 +170,10 @@ class Auth */ public static function user(): UserInterface { - return app(UserService::class)->find(self::id()) ?? new GuestUser(); + $user_service = app(UserService::class); + assert($user_service instanceof UserService); + + return $user_service->find(self::id()) ?? new GuestUser(); } /** diff --git a/app/Census/CensusColumnRelationToHead.php b/app/Census/CensusColumnRelationToHead.php index f4ff089918..9b2af642c8 100644 --- a/app/Census/CensusColumnRelationToHead.php +++ b/app/Census/CensusColumnRelationToHead.php @@ -22,6 +22,9 @@ namespace Fisharebest\Webtrees\Census; use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Services\RelationshipService; +use function app; +use function assert; + /** * Relationship to head of household. */ @@ -43,6 +46,9 @@ class CensusColumnRelationToHead extends AbstractCensusColumn implements CensusC return static::HEAD_OF_HOUSEHOLD; } - return app(RelationshipService::class)->getCloseRelationshipName($head, $individual); + $relationship_service = app(RelationshipService::class); + assert($relationship_service instanceof RelationshipService); + + return $relationship_service->getCloseRelationshipName($head, $individual); } } diff --git a/app/CommonMark/CensusTableExtension.php b/app/CommonMark/CensusTableExtension.php index b00b24c6bf..9feea43100 100644 --- a/app/CommonMark/CensusTableExtension.php +++ b/app/CommonMark/CensusTableExtension.php @@ -21,7 +21,6 @@ namespace Fisharebest\Webtrees\CommonMark; use League\CommonMark\Environment\EnvironmentBuilderInterface; use League\CommonMark\Extension\ConfigurableExtensionInterface; -use League\CommonMark\Extension\Table\TableExtension; use League\Config\ConfigurationBuilderInterface; /** diff --git a/app/CommonMark/XrefNode.php b/app/CommonMark/XrefNode.php index 76b3d20742..968cedf2d9 100644 --- a/app/CommonMark/XrefNode.php +++ b/app/CommonMark/XrefNode.php @@ -21,7 +21,6 @@ namespace Fisharebest\Webtrees\CommonMark; use Fisharebest\Webtrees\GedcomRecord; use League\CommonMark\Node\Node; -use League\CommonMark\Renderer\NodeRendererInterface; /** * Convert XREFs within markdown text to links diff --git a/app/Elements/AbstractEventElement.php b/app/Elements/AbstractEventElement.php index 7af4ba76be..23c5bbb55d 100644 --- a/app/Elements/AbstractEventElement.php +++ b/app/Elements/AbstractEventElement.php @@ -23,7 +23,6 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Tree; use function e; -use function nl2br; /** * Events which can take "Y" to indicate that they occurred, but date/place are unknown. diff --git a/app/Elements/Census.php b/app/Elements/Census.php index 8eba75c711..c893a36b5a 100644 --- a/app/Elements/Census.php +++ b/app/Elements/Census.php @@ -26,8 +26,12 @@ use Fisharebest\Webtrees\Module\CensusAssistantModule; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\ModuleService; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ServerRequestInterface; +use function app; +use function assert; + /** * Census */ @@ -62,9 +66,15 @@ class Census extends AbstractElement 'census_places' => Censuses::censusPlaces(I18N::languageTag()), ]); - $xref = app(ServerRequestInterface::class)->getAttribute('xref', ''); + $request = app(ServerRequestInterface::class); + assert($request instanceof ServerRequestInterface); + + $xref = Validator::attributes($request)->isXref()->string('xref', ''); + + $module_service = app(ModuleService::class); + assert($module_service instanceof ModuleService); - $census_assistant = app(ModuleService::class)->findByInterface(CensusAssistantModule::class)->first(); + $census_assistant = $module_service->findByInterface(CensusAssistantModule::class)->first(); $record = Registry::individualFactory()->make($xref, $tree); if ($census_assistant instanceof CensusAssistantModule && $record instanceof Individual) { diff --git a/app/Elements/DateValue.php b/app/Elements/DateValue.php index 0cc42655c7..1c63659e5c 100644 --- a/app/Elements/DateValue.php +++ b/app/Elements/DateValue.php @@ -57,7 +57,10 @@ class DateValue extends AbstractElement public function edit(string $id, string $name, string $value, Tree $tree): string { // Need to know if the user prefers DMY/MDY/YMD so we can validate dates properly. - $dmy = app(LocalizationService::class)->dateFormatToOrder(I18N::dateFormat()); + $localization_service = app(LocalizationService::class); + assert($localization_service instanceof LocalizationService); + + $dmy = $localization_service->dateFormatToOrder(I18N::dateFormat()); return '<div class="input-group">' . diff --git a/app/Encodings/UTF16BE.php b/app/Encodings/UTF16BE.php index 85c0cc92aa..81ba901b29 100644 --- a/app/Encodings/UTF16BE.php +++ b/app/Encodings/UTF16BE.php @@ -22,7 +22,6 @@ namespace Fisharebest\Webtrees\Encodings; use function chr; use function intdiv; use function ord; -use function str_split; /** * Convert between UTF-16BE and UTF-8. diff --git a/app/Encodings/UTF16LE.php b/app/Encodings/UTF16LE.php index afed6b0bd4..c96ef93416 100644 --- a/app/Encodings/UTF16LE.php +++ b/app/Encodings/UTF16LE.php @@ -22,7 +22,6 @@ namespace Fisharebest\Webtrees\Encodings; use function chr; use function intdiv; use function ord; -use function str_split; /** * Convert between UTF-16LE and UTF-8. diff --git a/app/Encodings/UTF8.php b/app/Encodings/UTF8.php index e1de438392..bed21d15c3 100644 --- a/app/Encodings/UTF8.php +++ b/app/Encodings/UTF8.php @@ -23,7 +23,6 @@ use InvalidArgumentException; use function chr; use function mb_substitute_character; -use function preg_replace; /** * Convert between (potentially invalid) UTF-8 and UTF-8. diff --git a/app/Exceptions/InvalidGedcomEncodingException.php b/app/Exceptions/InvalidGedcomEncodingException.php index 8205f0c1c5..e69490a86b 100644 --- a/app/Exceptions/InvalidGedcomEncodingException.php +++ b/app/Exceptions/InvalidGedcomEncodingException.php @@ -19,7 +19,6 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Exceptions; -use DomainException; use Exception; use Fisharebest\Webtrees\I18N; diff --git a/app/Factories/ElementFactory.php b/app/Factories/ElementFactory.php index 0bd768b16a..578dbd8a01 100644 --- a/app/Factories/ElementFactory.php +++ b/app/Factories/ElementFactory.php @@ -63,7 +63,6 @@ use Fisharebest\Webtrees\Elements\CountOfChildren; use Fisharebest\Webtrees\Elements\CountOfMarriages; use Fisharebest\Webtrees\Elements\Cremation; use Fisharebest\Webtrees\Elements\CustomElement; -use Fisharebest\Webtrees\Elements\CustomEvent; use Fisharebest\Webtrees\Elements\CustomFact; use Fisharebest\Webtrees\Elements\CustomFamilyEvent; use Fisharebest\Webtrees\Elements\CustomIndividualEvent; diff --git a/app/GedcomRecord.php b/app/GedcomRecord.php index 25f7cb13b6..a392dc779f 100644 --- a/app/GedcomRecord.php +++ b/app/GedcomRecord.php @@ -1000,7 +1000,10 @@ class GedcomRecord $this->pending = $new_gedcom; if (Auth::user()->getPreference(UserInterface::PREF_AUTO_ACCEPT_EDITS) === '1') { - app(PendingChangesService::class)->acceptRecord($this); + $pending_changes_service = app(PendingChangesService::class); + assert($pending_changes_service instanceof PendingChangesService); + + $pending_changes_service->acceptRecord($this); $this->gedcom = $new_gedcom; $this->pending = null; } @@ -1048,7 +1051,10 @@ class GedcomRecord // Accept this pending change if (Auth::user()->getPreference(UserInterface::PREF_AUTO_ACCEPT_EDITS) === '1') { - app(PendingChangesService::class)->acceptRecord($this); + $pending_changes_service = app(PendingChangesService::class); + assert($pending_changes_service instanceof PendingChangesService); + + $pending_changes_service->acceptRecord($this); $this->gedcom = $gedcom; $this->pending = null; } @@ -1078,7 +1084,10 @@ class GedcomRecord // Auto-accept this pending change if (Auth::user()->getPreference(UserInterface::PREF_AUTO_ACCEPT_EDITS) === '1') { - app(PendingChangesService::class)->acceptRecord($this); + $pending_changes_service = app(PendingChangesService::class); + assert($pending_changes_service instanceof PendingChangesService); + + $pending_changes_service->acceptRecord($this); } Log::addEditLog('Delete: ' . static::RECORD_TYPE . ' ' . $this->xref, $this->tree); diff --git a/app/Helpers/functions.php b/app/Helpers/functions.php index 4b8989a67b..c97bc28fa3 100644 --- a/app/Helpers/functions.php +++ b/app/Helpers/functions.php @@ -21,6 +21,7 @@ use Aura\Router\RouterContainer; use Fig\Http\Message\StatusCodeInterface; use Fisharebest\Webtrees\Html; use Fisharebest\Webtrees\Session as WebtreesSession; +use Fisharebest\Webtrees\Validator; use Fisharebest\Webtrees\View as WebtreesView; use Fisharebest\Webtrees\Webtrees; use Psr\Http\Message\ResponseFactoryInterface; @@ -62,7 +63,10 @@ function asset(string $path): string $version = '?v=' . filemtime(Webtrees::ROOT_DIR . 'public/' . $path); } - $base_url = app(ServerRequestInterface::class)->getAttribute('base_url'); + $request = app(ServerRequestInterface::class); + assert($request instanceof ServerRequestInterface); + + $base_url = Validator::attributes($request)->string('base_url'); return $base_url . '/public/' . $path . $version; } @@ -160,8 +164,10 @@ function response($content = '', int $code = StatusCodeInterface::STATUS_OK, arr */ function route(string $route_name, array $parameters = []): string { - $request = app(ServerRequestInterface::class); - $base_url = $request->getAttribute('base_url'); + $request = app(ServerRequestInterface::class); + assert($request instanceof ServerRequestInterface); + + $base_url = Validator::attributes($request)->string('base_url'); $router_container = app(RouterContainer::class); $route = $router_container->getMap()->getRoute($route_name); @@ -173,7 +179,7 @@ function route(string $route_name, array $parameters = []): string return !str_contains($route->path, '{' . $key . '}') && !str_contains($route->path, '{/' . $key . '}'); }, ARRAY_FILTER_USE_KEY); - if ($request->getAttribute('rewrite_urls') === '1') { + if (Validator::attributes($request)->boolean('rewrite_urls', false)) { // Make the pretty URL absolute. $base_path = parse_url($base_url, PHP_URL_PATH) ?? ''; $url = $base_url . substr($url, strlen($base_path)); diff --git a/app/Http/Middleware/AuthAdministrator.php b/app/Http/Middleware/AuthAdministrator.php index 0a3596985c..a60ddd6b69 100644 --- a/app/Http/Middleware/AuthAdministrator.php +++ b/app/Http/Middleware/AuthAdministrator.php @@ -24,6 +24,7 @@ use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Http\Exceptions\HttpAccessDeniedException; use Fisharebest\Webtrees\Http\RequestHandlers\LoginPage; use Fisharebest\Webtrees\User; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; @@ -45,7 +46,7 @@ class AuthAdministrator implements MiddlewareInterface */ public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { - $user = $request->getAttribute('user'); + $user = Validator::attributes($request)->user(); // Logged in with the correct role? if (Auth::isAdmin($user)) { diff --git a/app/Http/Middleware/AuthEditor.php b/app/Http/Middleware/AuthEditor.php index 4d34840df1..3c4555e324 100644 --- a/app/Http/Middleware/AuthEditor.php +++ b/app/Http/Middleware/AuthEditor.php @@ -23,14 +23,13 @@ use Fig\Http\Message\RequestMethodInterface; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Http\Exceptions\HttpAccessDeniedException; use Fisharebest\Webtrees\Http\RequestHandlers\LoginPage; -use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\User; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function redirect; use function route; @@ -47,10 +46,8 @@ class AuthEditor implements MiddlewareInterface */ public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); // Logged in with the correct role? if (Auth::isEditor($tree, $user)) { diff --git a/app/Http/Middleware/AuthLoggedIn.php b/app/Http/Middleware/AuthLoggedIn.php index ef5e12c0d7..7805e77255 100644 --- a/app/Http/Middleware/AuthLoggedIn.php +++ b/app/Http/Middleware/AuthLoggedIn.php @@ -22,6 +22,7 @@ namespace Fisharebest\Webtrees\Http\Middleware; use Fisharebest\Webtrees\Http\RequestHandlers\LoginPage; use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\User; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; @@ -42,8 +43,8 @@ class AuthLoggedIn implements MiddlewareInterface */ public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { - $tree = $request->getAttribute('tree'); - $user = $request->getAttribute('user'); + $tree = Validator::attributes($request)->treeOptional(); + $user = Validator::attributes($request)->user(); // Logged in? if ($user instanceof User) { diff --git a/app/Http/Middleware/AuthManager.php b/app/Http/Middleware/AuthManager.php index 4c75dc20cb..3f2ca4e346 100644 --- a/app/Http/Middleware/AuthManager.php +++ b/app/Http/Middleware/AuthManager.php @@ -23,14 +23,13 @@ use Fig\Http\Message\RequestMethodInterface; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Http\Exceptions\HttpAccessDeniedException; use Fisharebest\Webtrees\Http\RequestHandlers\LoginPage; -use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\User; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function redirect; use function route; @@ -47,10 +46,8 @@ class AuthManager implements MiddlewareInterface */ public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); // Logged in with the correct role? if (Auth::isManager($tree, $user)) { diff --git a/app/Http/Middleware/AuthMember.php b/app/Http/Middleware/AuthMember.php index 258a93be90..a5f1f083a2 100644 --- a/app/Http/Middleware/AuthMember.php +++ b/app/Http/Middleware/AuthMember.php @@ -23,14 +23,13 @@ use Fig\Http\Message\RequestMethodInterface; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Http\Exceptions\HttpAccessDeniedException; use Fisharebest\Webtrees\Http\RequestHandlers\LoginPage; -use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\User; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function redirect; use function route; @@ -47,10 +46,8 @@ class AuthMember implements MiddlewareInterface */ public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); // Logged in with the correct role? if (Auth::isMember($tree, $user)) { diff --git a/app/Http/Middleware/AuthModerator.php b/app/Http/Middleware/AuthModerator.php index 4e3e1d18ac..574e2b1939 100644 --- a/app/Http/Middleware/AuthModerator.php +++ b/app/Http/Middleware/AuthModerator.php @@ -23,14 +23,13 @@ use Fig\Http\Message\RequestMethodInterface; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Http\Exceptions\HttpAccessDeniedException; use Fisharebest\Webtrees\Http\RequestHandlers\LoginPage; -use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\User; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function redirect; use function route; @@ -47,10 +46,8 @@ class AuthModerator implements MiddlewareInterface */ public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); // Logged in with the correct role? if (Auth::isModerator($tree, $user)) { diff --git a/app/Http/Middleware/BadBotBlocker.php b/app/Http/Middleware/BadBotBlocker.php index 610a39fcd0..30dc317c43 100644 --- a/app/Http/Middleware/BadBotBlocker.php +++ b/app/Http/Middleware/BadBotBlocker.php @@ -21,6 +21,7 @@ namespace Fisharebest\Webtrees\Http\Middleware; use Fig\Http\Message\StatusCodeInterface; use Fisharebest\Webtrees\Registry; +use Fisharebest\Webtrees\Validator; use Iodev\Whois\Loaders\CurlLoader; use Iodev\Whois\Modules\Asn\AsnRouteInfo; use Iodev\Whois\Whois; @@ -165,8 +166,8 @@ class BadBotBlocker implements MiddlewareInterface */ public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { - $ua = $request->getServerParams()['HTTP_USER_AGENT'] ?? ''; - $ip = $request->getAttribute('client-ip'); + $ua = Validator::serverParams($request)->string('HTTP_USER_AGENT', ''); + $ip = Validator::attributes($request)->string('client-ip'); $address = IPFactory::parseAddressString($ip); assert($address instanceof AddressInterface); @@ -217,7 +218,9 @@ class BadBotBlocker implements MiddlewareInterface } // Allow sites to block access from entire networks. - preg_match_all('/(AS\d+)/', $request->getAttribute('block_asn', ''), $matches); + $block_asn = Validator::attributes($request)->string('block_asn', ''); + preg_match_all('/(AS\d+)/', $block_asn, $matches); + foreach ($matches[1] as $asn) { foreach ($this->fetchIpRangesForAsn($asn) as $range) { if ($range->contains($address)) { diff --git a/app/Http/Middleware/BaseUrl.php b/app/Http/Middleware/BaseUrl.php index 627548ddac..8a40459326 100644 --- a/app/Http/Middleware/BaseUrl.php +++ b/app/Http/Middleware/BaseUrl.php @@ -19,6 +19,7 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\Middleware; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; @@ -50,7 +51,7 @@ class BaseUrl implements MiddlewareInterface $request_url = $request->getUri(); // The base URL, as specified in the configuration file. - $base_url = $request->getAttribute('base_url', ''); + $base_url = Validator::attributes($request)->string('base_url'); if ($base_url === '') { // Guess the base URL from the request URL. diff --git a/app/Http/Middleware/CheckCsrf.php b/app/Http/Middleware/CheckCsrf.php index ba87018579..940748dc04 100644 --- a/app/Http/Middleware/CheckCsrf.php +++ b/app/Http/Middleware/CheckCsrf.php @@ -26,6 +26,7 @@ use Fisharebest\Webtrees\Http\RequestHandlers\SelectLanguage; use Fisharebest\Webtrees\Http\RequestHandlers\SelectTheme; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Session; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; @@ -53,7 +54,7 @@ class CheckCsrf implements MiddlewareInterface public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { if ($request->getMethod() === RequestMethodInterface::METHOD_POST) { - $route = $request->getAttribute('route'); + $route = Validator::attributes($request)->route(); if (!in_array($route->name, self::EXCLUDE_ROUTES, true)) { $params = (array) $request->getParsedBody(); diff --git a/app/Http/Middleware/HandleExceptions.php b/app/Http/Middleware/HandleExceptions.php index 8485411434..5a9370c674 100644 --- a/app/Http/Middleware/HandleExceptions.php +++ b/app/Http/Middleware/HandleExceptions.php @@ -26,6 +26,7 @@ use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\Log; use Fisharebest\Webtrees\Services\TreeService; use Fisharebest\Webtrees\Site; +use Fisharebest\Webtrees\Validator; use League\Flysystem\FilesystemException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -151,10 +152,9 @@ class HandleExceptions implements MiddlewareInterface, StatusCodeInterface */ private function httpExceptionResponse(ServerRequestInterface $request, HttpException $exception): ResponseInterface { - $tree = $request->getAttribute('tree'); - + $tree = Validator::attributes($request)->treeOptional(); $default = Site::getPreference('DEFAULT_GEDCOM'); - $tree = $tree ?? $this->tree_service->all()[$default] ?? $this->tree_service->all()->first(); + $tree ??= $this->tree_service->all()[$default] ?? $this->tree_service->all()->first(); $status_code = $exception->getCode(); @@ -183,7 +183,7 @@ class HandleExceptions implements MiddlewareInterface, StatusCodeInterface */ private function thirdPartyExceptionResponse(ServerRequestInterface $request, Throwable $exception): ResponseInterface { - $tree = $request->getAttribute('tree'); + $tree = Validator::attributes($request)->treeOptional(); $default = Site::getPreference('DEFAULT_GEDCOM'); $tree = $tree ?? $this->tree_service->all()[$default] ?? $this->tree_service->all()->first(); @@ -242,7 +242,7 @@ class HandleExceptions implements MiddlewareInterface, StatusCodeInterface 'title' => 'Error', 'error' => $trace, 'request' => $request, - 'tree' => $request->getAttribute('tree'), + 'tree' => Validator::attributes($request)->treeOptional(), ], StatusCodeInterface::STATUS_INTERNAL_SERVER_ERROR); } catch (Throwable $ignore) { // Try with a minimal header/menu diff --git a/app/Http/Middleware/LoadRoutes.php b/app/Http/Middleware/LoadRoutes.php index 71c54eb789..d2f85c429f 100644 --- a/app/Http/Middleware/LoadRoutes.php +++ b/app/Http/Middleware/LoadRoutes.php @@ -22,6 +22,7 @@ namespace Fisharebest\Webtrees\Http\Middleware; use Aura\Router\RouterContainer; use Fisharebest\Webtrees\Http\Routes\ApiRoutes; use Fisharebest\Webtrees\Http\Routes\WebRoutes; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; @@ -59,7 +60,7 @@ class LoadRoutes implements MiddlewareInterface */ public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { - $base_url = $request->getAttribute('base_url'); + $base_url = Validator::attributes($request)->string('base_url'); $base_path = parse_url($base_url, PHP_URL_PATH); $router_container = new RouterContainer($base_path); diff --git a/app/Http/Middleware/RequestHandler.php b/app/Http/Middleware/RequestHandler.php index c4c698a3e9..6f12149170 100644 --- a/app/Http/Middleware/RequestHandler.php +++ b/app/Http/Middleware/RequestHandler.php @@ -20,6 +20,7 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\Middleware; use Aura\Router\Route; +use Fisharebest\Webtrees\Validator; use Illuminate\Container\Container; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -41,8 +42,7 @@ class RequestHandler implements MiddlewareInterface */ public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { - /** @var Route $route */ - $route = $request->getAttribute('route'); + $route = Validator::attributes($request)->route(); $request_handler = $route->handler; diff --git a/app/Http/Middleware/Router.php b/app/Http/Middleware/Router.php index ee4dd5e11d..b3a58e2449 100644 --- a/app/Http/Middleware/Router.php +++ b/app/Http/Middleware/Router.php @@ -26,6 +26,7 @@ use Fig\Http\Message\StatusCodeInterface; use Fisharebest\Webtrees\Services\ModuleService; use Fisharebest\Webtrees\Services\TreeService; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Fisharebest\Webtrees\Webtrees; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -75,7 +76,7 @@ class Router implements MiddlewareInterface // Turn the ugly URL into a pretty one, so the router can parse it. $pretty = $request; - if ($request->getAttribute('rewrite_urls') !== '1') { + if (!Validator::attributes($request)->boolean('rewrite_urls', false)) { // Ugly URLs store the path in a query parameter. $url_route = $request->getQueryParams()['route'] ?? ''; $uri = $request->getUri()->withPath($url_route); diff --git a/app/Http/Middleware/UseDatabase.php b/app/Http/Middleware/UseDatabase.php index bb2580f51c..9ccc1235b8 100644 --- a/app/Http/Middleware/UseDatabase.php +++ b/app/Http/Middleware/UseDatabase.php @@ -19,6 +19,7 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\Middleware; +use Fisharebest\Webtrees\Validator; use Fisharebest\Webtrees\Webtrees; use Illuminate\Database\Capsule\Manager as DB; use PDO; @@ -43,9 +44,9 @@ class UseDatabase implements MiddlewareInterface public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { // Earlier versions of webtrees did not have a dbtype config option. They always used mysql. - $driver = $request->getAttribute('dbtype', 'mysql'); + $driver = Validator::attributes($request)->string('dbtype', 'mysql'); - $dbname = $request->getAttribute('dbname'); + $dbname = Validator::attributes($request)->string('dbname'); if ($driver === 'sqlite') { $dbname = Webtrees::ROOT_DIR . 'data/' . $dbname . '.sqlite'; @@ -54,7 +55,7 @@ class UseDatabase implements MiddlewareInterface $capsule = new DB(); // Newer versions of webtrees support utf8mb4. Older ones only support 3-byte utf8 - if ($driver === 'mysql' && $request->getAttribute('mysql_utf8mb4') === '1') { + if ($driver === 'mysql' && Validator::attributes($request)->boolean('mysql_utf8mb4', false)) { $charset = 'utf8mb4'; $collation = 'utf8mb4_unicode_ci'; } else { @@ -67,10 +68,10 @@ class UseDatabase implements MiddlewareInterface PDO::ATTR_STRINGIFY_FETCHES => true, ]; - $dbkey = (string) $request->getAttribute('dbkey'); - $dbcert = (string) $request->getAttribute('dbcert'); - $dbca = (string) $request->getAttribute('dbca'); - $dbverify = (bool) $request->getAttribute('dbverify'); + $dbkey = Validator::attributes($request)->string('dbkey', ''); + $dbcert = Validator::attributes($request)->string('dbcert', ''); + $dbca = Validator::attributes($request)->string('dbca', ''); + $dbverify = Validator::attributes($request)->boolean('dbverify', false); // MySQL/MariaDB support encrypted connections if ($dbkey !== '' && $dbcert !== '' && $dbca !== '') { @@ -82,12 +83,12 @@ class UseDatabase implements MiddlewareInterface $capsule->addConnection([ 'driver' => $driver, - 'host' => $request->getAttribute('dbhost'), - 'port' => $request->getAttribute('dbport'), + 'host' => Validator::attributes($request)->string('dbhost'), + 'port' => Validator::attributes($request)->string('dbport'), 'database' => $dbname, - 'username' => $request->getAttribute('dbuser'), - 'password' => $request->getAttribute('dbpass'), - 'prefix' => $request->getAttribute('tblpfx'), + 'username' => Validator::attributes($request)->string('dbuser'), + 'password' => Validator::attributes($request)->string('dbpass'), + 'prefix' => Validator::attributes($request)->string('tblpfx'), 'prefix_indexes' => true, 'options' => $options, // For MySQL diff --git a/app/Http/RequestHandlers/AbstractTomSelectHandler.php b/app/Http/RequestHandlers/AbstractTomSelectHandler.php index 7411ef7e54..e37cfbd25f 100644 --- a/app/Http/RequestHandlers/AbstractTomSelectHandler.php +++ b/app/Http/RequestHandlers/AbstractTomSelectHandler.php @@ -26,9 +26,7 @@ use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function response; -use function strlen; /** * Autocomplete for TomSelect based controls. @@ -45,12 +43,11 @@ abstract class AbstractTomSelectHandler implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); - $at = Validator::queryParams($request)->requiredString('at'); - $page = Validator::queryParams($request)->integer('page') ?? 1; - $query = Validator::queryParams($request)->requiredString('query'); + $at = Validator::queryParams($request)->string('at'); + $page = Validator::queryParams($request)->optionalInteger('page') ?? 1; + $query = Validator::queryParams($request)->string('query'); // Fetch one more row than we need, so we can know if more rows exist. $offset = ($page - 1) * self::RESULTS_PER_PAGE; diff --git a/app/Http/RequestHandlers/AccountDelete.php b/app/Http/RequestHandlers/AccountDelete.php index b0b906db35..1fe1012abc 100644 --- a/app/Http/RequestHandlers/AccountDelete.php +++ b/app/Http/RequestHandlers/AccountDelete.php @@ -24,6 +24,7 @@ use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Services\UserService; use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\User; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -55,8 +56,8 @@ class AccountDelete implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - $user = $request->getAttribute('user'); + $tree = Validator::attributes($request)->treeOptional(); + $user = Validator::attributes($request)->user(); // An administrator can only be deleted by another administrator if ($user instanceof User && $user->getPreference(UserInterface::PREF_IS_ADMINISTRATOR) !== '1') { diff --git a/app/Http/RequestHandlers/AccountEdit.php b/app/Http/RequestHandlers/AccountEdit.php index ae14453eaf..88122d06ee 100644 --- a/app/Http/RequestHandlers/AccountEdit.php +++ b/app/Http/RequestHandlers/AccountEdit.php @@ -29,7 +29,7 @@ use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\MessageService; use Fisharebest\Webtrees\Services\ModuleService; use Fisharebest\Webtrees\Tree; -use Fisharebest\Webtrees\User; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -66,10 +66,8 @@ class AccountEdit implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - - $user = $request->getAttribute('user'); - assert($user instanceof User); + $tree = Validator::attributes($request)->treeOptional(); + $user = Validator::attributes($request)->user(); if ($tree instanceof Tree) { $my_individual_record = Registry::individualFactory()->make($tree->getUserPreference(Auth::user(), UserInterface::PREF_TREE_ACCOUNT_XREF), $tree); diff --git a/app/Http/RequestHandlers/AccountUpdate.php b/app/Http/RequestHandlers/AccountUpdate.php index 19f6f0dae3..14abcf100b 100644 --- a/app/Http/RequestHandlers/AccountUpdate.php +++ b/app/Http/RequestHandlers/AccountUpdate.php @@ -26,6 +26,7 @@ use Fisharebest\Webtrees\Services\UserService; use Fisharebest\Webtrees\Session; use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\User; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -57,9 +58,9 @@ class AccountUpdate implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); + $tree = Validator::attributes($request)->treeOptional(); + $user = Validator::attributes($request)->user(); - $user = $request->getAttribute('user'); assert($user instanceof User); $params = (array) $request->getParsedBody(); diff --git a/app/Http/RequestHandlers/AddChildToFamilyAction.php b/app/Http/RequestHandlers/AddChildToFamilyAction.php index 232df36526..1798c39960 100644 --- a/app/Http/RequestHandlers/AddChildToFamilyAction.php +++ b/app/Http/RequestHandlers/AddChildToFamilyAction.php @@ -22,7 +22,6 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\GedcomEditService; -use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -56,17 +55,11 @@ class AddChildToFamilyAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); $params = (array) $request->getParsedBody(); - $family = Registry::familyFactory()->make($xref, $tree); $family = Auth::checkFamilyAccess($family, true); - $levels = $params['ilevels'] ?? []; $tags = $params['itags'] ?? []; $values = $params['ivalues'] ?? []; @@ -78,8 +71,8 @@ class AddChildToFamilyAction implements RequestHandlerInterface // Link the child to the family $family->createFact('1 CHIL @' . $child->xref() . '@', false); - $base_url = $request->getAttribute('base_url'); - $url = Validator::parsedBody($request)->isLocalUrl($base_url)->string('url') ?? $child->url(); + $base_url = Validator::attributes($request)->string('base_url'); + $url = Validator::parsedBody($request)->isLocalUrl($base_url)->optionalString('url') ?? $child->url(); return redirect($url); } diff --git a/app/Http/RequestHandlers/AddChildToFamilyPage.php b/app/Http/RequestHandlers/AddChildToFamilyPage.php index 4715aa6623..2292eabb77 100644 --- a/app/Http/RequestHandlers/AddChildToFamilyPage.php +++ b/app/Http/RequestHandlers/AddChildToFamilyPage.php @@ -20,13 +20,12 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Fact; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\GedcomEditService; use Fisharebest\Webtrees\SurnameTradition; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -61,15 +60,9 @@ class AddChildToFamilyPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - - $sex = $request->getAttribute('sex'); - assert(is_string($sex)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $sex = Validator::attributes($request)->string('sex'); $family = Registry::familyFactory()->make($xref, $tree); $family = Auth::checkFamilyAccess($family, true); diff --git a/app/Http/RequestHandlers/AddChildToIndividualAction.php b/app/Http/RequestHandlers/AddChildToIndividualAction.php index 70aa01557d..98ec77636d 100644 --- a/app/Http/RequestHandlers/AddChildToIndividualAction.php +++ b/app/Http/RequestHandlers/AddChildToIndividualAction.php @@ -22,7 +22,6 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\GedcomEditService; -use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -56,14 +55,9 @@ class AddChildToIndividualAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - - $params = (array) $request->getParsedBody(); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $params = (array) $request->getParsedBody(); $individual = Registry::individualFactory()->make($xref, $tree); $individual = Auth::checkIndividualAccess($individual, true); @@ -86,8 +80,8 @@ class AddChildToIndividualAction implements RequestHandlerInterface // Link the child to the family $child->createFact('1 FAMC @' . $family->xref() . '@', false); - $base_url = $request->getAttribute('base_url'); - $url = Validator::parsedBody($request)->isLocalUrl($base_url)->string('url') ?? $child->url(); + $base_url = Validator::attributes($request)->string('base_url'); + $url = Validator::parsedBody($request)->isLocalUrl($base_url)->optionalString('url') ?? $child->url(); return redirect($url); } diff --git a/app/Http/RequestHandlers/AddChildToIndividualPage.php b/app/Http/RequestHandlers/AddChildToIndividualPage.php index c10635e636..3669fc1d3d 100644 --- a/app/Http/RequestHandlers/AddChildToIndividualPage.php +++ b/app/Http/RequestHandlers/AddChildToIndividualPage.php @@ -20,20 +20,16 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Fact; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\GedcomEditService; use Fisharebest\Webtrees\SurnameTradition; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function array_map; -use function assert; -use function is_string; use function route; /** @@ -62,12 +58,8 @@ class AddChildToIndividualPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); $individual = Registry::individualFactory()->make($xref, $tree); $individual = Auth::checkIndividualAccess($individual, true); diff --git a/app/Http/RequestHandlers/AddMediaFileAction.php b/app/Http/RequestHandlers/AddMediaFileAction.php index 249167ce59..31745241a1 100644 --- a/app/Http/RequestHandlers/AddMediaFileAction.php +++ b/app/Http/RequestHandlers/AddMediaFileAction.php @@ -25,13 +25,11 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\MediaFileService; use Fisharebest\Webtrees\Services\PendingChangesService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; -use function is_string; use function redirect; /** @@ -64,15 +62,10 @@ class AddMediaFileAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - - $media = Registry::mediaFactory()->make($xref, $tree); - $media = Auth::checkMediaAccess($media, true); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $media = Registry::mediaFactory()->make($xref, $tree); + $media = Auth::checkMediaAccess($media, true); $params = (array) $request->getParsedBody(); $title = $params['title'] ?? ''; $type = $params['type'] ?? ''; diff --git a/app/Http/RequestHandlers/AddMediaFileModal.php b/app/Http/RequestHandlers/AddMediaFileModal.php index 65ebea621e..326b8b9de4 100644 --- a/app/Http/RequestHandlers/AddMediaFileModal.php +++ b/app/Http/RequestHandlers/AddMediaFileModal.php @@ -25,7 +25,7 @@ use Fisharebest\Webtrees\Http\Exceptions\HttpNotFoundException; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\MediaFileService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -61,11 +61,8 @@ class AddMediaFileModal implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); $data_filesystem = Registry::filesystem()->data(); diff --git a/app/Http/RequestHandlers/AddNewFact.php b/app/Http/RequestHandlers/AddNewFact.php index 80fada3c0b..0da760c588 100644 --- a/app/Http/RequestHandlers/AddNewFact.php +++ b/app/Http/RequestHandlers/AddNewFact.php @@ -25,12 +25,11 @@ use Fisharebest\Webtrees\Http\Exceptions\HttpAccessDeniedException; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\GedcomEditService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function route; use function trim; @@ -60,11 +59,9 @@ class AddNewFact implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = (string) $request->getAttribute('xref'); - $subtag = (string) $request->getAttribute('fact'); + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $subtag = Validator::attributes($request)->isTag()->string('fact'); if ($subtag === 'OBJE' && !Auth::canUploadMedia($tree, Auth::user())) { throw new HttpAccessDeniedException(); diff --git a/app/Http/RequestHandlers/AddParentToIndividualAction.php b/app/Http/RequestHandlers/AddParentToIndividualAction.php index 9ea0f0dd5c..ace8bebed4 100644 --- a/app/Http/RequestHandlers/AddParentToIndividualAction.php +++ b/app/Http/RequestHandlers/AddParentToIndividualAction.php @@ -22,14 +22,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\GedcomEditService; -use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; -use function is_string; use function redirect; /** @@ -56,14 +53,9 @@ class AddParentToIndividualAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - - $params = (array) $request->getParsedBody(); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $params = (array) $request->getParsedBody(); $individual = Registry::individualFactory()->make($xref, $tree); $individual = Auth::checkIndividualAccess($individual, true); @@ -86,8 +78,8 @@ class AddParentToIndividualAction implements RequestHandlerInterface // Link the parent to the family $parent->createFact('1 FAMS @' . $family->xref() . '@', false); - $base_url = $request->getAttribute('base_url'); - $url = Validator::parsedBody($request)->isLocalUrl($base_url)->string('url') ?? $parent->url(); + $base_url = Validator::attributes($request)->string('base_url'); + $url = Validator::parsedBody($request)->isLocalUrl($base_url)->optionalString('url') ?? $parent->url(); return redirect($url); } diff --git a/app/Http/RequestHandlers/AddParentToIndividualPage.php b/app/Http/RequestHandlers/AddParentToIndividualPage.php index 8e4d6e8bb2..fbdc628b29 100644 --- a/app/Http/RequestHandlers/AddParentToIndividualPage.php +++ b/app/Http/RequestHandlers/AddParentToIndividualPage.php @@ -20,20 +20,16 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Fact; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\GedcomEditService; use Fisharebest\Webtrees\SurnameTradition; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function array_map; -use function assert; -use function is_string; use function route; /** @@ -62,15 +58,9 @@ class AddParentToIndividualPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - - $sex = $request->getAttribute('sex'); - assert(is_string($sex)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $sex = Validator::attributes($request)->string('sex'); $individual = Registry::individualFactory()->make($xref, $tree); $individual = Auth::checkIndividualAccess($individual, true); diff --git a/app/Http/RequestHandlers/AddSpouseToFamilyAction.php b/app/Http/RequestHandlers/AddSpouseToFamilyAction.php index f4d9a007c9..b33c8d781c 100644 --- a/app/Http/RequestHandlers/AddSpouseToFamilyAction.php +++ b/app/Http/RequestHandlers/AddSpouseToFamilyAction.php @@ -22,7 +22,6 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\GedcomEditService; -use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -56,14 +55,9 @@ class AddSpouseToFamilyAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); $params = (array) $request->getParsedBody(); - $family = Registry::familyFactory()->make($xref, $tree); $family = Auth::checkFamilyAccess($family, true); @@ -95,8 +89,8 @@ class AddSpouseToFamilyAction implements RequestHandlerInterface // Link the spouse to the family $family->createFact('1 ' . $link . ' @' . $spouse->xref() . '@', false); - $base_url = $request->getAttribute('base_url'); - $url = Validator::parsedBody($request)->isLocalUrl($base_url)->string('url') ?? $spouse->url(); + $base_url = Validator::attributes($request)->string('base_url'); + $url = Validator::parsedBody($request)->isLocalUrl($base_url)->optionalString('url') ?? $spouse->url(); return redirect($url); } diff --git a/app/Http/RequestHandlers/AddSpouseToFamilyPage.php b/app/Http/RequestHandlers/AddSpouseToFamilyPage.php index f1ba17b0ad..8e8a1ced7f 100644 --- a/app/Http/RequestHandlers/AddSpouseToFamilyPage.php +++ b/app/Http/RequestHandlers/AddSpouseToFamilyPage.php @@ -20,19 +20,17 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Fact; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\GedcomEditService; use Fisharebest\Webtrees\SurnameTradition; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function array_map; use function assert; use function is_string; use function route; @@ -63,15 +61,9 @@ class AddSpouseToFamilyPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - - $sex = $request->getAttribute('sex'); - assert(is_string($sex)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $sex = Validator::attributes($request)->string('sex'); $family = Registry::familyFactory()->make($xref, $tree); $family = Auth::checkFamilyAccess($family, true); diff --git a/app/Http/RequestHandlers/AddSpouseToIndividualAction.php b/app/Http/RequestHandlers/AddSpouseToIndividualAction.php index edadd01aa1..12b4a283cf 100644 --- a/app/Http/RequestHandlers/AddSpouseToIndividualAction.php +++ b/app/Http/RequestHandlers/AddSpouseToIndividualAction.php @@ -22,14 +22,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\GedcomEditService; -use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; -use function is_string; use function redirect; /** @@ -56,14 +53,9 @@ class AddSpouseToIndividualAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - - $params = (array) $request->getParsedBody(); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $params = (array) $request->getParsedBody(); $individual = Registry::individualFactory()->make($xref, $tree); $individual = Auth::checkIndividualAccess($individual, true); @@ -89,8 +81,8 @@ class AddSpouseToIndividualAction implements RequestHandlerInterface // Link the spouse to the family $spouse->createFact('1 FAMS @' . $family->xref() . '@', false); - $base_url = $request->getAttribute('base_url'); - $url = Validator::parsedBody($request)->isLocalUrl($base_url)->string('url') ?? $spouse->url(); + $base_url = Validator::attributes($request)->string('base_url'); + $url = Validator::parsedBody($request)->isLocalUrl($base_url)->optionalString('url') ?? $spouse->url(); return redirect($url); } diff --git a/app/Http/RequestHandlers/AddSpouseToIndividualPage.php b/app/Http/RequestHandlers/AddSpouseToIndividualPage.php index e822aa482b..98ec966a94 100644 --- a/app/Http/RequestHandlers/AddSpouseToIndividualPage.php +++ b/app/Http/RequestHandlers/AddSpouseToIndividualPage.php @@ -20,20 +20,16 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Fact; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\GedcomEditService; use Fisharebest\Webtrees\SurnameTradition; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function array_map; -use function assert; -use function is_string; use function route; /** @@ -70,12 +66,8 @@ class AddSpouseToIndividualPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); $individual = Registry::individualFactory()->make($xref, $tree); $individual = Auth::checkIndividualAccess($individual, true); diff --git a/app/Http/RequestHandlers/AddUnlinkedAction.php b/app/Http/RequestHandlers/AddUnlinkedAction.php index 3212480b23..cb34f21298 100644 --- a/app/Http/RequestHandlers/AddUnlinkedAction.php +++ b/app/Http/RequestHandlers/AddUnlinkedAction.php @@ -20,13 +20,11 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Services\GedcomEditService; -use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function redirect; /** @@ -53,8 +51,7 @@ class AddUnlinkedAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $params = (array) $request->getParsedBody(); @@ -66,8 +63,8 @@ class AddUnlinkedAction implements RequestHandlerInterface $individual = $tree->createIndividual("0 @@ INDI\n" . $gedcom); - $base_url = $request->getAttribute('base_url'); - $url = Validator::parsedBody($request)->isLocalUrl($base_url)->string('url') ?? $individual->url(); + $base_url = Validator::attributes($request)->string('base_url'); + $url = Validator::parsedBody($request)->isLocalUrl($base_url)->optionalString('url') ?? $individual->url(); return redirect($url); } diff --git a/app/Http/RequestHandlers/AddUnlinkedPage.php b/app/Http/RequestHandlers/AddUnlinkedPage.php index 3ec2059827..bd02d6d5b5 100644 --- a/app/Http/RequestHandlers/AddUnlinkedPage.php +++ b/app/Http/RequestHandlers/AddUnlinkedPage.php @@ -23,12 +23,11 @@ use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\GedcomEditService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function route; /** @@ -57,9 +56,7 @@ class AddUnlinkedPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - + $tree = Validator::attributes($request)->tree(); $sex = Registry::elementFactory()->make('INDI:SEX')->default($tree); $name = Registry::elementFactory()->make('INDI:NAME')->default($tree); diff --git a/app/Http/RequestHandlers/AdminMediaFileDownload.php b/app/Http/RequestHandlers/AdminMediaFileDownload.php index ca67824d81..3f81c22d61 100644 --- a/app/Http/RequestHandlers/AdminMediaFileDownload.php +++ b/app/Http/RequestHandlers/AdminMediaFileDownload.php @@ -20,6 +20,7 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Registry; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -39,8 +40,7 @@ class AdminMediaFileDownload implements RequestHandlerInterface public function handle(ServerRequestInterface $request): ResponseInterface { $filesystem = Registry::filesystem()->data(); - $params = $request->getQueryParams(); - $path = $params['path'] ?? ''; + $path = Validator::queryParams($request)->string('path'); return Registry::imageFactory()->fileResponse($filesystem, $path, false); } diff --git a/app/Http/RequestHandlers/AutoCompleteCitation.php b/app/Http/RequestHandlers/AutoCompleteCitation.php index e0b076b05e..8c2a2969f3 100644 --- a/app/Http/RequestHandlers/AutoCompleteCitation.php +++ b/app/Http/RequestHandlers/AutoCompleteCitation.php @@ -22,13 +22,12 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\GedcomRecord; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Query\JoinClause; use Illuminate\Support\Collection; use Psr\Http\Message\ServerRequestInterface; -use function assert; use function preg_match_all; use function preg_quote; @@ -39,9 +38,7 @@ class AutoCompleteCitation extends AbstractAutocompleteHandler { protected function search(ServerRequestInterface $request): Collection { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - + $tree = Validator::attributes($request)->tree(); $query = $request->getQueryParams()['query'] ?? ''; $xref = $request->getQueryParams()['extra'] ?? ''; $source = Registry::sourceFactory()->make($xref, $tree); diff --git a/app/Http/RequestHandlers/AutoCompleteFolder.php b/app/Http/RequestHandlers/AutoCompleteFolder.php index 8b10b33626..14c43df247 100644 --- a/app/Http/RequestHandlers/AutoCompleteFolder.php +++ b/app/Http/RequestHandlers/AutoCompleteFolder.php @@ -21,13 +21,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Services\MediaFileService; use Fisharebest\Webtrees\Services\SearchService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Support\Collection; use League\Flysystem\FilesystemException; use Psr\Http\Message\ServerRequestInterface; -use function assert; - /** * Autocomplete handler for media folders */ @@ -49,8 +47,7 @@ class AutoCompleteFolder extends AbstractAutocompleteHandler */ protected function search(ServerRequestInterface $request): Collection { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $query = $request->getQueryParams()['query'] ?? ''; diff --git a/app/Http/RequestHandlers/AutoCompletePlace.php b/app/Http/RequestHandlers/AutoCompletePlace.php index 0fe25ab498..68a9ee5a75 100644 --- a/app/Http/RequestHandlers/AutoCompletePlace.php +++ b/app/Http/RequestHandlers/AutoCompletePlace.php @@ -23,12 +23,10 @@ use Fisharebest\Webtrees\Module\ModuleMapAutocompleteInterface; use Fisharebest\Webtrees\Place; use Fisharebest\Webtrees\Services\ModuleService; use Fisharebest\Webtrees\Services\SearchService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Support\Collection; use Psr\Http\Message\ServerRequestInterface; -use function assert; - /** * Autocomplete handler for places */ @@ -54,8 +52,7 @@ class AutoCompletePlace extends AbstractAutocompleteHandler */ protected function search(ServerRequestInterface $request): Collection { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $query = $request->getQueryParams()['query'] ?? ''; diff --git a/app/Http/RequestHandlers/AutoCompleteSurname.php b/app/Http/RequestHandlers/AutoCompleteSurname.php index 2f3541b15b..bba63837bc 100644 --- a/app/Http/RequestHandlers/AutoCompleteSurname.php +++ b/app/Http/RequestHandlers/AutoCompleteSurname.php @@ -19,12 +19,10 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Support\Collection; use Psr\Http\Message\ServerRequestInterface; -use function assert; - /** * Autocomplete handler for surnames */ @@ -37,8 +35,7 @@ class AutoCompleteSurname extends AbstractAutocompleteHandler */ protected function search(ServerRequestInterface $request): Collection { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $query = $request->getQueryParams()['query'] ?? ''; diff --git a/app/Http/RequestHandlers/BroadcastAction.php b/app/Http/RequestHandlers/BroadcastAction.php index fdffd1ab2c..8a5c09ed6c 100644 --- a/app/Http/RequestHandlers/BroadcastAction.php +++ b/app/Http/RequestHandlers/BroadcastAction.php @@ -23,6 +23,7 @@ use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\MessageService; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -57,13 +58,13 @@ class BroadcastAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $user = $request->getAttribute('user'); + $user = Validator::attributes($request)->user(); $params = (array) $request->getParsedBody(); $body = $params['body']; $subject = $params['subject']; $to = $params['to']; - $ip = $request->getAttribute('client-ip'); + $ip = Validator::attributes($request)->string('client-ip'); $to_users = $this->message_service->recipientUsers($to); if ($body === '' || $subject === '') { diff --git a/app/Http/RequestHandlers/BroadcastPage.php b/app/Http/RequestHandlers/BroadcastPage.php index b84467bdf4..9de46dae2c 100644 --- a/app/Http/RequestHandlers/BroadcastPage.php +++ b/app/Http/RequestHandlers/BroadcastPage.php @@ -22,6 +22,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\Services\MessageService; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -52,7 +53,7 @@ class BroadcastPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $user = $request->getAttribute('user'); + $user = Validator::attributes($request)->user(); $params = $request->getQueryParams(); $body = $params['body'] ?? ''; $subject = $params['subject'] ?? ''; diff --git a/app/Http/RequestHandlers/CalendarAction.php b/app/Http/RequestHandlers/CalendarAction.php index 0b0d33f066..379055fbda 100644 --- a/app/Http/RequestHandlers/CalendarAction.php +++ b/app/Http/RequestHandlers/CalendarAction.php @@ -19,12 +19,11 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function redirect; use function route; @@ -40,10 +39,8 @@ class CalendarAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $view = $request->getAttribute('view'); + $tree = Validator::attributes($request)->tree(); + $view = Validator::attributes($request)->string('view'); $params = (array) $request->getParsedBody(); diff --git a/app/Http/RequestHandlers/CalendarEvents.php b/app/Http/RequestHandlers/CalendarEvents.php index 28661e8f9d..669f1ed33f 100644 --- a/app/Http/RequestHandlers/CalendarEvents.php +++ b/app/Http/RequestHandlers/CalendarEvents.php @@ -33,12 +33,12 @@ use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\CalendarService; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Support\Collection; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function count; use function e; use function explode; @@ -75,10 +75,8 @@ class CalendarEvents implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $view = $request->getAttribute('view'); + $tree = Validator::attributes($request)->tree(); + $view = Validator::attributes($request)->string('view'); $CALENDAR_FORMAT = $tree->getPreference('CALENDAR_FORMAT'); $cal = $request->getQueryParams()['cal'] ?? ''; diff --git a/app/Http/RequestHandlers/CalendarPage.php b/app/Http/RequestHandlers/CalendarPage.php index 3b7c01f4bc..c845a551ed 100644 --- a/app/Http/RequestHandlers/CalendarPage.php +++ b/app/Http/RequestHandlers/CalendarPage.php @@ -24,13 +24,11 @@ use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\CalendarService; use Fisharebest\Webtrees\Services\LocalizationService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; - /** * Show anniversaries for events in a given day/month/year. */ @@ -63,10 +61,9 @@ class CalendarPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); - $view = $request->getAttribute('view'); + $view = Validator::attributes($request)->string('view'); $cal = $request->getQueryParams()['cal'] ?? ''; $day = $request->getQueryParams()['day'] ?? ''; $month = $request->getQueryParams()['month'] ?? ''; diff --git a/app/Http/RequestHandlers/ChangeFamilyMembersAction.php b/app/Http/RequestHandlers/ChangeFamilyMembersAction.php index 68fac3ff62..0a6b334482 100644 --- a/app/Http/RequestHandlers/ChangeFamilyMembersAction.php +++ b/app/Http/RequestHandlers/ChangeFamilyMembersAction.php @@ -22,12 +22,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function in_array; use function redirect; @@ -43,8 +42,7 @@ class ChangeFamilyMembersAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $params = (array) $request->getParsedBody(); diff --git a/app/Http/RequestHandlers/ChangeFamilyMembersPage.php b/app/Http/RequestHandlers/ChangeFamilyMembersPage.php index 0463c2d67e..c41eab84f4 100644 --- a/app/Http/RequestHandlers/ChangeFamilyMembersPage.php +++ b/app/Http/RequestHandlers/ChangeFamilyMembersPage.php @@ -23,13 +23,11 @@ use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; - /** * Change the members of a family. */ @@ -44,9 +42,7 @@ class ChangeFamilyMembersPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - + $tree = Validator::attributes($request)->tree(); $xref = $request->getQueryParams()['xref']; $family = Registry::familyFactory()->make($xref, $tree); $family = Auth::checkFamilyAccess($family, true); diff --git a/app/Http/RequestHandlers/CheckTree.php b/app/Http/RequestHandlers/CheckTree.php index ea5fa515f6..8ccb1a7766 100644 --- a/app/Http/RequestHandlers/CheckTree.php +++ b/app/Http/RequestHandlers/CheckTree.php @@ -24,6 +24,7 @@ use Fisharebest\Webtrees\Header; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Query\Expression; use Psr\Http\Message\ResponseInterface; @@ -31,7 +32,6 @@ use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; use function array_key_exists; -use function assert; use function e; use function in_array; use function preg_match; @@ -57,8 +57,7 @@ class CheckTree implements RequestHandlerInterface { $this->layout = 'layouts/administration'; - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); // We need to work with raw GEDCOM data, as we are looking for errors // which may prevent the GedcomRecord objects from working. diff --git a/app/Http/RequestHandlers/CleanDataFolder.php b/app/Http/RequestHandlers/CleanDataFolder.php index 9e09f12e56..058c443313 100644 --- a/app/Http/RequestHandlers/CleanDataFolder.php +++ b/app/Http/RequestHandlers/CleanDataFolder.php @@ -23,6 +23,7 @@ use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\TreeService; +use Fisharebest\Webtrees\Validator; use League\Flysystem\FilesystemException; use League\Flysystem\FilesystemReader; use League\Flysystem\StorageAttributes; @@ -69,8 +70,8 @@ class CleanDataFolder implements RequestHandlerInterface 'config.ini.php', ]; - if ($request->getAttribute('dbtype') === 'sqlite') { - $protected[] = $request->getAttribute('dbname') . '.sqlite'; + if (Validator::attributes($request)->string('dbtype') === 'sqlite') { + $protected[] = Validator::attributes($request)->string('dbname') . '.sqlite'; } // Protect the media folders diff --git a/app/Http/RequestHandlers/ContactAction.php b/app/Http/RequestHandlers/ContactAction.php index 2364751031..0460f4a551 100644 --- a/app/Http/RequestHandlers/ContactAction.php +++ b/app/Http/RequestHandlers/ContactAction.php @@ -30,13 +30,11 @@ use Fisharebest\Webtrees\Services\EmailService; use Fisharebest\Webtrees\Services\MessageService; use Fisharebest\Webtrees\Services\RateLimitService; use Fisharebest\Webtrees\Services\UserService; -use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function e; use function in_array; use function preg_match; @@ -91,17 +89,16 @@ class ContactAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); - $base_url = $request->getAttribute('base_url'); - $body = Validator::parsedBody($request)->string('body') ?? ''; - $from_email = Validator::parsedBody($request)->string('from_email') ?? ''; - $from_name = Validator::parsedBody($request)->string('from_name') ?? ''; - $subject = Validator::parsedBody($request)->string('subject') ?? ''; - $to = Validator::parsedBody($request)->string('to') ?? ''; - $url = Validator::parsedBody($request)->isLocalUrl($base_url)->string('url') ?? $base_url; - $ip = $request->getAttribute('client-ip'); + $base_url = Validator::attributes($request)->string('base_url'); + $body = Validator::parsedBody($request)->optionalString('body') ?? ''; + $from_email = Validator::parsedBody($request)->optionalString('from_email') ?? ''; + $from_name = Validator::parsedBody($request)->optionalString('from_name') ?? ''; + $subject = Validator::parsedBody($request)->optionalString('subject') ?? ''; + $to = Validator::parsedBody($request)->optionalString('to') ?? ''; + $url = Validator::parsedBody($request)->isLocalUrl($base_url)->optionalString('url') ?? $base_url; + $ip = Validator::attributes($request)->string('client-ip'); $to_user = $this->user_service->findByUserName($to); if ($to_user === null) { diff --git a/app/Http/RequestHandlers/ContactPage.php b/app/Http/RequestHandlers/ContactPage.php index db371779c8..44fbbf0c46 100644 --- a/app/Http/RequestHandlers/ContactPage.php +++ b/app/Http/RequestHandlers/ContactPage.php @@ -25,12 +25,11 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\CaptchaService; use Fisharebest\Webtrees\Services\MessageService; use Fisharebest\Webtrees\Services\UserService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function in_array; use function route; @@ -71,9 +70,7 @@ class ContactPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - + $tree = Validator::attributes($request)->tree(); $params = $request->getQueryParams(); $body = $params['body'] ?? ''; $from_email = $params['from_email'] ?? ''; diff --git a/app/Http/RequestHandlers/CopyFact.php b/app/Http/RequestHandlers/CopyFact.php index fbc01219b5..a788cf8383 100644 --- a/app/Http/RequestHandlers/CopyFact.php +++ b/app/Http/RequestHandlers/CopyFact.php @@ -24,13 +24,11 @@ use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\ClipboardService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; -use function is_string; use function response; /** @@ -59,13 +57,9 @@ class CopyFact implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - - $fact_id = $request->getAttribute('fact_id'); + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $fact_id = Validator::attributes($request)->string('fact_id'); $record = Registry::gedcomRecordFactory()->make($xref, $tree); $record = Auth::checkRecordAccess($record, true); diff --git a/app/Http/RequestHandlers/CreateLocationAction.php b/app/Http/RequestHandlers/CreateLocationAction.php index 95c93703eb..06068050df 100644 --- a/app/Http/RequestHandlers/CreateLocationAction.php +++ b/app/Http/RequestHandlers/CreateLocationAction.php @@ -21,13 +21,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; - /** * Process a form to create a new location. */ @@ -40,8 +38,7 @@ class CreateLocationAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $params = (array) $request->getParsedBody(); $name = $params['location_name']; diff --git a/app/Http/RequestHandlers/CreateLocationModal.php b/app/Http/RequestHandlers/CreateLocationModal.php index 8fbf673e43..7afbaddcf5 100644 --- a/app/Http/RequestHandlers/CreateLocationModal.php +++ b/app/Http/RequestHandlers/CreateLocationModal.php @@ -19,12 +19,11 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function response; use function view; @@ -40,8 +39,7 @@ class CreateLocationModal implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); return response(view('modals/create-location', [ 'tree' => $tree, diff --git a/app/Http/RequestHandlers/CreateMediaObjectAction.php b/app/Http/RequestHandlers/CreateMediaObjectAction.php index 3541795d6a..d2f5674ee8 100644 --- a/app/Http/RequestHandlers/CreateMediaObjectAction.php +++ b/app/Http/RequestHandlers/CreateMediaObjectAction.php @@ -24,12 +24,11 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\MediaFileService; use Fisharebest\Webtrees\Services\PendingChangesService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function in_array; use function response; @@ -63,9 +62,7 @@ class CreateMediaObjectAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - + $tree = Validator::attributes($request)->tree(); $params = (array) $request->getParsedBody(); $note = $params['media-note'] ?? ''; $title = $params['title'] ?? ''; diff --git a/app/Http/RequestHandlers/CreateMediaObjectFromFile.php b/app/Http/RequestHandlers/CreateMediaObjectFromFile.php index b6db5cedcc..6b39c0a857 100644 --- a/app/Http/RequestHandlers/CreateMediaObjectFromFile.php +++ b/app/Http/RequestHandlers/CreateMediaObjectFromFile.php @@ -21,13 +21,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Services\MediaFileService; use Fisharebest\Webtrees\Services\PendingChangesService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; - /** * Create a new media object. */ @@ -56,9 +54,7 @@ class CreateMediaObjectFromFile implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - + $tree = Validator::attributes($request)->tree(); $params = (array) $request->getParsedBody(); $file = $params['file'] ?? ''; $type = $params['type'] ?? ''; diff --git a/app/Http/RequestHandlers/CreateMediaObjectModal.php b/app/Http/RequestHandlers/CreateMediaObjectModal.php index abfe4d29f9..d4214ee873 100644 --- a/app/Http/RequestHandlers/CreateMediaObjectModal.php +++ b/app/Http/RequestHandlers/CreateMediaObjectModal.php @@ -21,13 +21,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\MediaFileService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; - /** * Show a form to create a new media object. */ @@ -52,9 +50,7 @@ class CreateMediaObjectModal implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - + $tree = Validator::attributes($request)->tree(); $max_upload_size = $this->media_file_service->maxUploadFilesize(); $media_types = Registry::elementFactory()->make('OBJE:FILE:FORM:TYPE')->values(); $data_filesystem = Registry::filesystem()->data(); diff --git a/app/Http/RequestHandlers/CreateNoteAction.php b/app/Http/RequestHandlers/CreateNoteAction.php index 6bba935ff8..e40cbd2436 100644 --- a/app/Http/RequestHandlers/CreateNoteAction.php +++ b/app/Http/RequestHandlers/CreateNoteAction.php @@ -21,13 +21,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; - /** * Process a form to create a new note object. */ @@ -40,9 +38,7 @@ class CreateNoteAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - + $tree = Validator::attributes($request)->tree(); $params = (array) $request->getParsedBody(); $note = $params['note']; $restriction = $params['restriction']; diff --git a/app/Http/RequestHandlers/CreateNoteModal.php b/app/Http/RequestHandlers/CreateNoteModal.php index e37b27bbaa..0da3977a4b 100644 --- a/app/Http/RequestHandlers/CreateNoteModal.php +++ b/app/Http/RequestHandlers/CreateNoteModal.php @@ -19,12 +19,11 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function response; use function view; @@ -42,8 +41,7 @@ class CreateNoteModal implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); return response(view('modals/create-note-object', [ 'tree' => $tree, diff --git a/app/Http/RequestHandlers/CreateRepositoryAction.php b/app/Http/RequestHandlers/CreateRepositoryAction.php index 899d77525a..4b1e57af45 100644 --- a/app/Http/RequestHandlers/CreateRepositoryAction.php +++ b/app/Http/RequestHandlers/CreateRepositoryAction.php @@ -21,12 +21,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function in_array; use function preg_replace; use function response; @@ -45,13 +44,11 @@ class CreateRepositoryAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $params = (array) $request->getParsedBody(); - $name = $params['name']; - $address = $params['address']; - $url = $params['url']; + $tree = Validator::attributes($request)->tree(); + $params = (array) $request->getParsedBody(); + $name = $params['name']; + $address = $params['address']; + $url = $params['url']; $restriction = $params['restriction']; // Fix non-printing characters diff --git a/app/Http/RequestHandlers/CreateRepositoryModal.php b/app/Http/RequestHandlers/CreateRepositoryModal.php index 07add2baf3..d283a1b9bd 100644 --- a/app/Http/RequestHandlers/CreateRepositoryModal.php +++ b/app/Http/RequestHandlers/CreateRepositoryModal.php @@ -23,12 +23,11 @@ use Fisharebest\Webtrees\Elements\AddressLine; use Fisharebest\Webtrees\Elements\AddressWebPage; use Fisharebest\Webtrees\Elements\NameOfRepository; use Fisharebest\Webtrees\I18N; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function response; use function view; @@ -44,8 +43,7 @@ class CreateRepositoryModal implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $elements = [ 'name' => new NameOfRepository(I18N::translateContext('Repository', 'Name')), diff --git a/app/Http/RequestHandlers/CreateSourceAction.php b/app/Http/RequestHandlers/CreateSourceAction.php index c4ff922fc0..d5c6065986 100644 --- a/app/Http/RequestHandlers/CreateSourceAction.php +++ b/app/Http/RequestHandlers/CreateSourceAction.php @@ -21,13 +21,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; - /** * Process a form to create a new source. */ @@ -40,8 +38,7 @@ class CreateSourceAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $params = (array) $request->getParsedBody(); $title = $params['source-title']; diff --git a/app/Http/RequestHandlers/CreateSourceModal.php b/app/Http/RequestHandlers/CreateSourceModal.php index 7a316e65be..3d6a90b9e5 100644 --- a/app/Http/RequestHandlers/CreateSourceModal.php +++ b/app/Http/RequestHandlers/CreateSourceModal.php @@ -19,12 +19,11 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function response; use function view; @@ -40,8 +39,7 @@ class CreateSourceModal implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); return response(view('modals/create-source', [ 'tree' => $tree, diff --git a/app/Http/RequestHandlers/CreateSubmissionAction.php b/app/Http/RequestHandlers/CreateSubmissionAction.php index a9d538221b..c7753ed7d5 100644 --- a/app/Http/RequestHandlers/CreateSubmissionAction.php +++ b/app/Http/RequestHandlers/CreateSubmissionAction.php @@ -21,13 +21,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; - /** * Process a form to create a new submission. */ @@ -40,9 +38,7 @@ class CreateSubmissionAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - + $tree = Validator::attributes($request)->tree(); $params = (array) $request->getParsedBody(); $submitter = $params['submitter']; diff --git a/app/Http/RequestHandlers/CreateSubmissionModal.php b/app/Http/RequestHandlers/CreateSubmissionModal.php index 65bb713514..8d1bfebc85 100644 --- a/app/Http/RequestHandlers/CreateSubmissionModal.php +++ b/app/Http/RequestHandlers/CreateSubmissionModal.php @@ -19,13 +19,11 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; - /** * Show a form to create a new submission. */ @@ -38,8 +36,7 @@ class CreateSubmissionModal implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); return response(view('modals/create-submission', [ 'tree' => $tree, diff --git a/app/Http/RequestHandlers/CreateSubmitterAction.php b/app/Http/RequestHandlers/CreateSubmitterAction.php index 89958b4e14..2615236ba8 100644 --- a/app/Http/RequestHandlers/CreateSubmitterAction.php +++ b/app/Http/RequestHandlers/CreateSubmitterAction.php @@ -21,13 +21,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; - /** * Process a form to create a new submitter. */ @@ -40,9 +38,7 @@ class CreateSubmitterAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - + $tree = Validator::attributes($request)->tree(); $params = (array) $request->getParsedBody(); $name = $params['submitter_name']; $address = $params['submitter_address']; diff --git a/app/Http/RequestHandlers/CreateSubmitterModal.php b/app/Http/RequestHandlers/CreateSubmitterModal.php index 0b7a13daeb..1c32d35165 100644 --- a/app/Http/RequestHandlers/CreateSubmitterModal.php +++ b/app/Http/RequestHandlers/CreateSubmitterModal.php @@ -19,13 +19,11 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; - /** * Show a form to create a new submitter. */ @@ -38,8 +36,7 @@ class CreateSubmitterModal implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); return response(view('modals/create-submitter', [ 'tree' => $tree, diff --git a/app/Http/RequestHandlers/DataFixChoose.php b/app/Http/RequestHandlers/DataFixChoose.php index ef7e84f283..4c3b93a40d 100644 --- a/app/Http/RequestHandlers/DataFixChoose.php +++ b/app/Http/RequestHandlers/DataFixChoose.php @@ -23,12 +23,11 @@ use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Module\ModuleDataFixInterface; use Fisharebest\Webtrees\Services\ModuleService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function e; /** @@ -57,8 +56,7 @@ class DataFixChoose implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $data_fixes = $this->module_service->findByInterface(ModuleDataFixInterface::class, false, true); diff --git a/app/Http/RequestHandlers/DataFixData.php b/app/Http/RequestHandlers/DataFixData.php index d9c0afcbdb..04b68a5686 100644 --- a/app/Http/RequestHandlers/DataFixData.php +++ b/app/Http/RequestHandlers/DataFixData.php @@ -25,7 +25,7 @@ use Fisharebest\Webtrees\Module\ModuleDataFixInterface; use Fisharebest\Webtrees\Services\DataFixService; use Fisharebest\Webtrees\Services\DatatablesService; use Fisharebest\Webtrees\Services\ModuleService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -70,10 +70,8 @@ class DataFixData implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $data_fix = $request->getAttribute('data_fix') ?? ''; + $tree = Validator::attributes($request)->tree(); + $data_fix = Validator::attributes($request)->string('data_fix', ''); $module = $this->module_service->findByName($data_fix); assert($module instanceof ModuleDataFixInterface); diff --git a/app/Http/RequestHandlers/DataFixPage.php b/app/Http/RequestHandlers/DataFixPage.php index c79c7750a4..a91cbc6447 100644 --- a/app/Http/RequestHandlers/DataFixPage.php +++ b/app/Http/RequestHandlers/DataFixPage.php @@ -23,12 +23,11 @@ use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Module\ModuleDataFixInterface; use Fisharebest\Webtrees\Services\ModuleService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function e; use function redirect; use function route; @@ -59,8 +58,7 @@ class DataFixPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $data_fixes = $this->module_service->findByInterface(ModuleDataFixInterface::class, false, true); @@ -68,7 +66,7 @@ class DataFixPage implements RequestHandlerInterface return redirect(route('control-panel')); } - $data_fix = $request->getAttribute('data_fix') ?? ''; + $data_fix = Validator::attributes($request)->string('data_fix', ''); $module = $this->module_service->findByName($data_fix); $this->layout = 'layouts/administration'; diff --git a/app/Http/RequestHandlers/DataFixPreview.php b/app/Http/RequestHandlers/DataFixPreview.php index 5bcd235c1b..8fb919a4be 100644 --- a/app/Http/RequestHandlers/DataFixPreview.php +++ b/app/Http/RequestHandlers/DataFixPreview.php @@ -25,7 +25,7 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Module\ModuleDataFixInterface; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\ModuleService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -58,10 +58,8 @@ class DataFixPreview implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $data_fix = $request->getAttribute('data_fix', ''); + $tree = Validator::attributes($request)->tree(); + $data_fix = Validator::attributes($request)->string('data_fix', ''); $module = $this->module_service->findByName($data_fix); assert($module instanceof ModuleDataFixInterface); diff --git a/app/Http/RequestHandlers/DataFixSelect.php b/app/Http/RequestHandlers/DataFixSelect.php index 89f75f8dc4..62052e9417 100644 --- a/app/Http/RequestHandlers/DataFixSelect.php +++ b/app/Http/RequestHandlers/DataFixSelect.php @@ -21,12 +21,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Module\ModuleDataFixInterface; use Fisharebest\Webtrees\Services\ModuleService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function redirect; use function route; @@ -54,9 +53,7 @@ class DataFixSelect implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - + $tree = Validator::attributes($request)->tree(); $data_fixes = $this->module_service->findByInterface(ModuleDataFixInterface::class); $data_fix = $request->getParsedBody()['data_fix'] ?? ''; diff --git a/app/Http/RequestHandlers/DataFixUpdate.php b/app/Http/RequestHandlers/DataFixUpdate.php index 131e7ed84b..ef1ff857c8 100644 --- a/app/Http/RequestHandlers/DataFixUpdate.php +++ b/app/Http/RequestHandlers/DataFixUpdate.php @@ -23,7 +23,7 @@ use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Module\ModuleDataFixInterface; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\ModuleService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -55,10 +55,8 @@ class DataFixUpdate implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $data_fix = $request->getAttribute('data_fix', ''); + $tree = Validator::attributes($request)->tree(); + $data_fix = Validator::attributes($request)->string('data_fix', ''); $module = $this->module_service->findByName($data_fix); assert($module instanceof ModuleDataFixInterface); diff --git a/app/Http/RequestHandlers/DataFixUpdateAll.php b/app/Http/RequestHandlers/DataFixUpdateAll.php index 165ce2f8cd..ac865d1a50 100644 --- a/app/Http/RequestHandlers/DataFixUpdateAll.php +++ b/app/Http/RequestHandlers/DataFixUpdateAll.php @@ -25,6 +25,7 @@ use Fisharebest\Webtrees\Module\ModuleDataFixInterface; use Fisharebest\Webtrees\Services\DataFixService; use Fisharebest\Webtrees\Services\ModuleService; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Support\Collection; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -69,10 +70,8 @@ class DataFixUpdateAll implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $data_fix = $request->getAttribute('data_fix', ''); + $tree = Validator::attributes($request)->tree(); + $data_fix = Validator::attributes($request)->string('data_fix', ''); $module = $this->module_service->findByName($data_fix); assert($module instanceof ModuleDataFixInterface); diff --git a/app/Http/RequestHandlers/DeleteFact.php b/app/Http/RequestHandlers/DeleteFact.php index 8c76ed96fe..f0708f1e5c 100644 --- a/app/Http/RequestHandlers/DeleteFact.php +++ b/app/Http/RequestHandlers/DeleteFact.php @@ -21,13 +21,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; -use function is_string; use function response; /** @@ -44,13 +42,9 @@ class DeleteFact implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - - $fact_id = $request->getAttribute('fact_id'); + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $fact_id = Validator::attributes($request)->string('fact_id'); $record = Registry::gedcomRecordFactory()->make($xref, $tree); $record = Auth::checkRecordAccess($record, true); diff --git a/app/Http/RequestHandlers/DeleteRecord.php b/app/Http/RequestHandlers/DeleteRecord.php index 10c57d1831..1eda700238 100644 --- a/app/Http/RequestHandlers/DeleteRecord.php +++ b/app/Http/RequestHandlers/DeleteRecord.php @@ -26,14 +26,12 @@ use Fisharebest\Webtrees\Gedcom; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function e; -use function is_string; use function preg_match_all; use function preg_replace; use function response; @@ -53,12 +51,8 @@ class DeleteRecord implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); $record = Registry::gedcomRecordFactory()->make($xref, $tree); $record = Auth::checkRecordAccess($record, true); diff --git a/app/Http/RequestHandlers/DeleteTreeAction.php b/app/Http/RequestHandlers/DeleteTreeAction.php index 596c1d898d..036c1dcfbe 100644 --- a/app/Http/RequestHandlers/DeleteTreeAction.php +++ b/app/Http/RequestHandlers/DeleteTreeAction.php @@ -22,12 +22,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\TreeService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function e; use function response; @@ -55,8 +54,7 @@ class DeleteTreeAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $this->tree_service->delete($tree); diff --git a/app/Http/RequestHandlers/EditFactAction.php b/app/Http/RequestHandlers/EditFactAction.php index 6259322f35..d4df74d8b2 100644 --- a/app/Http/RequestHandlers/EditFactAction.php +++ b/app/Http/RequestHandlers/EditFactAction.php @@ -25,7 +25,6 @@ use Fisharebest\Webtrees\Module\CensusAssistantModule; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\GedcomEditService; use Fisharebest\Webtrees\Services\ModuleService; -use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -63,14 +62,9 @@ class EditFactAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - - $fact_id = $request->getAttribute('fact_id') ?? ''; - assert(is_string($fact_id)); + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $fact_id = Validator::attributes($request)->string('fact_id'); $record = Registry::gedcomRecordFactory()->make($xref, $tree); $record = Auth::checkRecordAccess($record, true); @@ -118,8 +112,8 @@ class EditFactAction implements RequestHandlerInterface } } - $base_url = $request->getAttribute('base_url'); - $url = Validator::parsedBody($request)->isLocalUrl($base_url)->string('url') ?? $record->url(); + $base_url = Validator::attributes($request)->string('base_url'); + $url = Validator::parsedBody($request)->isLocalUrl($base_url)->optionalString('url') ?? $record->url(); return redirect($url); } diff --git a/app/Http/RequestHandlers/EditFactPage.php b/app/Http/RequestHandlers/EditFactPage.php index c2eb556167..819ec24cef 100644 --- a/app/Http/RequestHandlers/EditFactPage.php +++ b/app/Http/RequestHandlers/EditFactPage.php @@ -24,7 +24,7 @@ use Fisharebest\Webtrees\Fact; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\GedcomEditService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -59,15 +59,9 @@ class EditFactPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - - $fact_id = $request->getAttribute('fact_id'); - assert(is_string($fact_id)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $fact_id = Validator::attributes($request)->string('fact_id'); $include_hidden = (bool) ($request->getQueryParams()['include_hidden'] ?? false); $record = Registry::gedcomRecordFactory()->make($xref, $tree); diff --git a/app/Http/RequestHandlers/EditMediaFileAction.php b/app/Http/RequestHandlers/EditMediaFileAction.php index 32928c9ff2..b507e4542e 100644 --- a/app/Http/RequestHandlers/EditMediaFileAction.php +++ b/app/Http/RequestHandlers/EditMediaFileAction.php @@ -27,7 +27,7 @@ use Fisharebest\Webtrees\MediaFile; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\MediaFileService; use Fisharebest\Webtrees\Services\PendingChangesService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use League\Flysystem\FilesystemException; use League\Flysystem\UnableToMoveFile; use League\Flysystem\UnableToRetrieveMetadata; @@ -73,15 +73,9 @@ class EditMediaFileAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - - $fact_id = $request->getAttribute('fact_id'); - assert(is_string($fact_id)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $fact_id = Validator::attributes($request)->string('fact_id'); $data_filesystem = Registry::filesystem()->data(); $params = (array) $request->getParsedBody(); diff --git a/app/Http/RequestHandlers/EditMediaFileModal.php b/app/Http/RequestHandlers/EditMediaFileModal.php index 91e5dba7db..f7d1dfad6d 100644 --- a/app/Http/RequestHandlers/EditMediaFileModal.php +++ b/app/Http/RequestHandlers/EditMediaFileModal.php @@ -26,7 +26,7 @@ use Fisharebest\Webtrees\Http\Exceptions\HttpNotFoundException; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\MediaFileService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -62,15 +62,9 @@ class EditMediaFileModal implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - - $fact_id = $request->getAttribute('fact_id'); - assert(is_string($fact_id)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $fact_id = Validator::attributes($request)->string('fact_id'); $data_filesystem = Registry::filesystem()->data(); $media = Registry::mediaFactory()->make($xref, $tree); diff --git a/app/Http/RequestHandlers/EditNoteAction.php b/app/Http/RequestHandlers/EditNoteAction.php index 227807be17..db0e08f4e0 100644 --- a/app/Http/RequestHandlers/EditNoteAction.php +++ b/app/Http/RequestHandlers/EditNoteAction.php @@ -21,13 +21,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; - /** * Edit note objects. */ @@ -42,14 +40,10 @@ class EditNoteAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - - $note = Registry::noteFactory()->make($xref, $tree); - $note = Auth::checkNoteAccess($note, true); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $note = Registry::noteFactory()->make($xref, $tree); + $note = Auth::checkNoteAccess($note, true); $params = (array) $request->getParsedBody(); $NOTE = $params['NOTE']; diff --git a/app/Http/RequestHandlers/EditNotePage.php b/app/Http/RequestHandlers/EditNotePage.php index 9e8b0fad41..4bd3b8570f 100644 --- a/app/Http/RequestHandlers/EditNotePage.php +++ b/app/Http/RequestHandlers/EditNotePage.php @@ -23,13 +23,11 @@ use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; - /** * Edit note objects. */ @@ -46,11 +44,8 @@ class EditNotePage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); $note = Registry::noteFactory()->make($xref, $tree); $note = Auth::checkNoteAccess($note, true); diff --git a/app/Http/RequestHandlers/EditRawFactAction.php b/app/Http/RequestHandlers/EditRawFactAction.php index 67c8bd7352..b5f347b3ff 100644 --- a/app/Http/RequestHandlers/EditRawFactAction.php +++ b/app/Http/RequestHandlers/EditRawFactAction.php @@ -21,14 +21,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; -use function is_string; use function preg_replace; use function redirect; use function trim; @@ -45,21 +42,13 @@ class EditRawFactAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - - $record = Registry::gedcomRecordFactory()->make($xref, $tree); - $record = Auth::checkRecordAccess($record, true); - - $fact_id = $request->getAttribute('fact_id'); - assert(is_string($fact_id)); - - $params = (array) $request->getParsedBody(); - - $gedcom = $params['gedcom']; + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $record = Registry::gedcomRecordFactory()->make($xref, $tree); + $record = Auth::checkRecordAccess($record, true); + $fact_id = Validator::attributes($request)->string('fact_id'); + $params = (array) $request->getParsedBody(); + $gedcom = $params['gedcom']; // Cleanup the client’s bad editing? $gedcom = preg_replace('/[\r\n]+/', "\n", $gedcom); // Empty lines @@ -73,8 +62,8 @@ class EditRawFactAction implements RequestHandlerInterface } } - $base_url = $request->getAttribute('base_url'); - $url = Validator::parsedBody($request)->isLocalUrl($base_url)->string('url') ?? $record->url(); + $base_url = Validator::attributes($request)->string('base_url'); + $url = Validator::parsedBody($request)->isLocalUrl($base_url)->optionalString('url') ?? $record->url(); return redirect($url); } diff --git a/app/Http/RequestHandlers/EditRawFactPage.php b/app/Http/RequestHandlers/EditRawFactPage.php index 14258be92d..67aed2d3a0 100644 --- a/app/Http/RequestHandlers/EditRawFactPage.php +++ b/app/Http/RequestHandlers/EditRawFactPage.php @@ -24,13 +24,11 @@ use Fisharebest\Webtrees\Fact; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; -use function is_string; use function redirect; /** @@ -47,18 +45,12 @@ class EditRawFactPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - - $record = Registry::gedcomRecordFactory()->make($xref, $tree); - $record = Auth::checkRecordAccess($record, true); - - $fact_id = $request->getAttribute('fact_id'); - - $title = I18N::translate('Edit the raw GEDCOM') . ' - ' . $record->fullName(); + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $record = Registry::gedcomRecordFactory()->make($xref, $tree); + $record = Auth::checkRecordAccess($record, true); + $fact_id = Validator::attributes($request)->string('fact_id'); + $title = I18N::translate('Edit the raw GEDCOM') . ' - ' . $record->fullName(); $fact = $record->facts([], false, null, true) ->first(static function (Fact $fact) use ($fact_id): bool { diff --git a/app/Http/RequestHandlers/EditRawRecordAction.php b/app/Http/RequestHandlers/EditRawRecordAction.php index f57f095a90..5c67ca5797 100644 --- a/app/Http/RequestHandlers/EditRawRecordAction.php +++ b/app/Http/RequestHandlers/EditRawRecordAction.php @@ -23,7 +23,7 @@ use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\GedcomRecord; use Fisharebest\Webtrees\Header; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -44,15 +44,10 @@ class EditRawRecordAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); $record = Registry::gedcomRecordFactory()->make($xref, $tree); $record = Auth::checkRecordAccess($record, true); - $params = (array) $request->getParsedBody(); $level0 = $params['level0']; diff --git a/app/Http/RequestHandlers/EditRawRecordPage.php b/app/Http/RequestHandlers/EditRawRecordPage.php index 21deda1954..dbf4368b45 100644 --- a/app/Http/RequestHandlers/EditRawRecordPage.php +++ b/app/Http/RequestHandlers/EditRawRecordPage.php @@ -23,7 +23,7 @@ use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -46,12 +46,8 @@ class EditRawRecordPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); $record = Registry::gedcomRecordFactory()->make($xref, $tree); $record = Auth::checkRecordAccess($record, true); diff --git a/app/Http/RequestHandlers/EditRecordAction.php b/app/Http/RequestHandlers/EditRecordAction.php index 40fabcf911..275293a8a0 100644 --- a/app/Http/RequestHandlers/EditRecordAction.php +++ b/app/Http/RequestHandlers/EditRecordAction.php @@ -23,13 +23,11 @@ use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Header; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\GedcomEditService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; -use function is_string; use function redirect; /** @@ -56,15 +54,10 @@ class EditRecordAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - - $record = Registry::gedcomRecordFactory()->make($xref, $tree); - $record = Auth::checkRecordAccess($record, true); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $record = Registry::gedcomRecordFactory()->make($xref, $tree); + $record = Auth::checkRecordAccess($record, true); $params = (array) $request->getParsedBody(); $keep_chan = (bool) ($params['keep_chan'] ?? false); $levels = $params['levels']; diff --git a/app/Http/RequestHandlers/EditRecordPage.php b/app/Http/RequestHandlers/EditRecordPage.php index f12f424bb7..9e8ad920a1 100644 --- a/app/Http/RequestHandlers/EditRecordPage.php +++ b/app/Http/RequestHandlers/EditRecordPage.php @@ -23,13 +23,11 @@ use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\GedcomEditService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; -use function is_string; use function route; /** @@ -58,12 +56,8 @@ class EditRecordPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); $record = Registry::gedcomRecordFactory()->make($xref, $tree); $record = Auth::checkRecordAccess($record, true); diff --git a/app/Http/RequestHandlers/EmailPreferencesAction.php b/app/Http/RequestHandlers/EmailPreferencesAction.php index 2c09fc7278..ced2316aa8 100644 --- a/app/Http/RequestHandlers/EmailPreferencesAction.php +++ b/app/Http/RequestHandlers/EmailPreferencesAction.php @@ -24,7 +24,7 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\EmailService; use Fisharebest\Webtrees\Site; use Fisharebest\Webtrees\SiteUser; -use Fisharebest\Webtrees\User; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -57,9 +57,7 @@ class EmailPreferencesAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $user = $request->getAttribute('user'); - assert($user instanceof User); - + $user = Validator::attributes($request)->user(); $params = (array) $request->getParsedBody(); Site::setPreference('SMTP_ACTIVE', $params['SMTP_ACTIVE']); diff --git a/app/Http/RequestHandlers/EmptyClipboard.php b/app/Http/RequestHandlers/EmptyClipboard.php index a49681cd15..78ec1ea2f6 100644 --- a/app/Http/RequestHandlers/EmptyClipboard.php +++ b/app/Http/RequestHandlers/EmptyClipboard.php @@ -55,9 +55,9 @@ class EmptyClipboard implements RequestHandlerInterface { $this->clipboard_service->emptyClipboard(); - $base_url = $request->getAttribute('base_url'); + $base_url = Validator::attributes($request)->string('base_url'); $default_url = $request->getHeaderLine('Referer'); - $url = Validator::parsedBody($request)->isLocalUrl($base_url)->string('url') ?? $default_url; + $url = Validator::parsedBody($request)->isLocalUrl($base_url)->optionalString('url') ?? $default_url; return redirect($url); } diff --git a/app/Http/RequestHandlers/ExportGedcomClient.php b/app/Http/RequestHandlers/ExportGedcomClient.php index 9d42cbcd37..c284cd8517 100644 --- a/app/Http/RequestHandlers/ExportGedcomClient.php +++ b/app/Http/RequestHandlers/ExportGedcomClient.php @@ -29,7 +29,6 @@ use Fisharebest\Webtrees\GedcomRecord; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\GedcomExportService; -use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use League\Flysystem\Filesystem; @@ -43,7 +42,6 @@ use Psr\Http\Message\StreamFactoryInterface; use Psr\Http\Server\RequestHandlerInterface; use function addcslashes; -use function assert; use function fclose; use function pathinfo; use function strtolower; @@ -89,16 +87,15 @@ class ExportGedcomClient implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $data_filesystem = Registry::filesystem()->data(); - $format = Validator::parsedBody($request)->isInArray(['gedcom', 'zip'])->requiredString('format'); - $privacy = Validator::parsedBody($request)->isInArray(['none', 'gedadmin', 'user', 'visitor'])->requiredString('privacy'); - $encoding = Validator::parsedBody($request)->isInArray([UTF8::NAME, UTF16BE::NAME, ANSEL::NAME, ASCII::NAME, Windows1252::NAME])->requiredString('encoding'); - $line_endings = Validator::parsedBody($request)->isInArray(['CRLF', 'LF'])->requiredString('line_endings'); - $media_path = Validator::parsedBody($request)->string('media_path') ?? ''; + $format = Validator::parsedBody($request)->isInArray(['gedcom', 'zip'])->string('format'); + $privacy = Validator::parsedBody($request)->isInArray(['none', 'gedadmin', 'user', 'visitor'])->string('privacy'); + $encoding = Validator::parsedBody($request)->isInArray([UTF8::NAME, UTF16BE::NAME, ANSEL::NAME, ASCII::NAME, Windows1252::NAME])->string('encoding'); + $line_endings = Validator::parsedBody($request)->isInArray(['CRLF', 'LF'])->string('line_endings'); + $media_path = Validator::parsedBody($request)->optionalString('media_path') ?? ''; $access_levels = [ 'gedadmin' => Auth::PRIV_NONE, diff --git a/app/Http/RequestHandlers/ExportGedcomPage.php b/app/Http/RequestHandlers/ExportGedcomPage.php index d97c1bd56e..d6c222f6e3 100644 --- a/app/Http/RequestHandlers/ExportGedcomPage.php +++ b/app/Http/RequestHandlers/ExportGedcomPage.php @@ -21,12 +21,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function e; use function pathinfo; use function strtolower; @@ -47,9 +46,7 @@ class ExportGedcomPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - + $tree = Validator::attributes($request)->tree(); $title = I18N::translate('Export a GEDCOM file') . ' — ' . e($tree->title()); $this->layout = 'layouts/administration'; diff --git a/app/Http/RequestHandlers/ExportGedcomServer.php b/app/Http/RequestHandlers/ExportGedcomServer.php index 55a3fa4f4d..b4d6e43b79 100644 --- a/app/Http/RequestHandlers/ExportGedcomServer.php +++ b/app/Http/RequestHandlers/ExportGedcomServer.php @@ -25,14 +25,13 @@ use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\GedcomExportService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use League\Flysystem\FilesystemException; use League\Flysystem\UnableToWriteFile; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function fclose; use function pathinfo; use function redirect; @@ -67,8 +66,7 @@ class ExportGedcomServer implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $data_filesystem = Registry::filesystem()->data(); diff --git a/app/Http/RequestHandlers/FamilyPage.php b/app/Http/RequestHandlers/FamilyPage.php index 7d9fd0a6d1..e48d9b9689 100644 --- a/app/Http/RequestHandlers/FamilyPage.php +++ b/app/Http/RequestHandlers/FamilyPage.php @@ -28,18 +28,16 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\ClipboardService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; use function array_map; -use function assert; use function e; use function explode; use function implode; use function in_array; -use function is_string; use function redirect; use function strip_tags; use function trim; @@ -70,19 +68,14 @@ class FamilyPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $slug = Validator::attributes($request)->string('slug', ''); $family = Registry::familyFactory()->make($xref, $tree); $family = Auth::checkFamilyAccess($family, false); // Redirect to correct xref/slug - $slug = Registry::slugFactory()->make($family); - - if ($family->xref() !== $xref || $request->getAttribute('slug') !== $slug) { + if ($family->xref() !== $xref || Registry::slugFactory()->make($family) !== $slug) { return redirect($family->url(), StatusCodeInterface::STATUS_MOVED_PERMANENTLY); } diff --git a/app/Http/RequestHandlers/FindDuplicateRecords.php b/app/Http/RequestHandlers/FindDuplicateRecords.php index 0abd9a6adf..53d8225417 100644 --- a/app/Http/RequestHandlers/FindDuplicateRecords.php +++ b/app/Http/RequestHandlers/FindDuplicateRecords.php @@ -22,12 +22,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\AdminService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function e; /** @@ -56,8 +55,7 @@ class FindDuplicateRecords implements RequestHandlerInterface { $this->layout = 'layouts/administration'; - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $duplicates = $this->admin_service->duplicateRecords($tree); $title = I18N::translate('Find duplicates') . ' — ' . e($tree->title()); diff --git a/app/Http/RequestHandlers/GedcomLoad.php b/app/Http/RequestHandlers/GedcomLoad.php index 1c8bbb279d..2c99ac9566 100644 --- a/app/Http/RequestHandlers/GedcomLoad.php +++ b/app/Http/RequestHandlers/GedcomLoad.php @@ -27,14 +27,13 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\GedcomImportService; use Fisharebest\Webtrees\Services\TimeoutService; use Fisharebest\Webtrees\Services\TreeService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\DetectsConcurrencyErrors; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function preg_split; use function response; use function str_replace; @@ -83,8 +82,7 @@ class GedcomLoad implements RequestHandlerInterface { $this->layout = 'layouts/ajax'; - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); try { // What is the current import status? diff --git a/app/Http/RequestHandlers/GedcomRecordPage.php b/app/Http/RequestHandlers/GedcomRecordPage.php index 22d052eb61..ec3a98754e 100644 --- a/app/Http/RequestHandlers/GedcomRecordPage.php +++ b/app/Http/RequestHandlers/GedcomRecordPage.php @@ -32,14 +32,12 @@ use Fisharebest\Webtrees\Repository; use Fisharebest\Webtrees\Source; use Fisharebest\Webtrees\Submission; use Fisharebest\Webtrees\Submitter; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Support\Collection; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; -use function is_string; use function redirect; /** @@ -72,12 +70,8 @@ class GedcomRecordPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); $record = Registry::gedcomRecordFactory()->make($xref, $tree); $record = Auth::checkRecordAccess($record); diff --git a/app/Http/RequestHandlers/HeaderPage.php b/app/Http/RequestHandlers/HeaderPage.php index 59a6bca12d..ae32286eab 100644 --- a/app/Http/RequestHandlers/HeaderPage.php +++ b/app/Http/RequestHandlers/HeaderPage.php @@ -23,7 +23,7 @@ use Fig\Http\Message\StatusCodeInterface; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Support\Collection; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -47,19 +47,14 @@ class HeaderPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $slug = Validator::attributes($request)->string('slug', ''); $header = Registry::headerFactory()->make($xref, $tree); $header = Auth::checkHeaderAccess($header, false); // Redirect to correct xref/slug - $slug = Registry::slugFactory()->make($header); - - if ($header->xref() !== $xref || $request->getAttribute('slug') !== $slug) { + if ($header->xref() !== $xref || Registry::slugFactory()->make($header) !== $slug) { return redirect($header->url(), StatusCodeInterface::STATUS_MOVED_PERMANENTLY); } diff --git a/app/Http/RequestHandlers/HomePage.php b/app/Http/RequestHandlers/HomePage.php index 1dafe20b91..d5b2e8e909 100644 --- a/app/Http/RequestHandlers/HomePage.php +++ b/app/Http/RequestHandlers/HomePage.php @@ -25,6 +25,7 @@ use Fisharebest\Webtrees\Services\TreeService; use Fisharebest\Webtrees\Site; use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\User; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -60,7 +61,7 @@ class HomePage implements RequestHandlerInterface { $default = Site::getPreference('DEFAULT_GEDCOM'); $tree = $this->tree_service->all()->get($default) ?? $this->tree_service->all()->first(); - $user = $request->getAttribute('user'); + $user = Validator::attributes($request)->user(); if ($tree instanceof Tree) { if ($tree->getPreference('imported') === '1') { diff --git a/app/Http/RequestHandlers/ImportGedcomAction.php b/app/Http/RequestHandlers/ImportGedcomAction.php index 343888d290..fa91c5ca27 100644 --- a/app/Http/RequestHandlers/ImportGedcomAction.php +++ b/app/Http/RequestHandlers/ImportGedcomAction.php @@ -24,7 +24,7 @@ use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\TreeService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use League\Flysystem\FilesystemException; use League\Flysystem\UnableToReadFile; use Psr\Http\Message\ResponseInterface; @@ -32,7 +32,6 @@ use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\StreamFactoryInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function basename; use function redirect; use function route; @@ -63,8 +62,7 @@ class ImportGedcomAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $data_filesystem = Registry::filesystem()->data(); diff --git a/app/Http/RequestHandlers/ImportGedcomPage.php b/app/Http/RequestHandlers/ImportGedcomPage.php index c411700aaf..8409f2a8b5 100644 --- a/app/Http/RequestHandlers/ImportGedcomPage.php +++ b/app/Http/RequestHandlers/ImportGedcomPage.php @@ -23,12 +23,11 @@ use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\AdminService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function e; /** @@ -57,8 +56,7 @@ class ImportGedcomPage implements RequestHandlerInterface { $this->layout = 'layouts/administration'; - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $data_filesystem = Registry::filesystem()->data(); $data_folder = Registry::filesystem()->dataName(); diff --git a/app/Http/RequestHandlers/IndividualPage.php b/app/Http/RequestHandlers/IndividualPage.php index 86a236fd8c..37147bd440 100644 --- a/app/Http/RequestHandlers/IndividualPage.php +++ b/app/Http/RequestHandlers/IndividualPage.php @@ -35,7 +35,7 @@ use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\ClipboardService; use Fisharebest\Webtrees\Services\ModuleService; use Fisharebest\Webtrees\Services\UserService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Support\Collection; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -90,19 +90,14 @@ class IndividualPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $slug = Validator::attributes($request)->string('slug', ''); $individual = Registry::individualFactory()->make($xref, $tree); $individual = Auth::checkIndividualAccess($individual); // Redirect to correct xref/slug - $slug = Registry::slugFactory()->make($individual); - - if ($individual->xref() !== $xref || $request->getAttribute('slug') !== $slug) { + if ($individual->xref() !== $xref || Registry::slugFactory()->make($individual) !== $slug) { return redirect($individual->url(), StatusCodeInterface::STATUS_MOVED_PERMANENTLY); } diff --git a/app/Http/RequestHandlers/LinkChildToFamilyAction.php b/app/Http/RequestHandlers/LinkChildToFamilyAction.php index e60e39bccf..5dfcb94774 100644 --- a/app/Http/RequestHandlers/LinkChildToFamilyAction.php +++ b/app/Http/RequestHandlers/LinkChildToFamilyAction.php @@ -21,7 +21,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -42,12 +42,8 @@ class LinkChildToFamilyAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); $individual = Registry::individualFactory()->make($xref, $tree); $individual = Auth::checkIndividualAccess($individual, true); diff --git a/app/Http/RequestHandlers/LinkChildToFamilyPage.php b/app/Http/RequestHandlers/LinkChildToFamilyPage.php index e76e0767f4..fd23c43c09 100644 --- a/app/Http/RequestHandlers/LinkChildToFamilyPage.php +++ b/app/Http/RequestHandlers/LinkChildToFamilyPage.php @@ -23,14 +23,11 @@ use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; -use function is_string; - /** * Link an existing individual as child in an existing family. */ @@ -45,16 +42,11 @@ class LinkChildToFamilyPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); $individual = Registry::individualFactory()->make($xref, $tree); $individual = Auth::checkIndividualAccess($individual, true); - - $title = I18N::translate('Link this individual to an existing family as a child'); + $title = I18N::translate('Link this individual to an existing family as a child'); return $this->viewResponse('edit/link-child-to-family', [ 'individual' => $individual, diff --git a/app/Http/RequestHandlers/LinkMediaToFamilyModal.php b/app/Http/RequestHandlers/LinkMediaToFamilyModal.php index ab6c9705ba..07d11a3a91 100644 --- a/app/Http/RequestHandlers/LinkMediaToFamilyModal.php +++ b/app/Http/RequestHandlers/LinkMediaToFamilyModal.php @@ -21,7 +21,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -41,12 +41,8 @@ class LinkMediaToFamilyModal implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); $media = Registry::mediaFactory()->make($xref, $tree); $media = Auth::checkMediaAccess($media); diff --git a/app/Http/RequestHandlers/LinkMediaToIndividualModal.php b/app/Http/RequestHandlers/LinkMediaToIndividualModal.php index d34c3af77d..156c74a091 100644 --- a/app/Http/RequestHandlers/LinkMediaToIndividualModal.php +++ b/app/Http/RequestHandlers/LinkMediaToIndividualModal.php @@ -21,7 +21,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -41,12 +41,8 @@ class LinkMediaToIndividualModal implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); $media = Registry::mediaFactory()->make($xref, $tree); $media = Auth::checkMediaAccess($media); diff --git a/app/Http/RequestHandlers/LinkMediaToRecordAction.php b/app/Http/RequestHandlers/LinkMediaToRecordAction.php index 124101af0c..4cdb4f0c8c 100644 --- a/app/Http/RequestHandlers/LinkMediaToRecordAction.php +++ b/app/Http/RequestHandlers/LinkMediaToRecordAction.php @@ -21,7 +21,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -41,12 +41,8 @@ class LinkMediaToRecordAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); $params = (array) $request->getParsedBody(); $link = $params['link'] ?? ''; diff --git a/app/Http/RequestHandlers/LinkMediaToSourceModal.php b/app/Http/RequestHandlers/LinkMediaToSourceModal.php index 55fff0c5bb..0a5d18d03f 100644 --- a/app/Http/RequestHandlers/LinkMediaToSourceModal.php +++ b/app/Http/RequestHandlers/LinkMediaToSourceModal.php @@ -21,7 +21,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -41,12 +41,8 @@ class LinkMediaToSourceModal implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); $media = Registry::mediaFactory()->make($xref, $tree); $media = Auth::checkMediaAccess($media); diff --git a/app/Http/RequestHandlers/LinkSpouseToIndividualAction.php b/app/Http/RequestHandlers/LinkSpouseToIndividualAction.php index d8c76b1f42..c059666ed0 100644 --- a/app/Http/RequestHandlers/LinkSpouseToIndividualAction.php +++ b/app/Http/RequestHandlers/LinkSpouseToIndividualAction.php @@ -22,7 +22,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\GedcomEditService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -55,12 +55,8 @@ class LinkSpouseToIndividualAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); $individual = Registry::individualFactory()->make($xref, $tree); $individual = Auth::checkIndividualAccess($individual, true); diff --git a/app/Http/RequestHandlers/LinkSpouseToIndividualPage.php b/app/Http/RequestHandlers/LinkSpouseToIndividualPage.php index 375c753c8e..70b3ca1a58 100644 --- a/app/Http/RequestHandlers/LinkSpouseToIndividualPage.php +++ b/app/Http/RequestHandlers/LinkSpouseToIndividualPage.php @@ -25,7 +25,7 @@ use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\GedcomEditService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -59,12 +59,8 @@ class LinkSpouseToIndividualPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); $individual = Registry::individualFactory()->make($xref, $tree); $individual = Auth::checkIndividualAccess($individual, true); diff --git a/app/Http/RequestHandlers/LocationPage.php b/app/Http/RequestHandlers/LocationPage.php index 39ec3fb4e9..4f53815e84 100644 --- a/app/Http/RequestHandlers/LocationPage.php +++ b/app/Http/RequestHandlers/LocationPage.php @@ -23,7 +23,7 @@ use Fig\Http\Message\StatusCodeInterface; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Support\Collection; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -47,19 +47,14 @@ class LocationPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $slug = Validator::attributes($request)->string('slug', ''); $record = Registry::locationFactory()->make($xref, $tree); $record = Auth::checkLocationAccess($record, false); // Redirect to correct xref/slug - $slug = Registry::slugFactory()->make($record); - - if ($record->xref() !== $xref || $request->getAttribute('slug') !== $slug) { + if ($record->xref() !== $xref || Registry::slugFactory()->make($record) !== $slug) { return redirect($record->url(), StatusCodeInterface::STATUS_MOVED_PERMANENTLY); } diff --git a/app/Http/RequestHandlers/LoginAction.php b/app/Http/RequestHandlers/LoginAction.php index 337dc59ff1..26aab30ba5 100644 --- a/app/Http/RequestHandlers/LoginAction.php +++ b/app/Http/RequestHandlers/LoginAction.php @@ -67,12 +67,12 @@ class LoginAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - $base_url = $request->getAttribute('base_url'); + $tree = Validator::attributes($request)->treeOptional(); + $base_url = Validator::attributes($request)->string('base_url'); $default_url = route(HomePage::class); - $username = Validator::parsedBody($request)->string('username') ?? ''; - $password = Validator::parsedBody($request)->string('password') ?? ''; - $url = Validator::parsedBody($request)->isLocalUrl($base_url)->string('url') ?? $default_url; + $username = Validator::parsedBody($request)->optionalString('username') ?? ''; + $password = Validator::parsedBody($request)->optionalString('password') ?? ''; + $url = Validator::parsedBody($request)->isLocalUrl($base_url)->optionalString('url') ?? $default_url; try { $this->doLogin($username, $password); diff --git a/app/Http/RequestHandlers/LoginPage.php b/app/Http/RequestHandlers/LoginPage.php index 9976f3447c..b7a4dd48e2 100644 --- a/app/Http/RequestHandlers/LoginPage.php +++ b/app/Http/RequestHandlers/LoginPage.php @@ -25,6 +25,7 @@ use Fisharebest\Webtrees\Services\TreeService; use Fisharebest\Webtrees\Site; use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\User; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -55,8 +56,8 @@ class LoginPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - $user = $request->getAttribute('user'); + $tree = Validator::attributes($request)->treeOptional(); + $user = Validator::attributes($request)->user(); // Already logged in? if ($user instanceof User) { diff --git a/app/Http/RequestHandlers/Logout.php b/app/Http/RequestHandlers/Logout.php index de3f410016..74543400df 100644 --- a/app/Http/RequestHandlers/Logout.php +++ b/app/Http/RequestHandlers/Logout.php @@ -24,6 +24,7 @@ use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Log; use Fisharebest\Webtrees\User; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -43,7 +44,7 @@ class Logout implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $user = $request->getAttribute('user'); + $user = Validator::attributes($request)->user(); if ($user instanceof User) { Log::addAuthenticationLog('Logout: ' . Auth::user()->userName() . '/' . Auth::user()->realName()); diff --git a/app/Http/RequestHandlers/ManageTrees.php b/app/Http/RequestHandlers/ManageTrees.php index b431e07355..0b1099b78d 100644 --- a/app/Http/RequestHandlers/ManageTrees.php +++ b/app/Http/RequestHandlers/ManageTrees.php @@ -26,6 +26,7 @@ use Fisharebest\Webtrees\Services\AdminService; use Fisharebest\Webtrees\Services\TreeService; use Fisharebest\Webtrees\Site; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -60,7 +61,7 @@ class ManageTrees implements RequestHandlerInterface { $this->layout = 'layouts/administration'; - $tree = $request->getAttribute('tree'); + $tree = Validator::attributes($request)->treeOptional(); $multiple_tree_threshold = $this->admin_service->multipleTreeThreshold(); $gedcom_file_count = $this->admin_service->gedcomFiles(Registry::filesystem()->data())->count(); diff --git a/app/Http/RequestHandlers/Masquerade.php b/app/Http/RequestHandlers/Masquerade.php index 7a226309be..3c6494ca18 100644 --- a/app/Http/RequestHandlers/Masquerade.php +++ b/app/Http/RequestHandlers/Masquerade.php @@ -24,6 +24,7 @@ use Fisharebest\Webtrees\Http\Exceptions\HttpNotFoundException; use Fisharebest\Webtrees\Log; use Fisharebest\Webtrees\Services\UserService; use Fisharebest\Webtrees\Session; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -52,14 +53,14 @@ class Masquerade implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $user_id = (int) $request->getAttribute('user_id'); + $user_id = Validator::attributes($request)->integer('user_id'); $user = $this->user_service->find($user_id); if ($user === null) { throw new HttpNotFoundException('User ID ' . $user_id . ' not found'); } - if ($request->getAttribute('user')->id() !== $user_id) { + if (Validator::attributes($request)->user()->id() !== $user_id) { Log::addAuthenticationLog('Masquerade as user: ' . $user->userName()); Auth::login($user); Session::put('masquerade', '1'); diff --git a/app/Http/RequestHandlers/MediaFileDownload.php b/app/Http/RequestHandlers/MediaFileDownload.php index 1b4761d834..66557a992f 100644 --- a/app/Http/RequestHandlers/MediaFileDownload.php +++ b/app/Http/RequestHandlers/MediaFileDownload.php @@ -21,9 +21,8 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fig\Http\Message\StatusCodeInterface; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -45,11 +44,8 @@ class MediaFileDownload implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); - assert($user instanceof UserInterface); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); $image_factory = Registry::imageFactory(); diff --git a/app/Http/RequestHandlers/MediaFileThumbnail.php b/app/Http/RequestHandlers/MediaFileThumbnail.php index 11a3f41424..c321261a4c 100644 --- a/app/Http/RequestHandlers/MediaFileThumbnail.php +++ b/app/Http/RequestHandlers/MediaFileThumbnail.php @@ -20,14 +20,12 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fig\Http\Message\StatusCodeInterface; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function redirect; /** @@ -44,11 +42,8 @@ class MediaFileThumbnail implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); - assert($user instanceof UserInterface); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); $params = $request->getQueryParams(); $xref = $params['xref'] ?? ''; diff --git a/app/Http/RequestHandlers/MediaPage.php b/app/Http/RequestHandlers/MediaPage.php index 2f4e616125..94c63f9e13 100644 --- a/app/Http/RequestHandlers/MediaPage.php +++ b/app/Http/RequestHandlers/MediaPage.php @@ -24,7 +24,7 @@ use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\ClipboardService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -61,19 +61,14 @@ class MediaPage implements RequestHandlerInterface { $data_filesystem = Registry::filesystem()->data(); - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $slug = Validator::attributes($request)->string('slug', ''); $record = Registry::mediaFactory()->make($xref, $tree); $record = Auth::checkMediaAccess($record); // Redirect to correct xref/slug - $slug = Registry::slugFactory()->make($record); - - if ($record->xref() !== $xref || $request->getAttribute('slug') !== $slug) { + if ($record->xref() !== $xref || Registry::slugFactory()->make($record) !== $slug) { return redirect($record->url(), StatusCodeInterface::STATUS_MOVED_PERMANENTLY); } diff --git a/app/Http/RequestHandlers/MergeFactsAction.php b/app/Http/RequestHandlers/MergeFactsAction.php index dbd7274e8c..2c02774065 100644 --- a/app/Http/RequestHandlers/MergeFactsAction.php +++ b/app/Http/RequestHandlers/MergeFactsAction.php @@ -24,14 +24,13 @@ use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Query\Expression; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function e; use function in_array; use function preg_replace; @@ -51,8 +50,7 @@ class MergeFactsAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $params = (array) $request->getParsedBody(); diff --git a/app/Http/RequestHandlers/MergeFactsPage.php b/app/Http/RequestHandlers/MergeFactsPage.php index ebc410348d..875b8ff067 100644 --- a/app/Http/RequestHandlers/MergeFactsPage.php +++ b/app/Http/RequestHandlers/MergeFactsPage.php @@ -22,12 +22,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function redirect; /** @@ -48,8 +47,7 @@ class MergeFactsPage implements RequestHandlerInterface { $this->layout = 'layouts/administration'; - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $xref1 = $request->getQueryParams()['xref1'] ?? ''; $xref2 = $request->getQueryParams()['xref2'] ?? ''; diff --git a/app/Http/RequestHandlers/MergeRecordsAction.php b/app/Http/RequestHandlers/MergeRecordsAction.php index d33e62d703..82dae6e3cd 100644 --- a/app/Http/RequestHandlers/MergeRecordsAction.php +++ b/app/Http/RequestHandlers/MergeRecordsAction.php @@ -20,12 +20,11 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function redirect; use function route; @@ -41,8 +40,7 @@ class MergeRecordsAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $params = (array) $request->getParsedBody(); diff --git a/app/Http/RequestHandlers/MergeRecordsPage.php b/app/Http/RequestHandlers/MergeRecordsPage.php index ea73093757..99521c5ae3 100644 --- a/app/Http/RequestHandlers/MergeRecordsPage.php +++ b/app/Http/RequestHandlers/MergeRecordsPage.php @@ -30,12 +30,11 @@ use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Repository; use Fisharebest\Webtrees\Source; use Fisharebest\Webtrees\Submitter; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function e; /** @@ -56,9 +55,7 @@ class MergeRecordsPage implements RequestHandlerInterface { $this->layout = 'layouts/administration'; - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - + $tree = Validator::attributes($request)->tree(); $xref1 = $request->getQueryParams()['xref1'] ?? ''; $xref2 = $request->getQueryParams()['xref2'] ?? ''; diff --git a/app/Http/RequestHandlers/MessageAction.php b/app/Http/RequestHandlers/MessageAction.php index b5e5bba60d..fe3709cce2 100644 --- a/app/Http/RequestHandlers/MessageAction.php +++ b/app/Http/RequestHandlers/MessageAction.php @@ -26,13 +26,11 @@ use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\MessageService; use Fisharebest\Webtrees\Services\UserService; -use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function e; use function redirect; use function route; @@ -67,18 +65,16 @@ class MessageAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); $params = (array) $request->getParsedBody(); $body = $params['body']; $subject = $params['subject']; $to = $params['to']; $to_user = $this->user_service->findByUserName($to); - $ip = $request->getAttribute('client-ip'); - $base_url = $request->getAttribute('base_url'); - $url = Validator::parsedBody($request)->isLocalUrl($base_url)->string('url') ?? $base_url; + $ip = Validator::attributes($request)->string('client-ip'); + $base_url = Validator::attributes($request)->string('base_url'); + $url = Validator::parsedBody($request)->isLocalUrl($base_url)->optionalString('url') ?? $base_url; if ($to_user === null || $to_user->getPreference(UserInterface::PREF_CONTACT_METHOD) === 'none') { throw new HttpAccessDeniedException('Invalid contact user id'); diff --git a/app/Http/RequestHandlers/MessagePage.php b/app/Http/RequestHandlers/MessagePage.php index f16e0f123c..cf93885df1 100644 --- a/app/Http/RequestHandlers/MessagePage.php +++ b/app/Http/RequestHandlers/MessagePage.php @@ -24,12 +24,11 @@ use Fisharebest\Webtrees\Http\Exceptions\HttpAccessDeniedException; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\UserService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function route; /** @@ -58,10 +57,8 @@ class MessagePage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); $body = $request->getQueryParams()['body'] ?? ''; $subject = $request->getQueryParams()['subject'] ?? ''; $to = $request->getQueryParams()['to'] ?? ''; diff --git a/app/Http/RequestHandlers/MessageSelect.php b/app/Http/RequestHandlers/MessageSelect.php index d314823692..2bb74efef3 100644 --- a/app/Http/RequestHandlers/MessageSelect.php +++ b/app/Http/RequestHandlers/MessageSelect.php @@ -19,7 +19,7 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -36,9 +36,7 @@ class MessageSelect implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - + $tree = Validator::attributes($request)->tree(); $params = (array) $request->getParsedBody(); return redirect(route(MessagePage::class, [ diff --git a/app/Http/RequestHandlers/ModuleAction.php b/app/Http/RequestHandlers/ModuleAction.php index 7bc6de28bb..58f38676db 100644 --- a/app/Http/RequestHandlers/ModuleAction.php +++ b/app/Http/RequestHandlers/ModuleAction.php @@ -24,6 +24,7 @@ use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Http\Exceptions\HttpAccessDeniedException; use Fisharebest\Webtrees\Http\Exceptions\HttpNotFoundException; use Fisharebest\Webtrees\Services\ModuleService; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -59,8 +60,7 @@ class ModuleAction implements RequestHandlerInterface { $module_name = $request->getAttribute('module'); $action = $request->getAttribute('action'); - $user = $request->getAttribute('user'); - assert($user instanceof UserInterface); + $user = Validator::attributes($request)->user(); // Check that the module is enabled. // The module itself will need to check any tree-level access, diff --git a/app/Http/RequestHandlers/NotePage.php b/app/Http/RequestHandlers/NotePage.php index 62f3c4b8a3..024eb7a002 100644 --- a/app/Http/RequestHandlers/NotePage.php +++ b/app/Http/RequestHandlers/NotePage.php @@ -24,7 +24,7 @@ use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\ClipboardService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -59,19 +59,14 @@ class NotePage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $slug = Validator::attributes($request)->string('slug', ''); $record = Registry::noteFactory()->make($xref, $tree); $record = Auth::checkNoteAccess($record, false); // Redirect to correct xref/slug - $slug = Registry::slugFactory()->make($record); - - if ($record->xref() !== $xref || $request->getAttribute('slug') !== $slug) { + if ($record->xref() !== $xref || Registry::slugFactory()->make($record) !== $slug) { return redirect($record->url(), StatusCodeInterface::STATUS_MOVED_PERMANENTLY); } diff --git a/app/Http/RequestHandlers/PasswordRequestAction.php b/app/Http/RequestHandlers/PasswordRequestAction.php index 2960362fd3..8c99b6ce0e 100644 --- a/app/Http/RequestHandlers/PasswordRequestAction.php +++ b/app/Http/RequestHandlers/PasswordRequestAction.php @@ -29,6 +29,7 @@ use Fisharebest\Webtrees\Services\UserService; use Fisharebest\Webtrees\SiteUser; use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\User; +use Fisharebest\Webtrees\Validator; use Illuminate\Support\Str; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -83,7 +84,7 @@ class PasswordRequestAction implements RequestHandlerInterface, StatusCodeInterf */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); + $tree = Validator::attributes($request)->treeOptional(); $params = (array) $request->getParsedBody(); diff --git a/app/Http/RequestHandlers/PasswordRequestPage.php b/app/Http/RequestHandlers/PasswordRequestPage.php index 4d19a8daf8..9152174571 100644 --- a/app/Http/RequestHandlers/PasswordRequestPage.php +++ b/app/Http/RequestHandlers/PasswordRequestPage.php @@ -23,6 +23,7 @@ use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\User; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -44,8 +45,8 @@ class PasswordRequestPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - $user = $request->getAttribute('user'); + $tree = Validator::attributes($request)->treeOptional(); + $user = Validator::attributes($request)->user(); // Already logged in? if ($user instanceof User) { diff --git a/app/Http/RequestHandlers/PasswordResetAction.php b/app/Http/RequestHandlers/PasswordResetAction.php index b60b63bc46..67804a4db5 100644 --- a/app/Http/RequestHandlers/PasswordResetAction.php +++ b/app/Http/RequestHandlers/PasswordResetAction.php @@ -27,6 +27,7 @@ use Fisharebest\Webtrees\Log; use Fisharebest\Webtrees\Services\UserService; use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\User; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -55,7 +56,7 @@ class PasswordResetAction implements RequestHandlerInterface, StatusCodeInterfac */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); + $tree = Validator::attributes($request)->treeOptional(); $token = $request->getAttribute('token'); $user = $this->user_service->findByToken($token); diff --git a/app/Http/RequestHandlers/PasswordResetPage.php b/app/Http/RequestHandlers/PasswordResetPage.php index 575de5fea6..20afa8af31 100644 --- a/app/Http/RequestHandlers/PasswordResetPage.php +++ b/app/Http/RequestHandlers/PasswordResetPage.php @@ -26,6 +26,7 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\UserService; use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\User; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -58,7 +59,7 @@ class PasswordResetPage implements RequestHandlerInterface, StatusCodeInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); + $tree = Validator::attributes($request)->treeOptional(); $token = $request->getAttribute('token'); $title = I18N::translate('Set a new password'); $user = $this->user_service->findByToken($token); diff --git a/app/Http/RequestHandlers/PasteFact.php b/app/Http/RequestHandlers/PasteFact.php index a45b7dc77d..9c2fdad0c5 100644 --- a/app/Http/RequestHandlers/PasteFact.php +++ b/app/Http/RequestHandlers/PasteFact.php @@ -22,7 +22,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\ClipboardService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -57,14 +57,9 @@ class PasteFact implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - - $params = (array) $request->getParsedBody(); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $params = (array) $request->getParsedBody(); $fact_id = $params['fact_id']; $record = Registry::gedcomRecordFactory()->make($xref, $tree); $record = Auth::checkRecordAccess($record, true); diff --git a/app/Http/RequestHandlers/PendingChanges.php b/app/Http/RequestHandlers/PendingChanges.php index bacdc2ac33..2ed1d1677d 100644 --- a/app/Http/RequestHandlers/PendingChanges.php +++ b/app/Http/RequestHandlers/PendingChanges.php @@ -22,12 +22,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\PendingChangesService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function route; /** @@ -59,8 +58,7 @@ class PendingChanges implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $n = (int) ($request->getQueryParams()['n'] ?? self::MAX_CHANGES); diff --git a/app/Http/RequestHandlers/PendingChangesAcceptChange.php b/app/Http/RequestHandlers/PendingChangesAcceptChange.php index bdf2b0710e..542436ee8a 100644 --- a/app/Http/RequestHandlers/PendingChangesAcceptChange.php +++ b/app/Http/RequestHandlers/PendingChangesAcceptChange.php @@ -22,7 +22,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\GedcomRecord; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\PendingChangesService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -53,12 +53,8 @@ class PendingChangesAcceptChange implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); $record = Registry::gedcomRecordFactory()->make($xref, $tree); $change = $request->getAttribute('change'); diff --git a/app/Http/RequestHandlers/PendingChangesAcceptRecord.php b/app/Http/RequestHandlers/PendingChangesAcceptRecord.php index e624dd27dc..2074cba16c 100644 --- a/app/Http/RequestHandlers/PendingChangesAcceptRecord.php +++ b/app/Http/RequestHandlers/PendingChangesAcceptRecord.php @@ -23,12 +23,11 @@ use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\PendingChangesService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function response; /** @@ -53,10 +52,8 @@ class PendingChangesAcceptRecord implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref') ?? ''; + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref', ''); $record = Registry::gedcomRecordFactory()->make($xref, $tree); if ($record) { diff --git a/app/Http/RequestHandlers/PendingChangesAcceptTree.php b/app/Http/RequestHandlers/PendingChangesAcceptTree.php index 96fe760cd8..62294be4b1 100644 --- a/app/Http/RequestHandlers/PendingChangesAcceptTree.php +++ b/app/Http/RequestHandlers/PendingChangesAcceptTree.php @@ -22,12 +22,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\PendingChangesService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function e; use function response; @@ -55,8 +54,7 @@ class PendingChangesAcceptTree implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $n = (int) ($request->getQueryParams()['n'] ?? PHP_INT_MAX); diff --git a/app/Http/RequestHandlers/PendingChangesLogData.php b/app/Http/RequestHandlers/PendingChangesLogData.php index 4bbbe9566a..bff8f232e3 100644 --- a/app/Http/RequestHandlers/PendingChangesLogData.php +++ b/app/Http/RequestHandlers/PendingChangesLogData.php @@ -25,7 +25,7 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\DatatablesService; use Fisharebest\Webtrees\Services\PendingChangesService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -68,9 +68,7 @@ class PendingChangesLogData implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - + $tree = Validator::attributes($request)->tree(); $params = $request->getQueryParams(); $params['tree'] = $tree->name(); diff --git a/app/Http/RequestHandlers/PendingChangesLogDelete.php b/app/Http/RequestHandlers/PendingChangesLogDelete.php index 3f12d53051..af75b0c105 100644 --- a/app/Http/RequestHandlers/PendingChangesLogDelete.php +++ b/app/Http/RequestHandlers/PendingChangesLogDelete.php @@ -20,12 +20,11 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Services\PendingChangesService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function response; /** @@ -50,9 +49,7 @@ class PendingChangesLogDelete implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - + $tree = Validator::attributes($request)->tree(); $params = $request->getQueryParams(); $params['tree'] = $tree->name(); diff --git a/app/Http/RequestHandlers/PendingChangesLogDownload.php b/app/Http/RequestHandlers/PendingChangesLogDownload.php index cf5c4b7df8..f3676cf14e 100644 --- a/app/Http/RequestHandlers/PendingChangesLogDownload.php +++ b/app/Http/RequestHandlers/PendingChangesLogDownload.php @@ -21,12 +21,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fig\Http\Message\StatusCodeInterface; use Fisharebest\Webtrees\Services\PendingChangesService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function response; /** @@ -51,9 +50,7 @@ class PendingChangesLogDownload implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - + $tree = Validator::attributes($request)->tree(); $params = $request->getQueryParams(); $params['tree'] = $tree->name(); diff --git a/app/Http/RequestHandlers/PendingChangesLogPage.php b/app/Http/RequestHandlers/PendingChangesLogPage.php index e852d6b2f4..5d0af5c717 100644 --- a/app/Http/RequestHandlers/PendingChangesLogPage.php +++ b/app/Http/RequestHandlers/PendingChangesLogPage.php @@ -24,7 +24,7 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\TreeService; use Fisharebest\Webtrees\Services\UserService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -60,12 +60,10 @@ class PendingChangesLogPage implements RequestHandlerInterface { $this->layout = 'layouts/administration'; - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - + $tree = Validator::attributes($request)->tree(); $trees = $this->tree_service->titles(); - $users = ['' => '']; + foreach ($this->user_service->all() as $user) { $user_name = $user->userName(); $users[$user_name] = $user_name; diff --git a/app/Http/RequestHandlers/PendingChangesRejectChange.php b/app/Http/RequestHandlers/PendingChangesRejectChange.php index 1c594b9366..4732a7929a 100644 --- a/app/Http/RequestHandlers/PendingChangesRejectChange.php +++ b/app/Http/RequestHandlers/PendingChangesRejectChange.php @@ -22,7 +22,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\GedcomRecord; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\PendingChangesService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -53,12 +53,8 @@ class PendingChangesRejectChange implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); $record = Registry::gedcomRecordFactory()->make($xref, $tree); $change = $request->getAttribute('change'); diff --git a/app/Http/RequestHandlers/PendingChangesRejectRecord.php b/app/Http/RequestHandlers/PendingChangesRejectRecord.php index bbdfc93fb7..dd412f46ab 100644 --- a/app/Http/RequestHandlers/PendingChangesRejectRecord.php +++ b/app/Http/RequestHandlers/PendingChangesRejectRecord.php @@ -24,12 +24,11 @@ use Fisharebest\Webtrees\GedcomRecord; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\PendingChangesService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function response; /** @@ -54,10 +53,8 @@ class PendingChangesRejectRecord implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref') ?? ''; + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref', ''); $record = Registry::gedcomRecordFactory()->make($xref, $tree); if ($record instanceof GedcomRecord) { diff --git a/app/Http/RequestHandlers/PendingChangesRejectTree.php b/app/Http/RequestHandlers/PendingChangesRejectTree.php index e55b0d7cba..de19547ca2 100644 --- a/app/Http/RequestHandlers/PendingChangesRejectTree.php +++ b/app/Http/RequestHandlers/PendingChangesRejectTree.php @@ -22,12 +22,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\PendingChangesService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function e; use function response; @@ -53,8 +52,7 @@ class PendingChangesRejectTree implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $this->pending_changes_service->rejectTree($tree); diff --git a/app/Http/RequestHandlers/RedirectDescendencyPhp.php b/app/Http/RequestHandlers/RedirectDescendencyPhp.php index e81899957d..bd18fb9691 100644 --- a/app/Http/RequestHandlers/RedirectDescendencyPhp.php +++ b/app/Http/RequestHandlers/RedirectDescendencyPhp.php @@ -22,7 +22,6 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fig\Http\Message\StatusCodeInterface; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Http\Exceptions\HttpNotFoundException; -use Fisharebest\Webtrees\Module\AncestorsChartModule; use Fisharebest\Webtrees\Module\DescendancyChartModule; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\ModuleService; diff --git a/app/Http/RequestHandlers/RedirectFamilyPhp.php b/app/Http/RequestHandlers/RedirectFamilyPhp.php index bafe1db2ea..188d0e936f 100644 --- a/app/Http/RequestHandlers/RedirectFamilyPhp.php +++ b/app/Http/RequestHandlers/RedirectFamilyPhp.php @@ -56,8 +56,8 @@ class RedirectFamilyPhp implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $ged = Validator::queryParams($request)->requiredString('ged'); - $famid = Validator::queryParams($request)->isXref()->requiredString('famid'); + $ged = Validator::queryParams($request)->string('ged'); + $famid = Validator::queryParams($request)->isXref()->string('famid'); $tree = $this->tree_service->all()->get($ged); if ($tree instanceof Tree) { diff --git a/app/Http/RequestHandlers/RedirectGedRecordPhp.php b/app/Http/RequestHandlers/RedirectGedRecordPhp.php index a7a6ee541e..8d92abd503 100644 --- a/app/Http/RequestHandlers/RedirectGedRecordPhp.php +++ b/app/Http/RequestHandlers/RedirectGedRecordPhp.php @@ -56,8 +56,8 @@ class RedirectGedRecordPhp implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $ged = Validator::queryParams($request)->requiredString('ged'); - $pid = Validator::queryParams($request)->isXref()->requiredString('pid'); + $ged = Validator::queryParams($request)->string('ged'); + $pid = Validator::queryParams($request)->isXref()->string('pid'); $tree = $this->tree_service->all()->get($ged); if ($tree instanceof Tree) { diff --git a/app/Http/RequestHandlers/RedirectIndividualPhp.php b/app/Http/RequestHandlers/RedirectIndividualPhp.php index 0c1c96a370..a2d55a6dd9 100644 --- a/app/Http/RequestHandlers/RedirectIndividualPhp.php +++ b/app/Http/RequestHandlers/RedirectIndividualPhp.php @@ -56,8 +56,8 @@ class RedirectIndividualPhp implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $ged = Validator::queryParams($request)->requiredString('ged'); - $pid = Validator::queryParams($request)->isXref()->requiredString('pid'); + $ged = Validator::queryParams($request)->string('ged'); + $pid = Validator::queryParams($request)->isXref()->string('pid'); $tree = $this->tree_service->all()->get($ged); if ($tree instanceof Tree) { diff --git a/app/Http/RequestHandlers/RedirectMediaViewerPhp.php b/app/Http/RequestHandlers/RedirectMediaViewerPhp.php index 65eb223370..b52d46bac6 100644 --- a/app/Http/RequestHandlers/RedirectMediaViewerPhp.php +++ b/app/Http/RequestHandlers/RedirectMediaViewerPhp.php @@ -56,8 +56,8 @@ class RedirectMediaViewerPhp implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $ged = Validator::queryParams($request)->requiredString('ged'); - $mid = Validator::queryParams($request)->isXref()->requiredString('mid'); + $ged = Validator::queryParams($request)->string('ged'); + $mid = Validator::queryParams($request)->isXref()->string('mid'); $tree = $this->tree_service->all()->get($ged); if ($tree instanceof Tree) { diff --git a/app/Http/RequestHandlers/RedirectModulePhp.php b/app/Http/RequestHandlers/RedirectModulePhp.php index 87f003fc42..f906f128d7 100644 --- a/app/Http/RequestHandlers/RedirectModulePhp.php +++ b/app/Http/RequestHandlers/RedirectModulePhp.php @@ -34,7 +34,6 @@ use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; use function redirect; -use function route; /** * Redirect URLs created by webtrees 1.x (and PhpGedView). diff --git a/app/Http/RequestHandlers/RedirectNotePhp.php b/app/Http/RequestHandlers/RedirectNotePhp.php index 7006e60dcb..8117e9e73c 100644 --- a/app/Http/RequestHandlers/RedirectNotePhp.php +++ b/app/Http/RequestHandlers/RedirectNotePhp.php @@ -56,8 +56,8 @@ class RedirectNotePhp implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $ged = Validator::queryParams($request)->requiredString('ged'); - $nid = Validator::queryParams($request)->isXref()->requiredString('nid'); + $ged = Validator::queryParams($request)->string('ged'); + $nid = Validator::queryParams($request)->isXref()->string('nid'); $tree = $this->tree_service->all()->get($ged); if ($tree instanceof Tree) { diff --git a/app/Http/RequestHandlers/RedirectRelationshipPhp.php b/app/Http/RequestHandlers/RedirectRelationshipPhp.php index f88324a69c..fcd047bffb 100644 --- a/app/Http/RequestHandlers/RedirectRelationshipPhp.php +++ b/app/Http/RequestHandlers/RedirectRelationshipPhp.php @@ -22,7 +22,6 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fig\Http\Message\StatusCodeInterface; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Http\Exceptions\HttpNotFoundException; -use Fisharebest\Webtrees\Module\PedigreeChartModule; use Fisharebest\Webtrees\Module\RelationshipsChartModule; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\ModuleService; diff --git a/app/Http/RequestHandlers/RedirectRepositoryPhp.php b/app/Http/RequestHandlers/RedirectRepositoryPhp.php index be94daeff0..e7e1ae4a59 100644 --- a/app/Http/RequestHandlers/RedirectRepositoryPhp.php +++ b/app/Http/RequestHandlers/RedirectRepositoryPhp.php @@ -56,8 +56,8 @@ class RedirectRepositoryPhp implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $ged = Validator::queryParams($request)->requiredString('ged'); - $rid = Validator::queryParams($request)->isXref()->requiredString('rid'); + $ged = Validator::queryParams($request)->string('ged'); + $rid = Validator::queryParams($request)->isXref()->string('rid'); $tree = $this->tree_service->all()->get($ged); if ($tree instanceof Tree) { diff --git a/app/Http/RequestHandlers/RedirectSourcePhp.php b/app/Http/RequestHandlers/RedirectSourcePhp.php index e4a7410d41..29b8acfc15 100644 --- a/app/Http/RequestHandlers/RedirectSourcePhp.php +++ b/app/Http/RequestHandlers/RedirectSourcePhp.php @@ -56,8 +56,8 @@ class RedirectSourcePhp implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $ged = Validator::queryParams($request)->requiredString('ged'); - $sid = Validator::queryParams($request)->isXref()->requiredString('sid'); + $ged = Validator::queryParams($request)->string('ged'); + $sid = Validator::queryParams($request)->isXref()->string('sid'); $tree = $this->tree_service->all()->get($ged); if ($tree instanceof Tree) { diff --git a/app/Http/RequestHandlers/RegisterAction.php b/app/Http/RequestHandlers/RegisterAction.php index 8da9f51591..210771e602 100644 --- a/app/Http/RequestHandlers/RegisterAction.php +++ b/app/Http/RequestHandlers/RegisterAction.php @@ -36,6 +36,7 @@ use Fisharebest\Webtrees\Site; use Fisharebest\Webtrees\SiteUser; use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\TreeUser; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Support\Str; use Psr\Http\Message\ResponseInterface; @@ -88,7 +89,7 @@ class RegisterAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); + $tree = Validator::attributes($request)->treeOptional(); $this->checkRegistrationAllowed(); @@ -142,7 +143,7 @@ class RegisterAction implements RequestHandlerInterface $user->setPreference(UserInterface::PREF_IS_ADMINISTRATOR, ''); $user->setPreference(UserInterface::PREF_TIMESTAMP_ACTIVE, '0'); - $base_url = $request->getAttribute('base_url'); + $base_url = Validator::attributes($request)->string('base_url'); $reply_to = $tree instanceof Tree ? new TreeUser($tree) : new SiteUser(); $verify_url = route(VerifyEmail::class, [ @@ -258,7 +259,7 @@ class RegisterAction implements RequestHandlerInterface throw new Exception(I18N::translate('Duplicate email address. A user with that email already exists.')); } - $base_url = $request->getAttribute('base_url'); + $base_url = Validator::attributes($request)->string('base_url'); // No external links if (preg_match('/(?!' . preg_quote($base_url, '/') . ')(((?:http|https):\/\/)[a-zA-Z0-9.-]+)/', $comments, $match)) { diff --git a/app/Http/RequestHandlers/RegisterPage.php b/app/Http/RequestHandlers/RegisterPage.php index c77e2796d9..cffcae3d78 100644 --- a/app/Http/RequestHandlers/RegisterPage.php +++ b/app/Http/RequestHandlers/RegisterPage.php @@ -25,6 +25,7 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\CaptchaService; use Fisharebest\Webtrees\Session; use Fisharebest\Webtrees\Site; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -59,7 +60,7 @@ class RegisterPage implements RequestHandlerInterface { $this->checkRegistrationAllowed(); - $tree = $request->getAttribute('tree'); + $tree = Validator::attributes($request)->treeOptional(); $comments = Session::get('register_comments'); $comments = is_string($comments) ? $comments : ''; diff --git a/app/Http/RequestHandlers/RenumberTreeAction.php b/app/Http/RequestHandlers/RenumberTreeAction.php index 24c31e094f..df3b1c3186 100644 --- a/app/Http/RequestHandlers/RenumberTreeAction.php +++ b/app/Http/RequestHandlers/RenumberTreeAction.php @@ -31,7 +31,7 @@ use Fisharebest\Webtrees\Repository; use Fisharebest\Webtrees\Services\AdminService; use Fisharebest\Webtrees\Services\TimeoutService; use Fisharebest\Webtrees\Source; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Query\Expression; use Illuminate\Database\Query\JoinClause; @@ -39,7 +39,6 @@ use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function redirect; use function route; @@ -69,9 +68,7 @@ class RenumberTreeAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - + $tree = Validator::attributes($request)->tree(); $xrefs = $this->admin_service->duplicateXrefs($tree); foreach ($xrefs as $old_xref => $type) { diff --git a/app/Http/RequestHandlers/RenumberTreePage.php b/app/Http/RequestHandlers/RenumberTreePage.php index 51929a33d8..291065be54 100644 --- a/app/Http/RequestHandlers/RenumberTreePage.php +++ b/app/Http/RequestHandlers/RenumberTreePage.php @@ -22,12 +22,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\AdminService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function e; /** @@ -56,9 +55,7 @@ class RenumberTreePage implements RequestHandlerInterface { $this->layout = 'layouts/administration'; - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - + $tree = Validator::attributes($request)->tree(); $xrefs = $this->admin_service->duplicateXrefs($tree); /* I18N: Renumber the records in a family tree */ diff --git a/app/Http/RequestHandlers/ReorderChildrenAction.php b/app/Http/RequestHandlers/ReorderChildrenAction.php index ae820340af..89eecb1f29 100644 --- a/app/Http/RequestHandlers/ReorderChildrenAction.php +++ b/app/Http/RequestHandlers/ReorderChildrenAction.php @@ -21,7 +21,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -47,12 +47,8 @@ class ReorderChildrenAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); $family = Registry::familyFactory()->make($xref, $tree); $family = Auth::checkFamilyAccess($family, true); diff --git a/app/Http/RequestHandlers/ReorderChildrenPage.php b/app/Http/RequestHandlers/ReorderChildrenPage.php index ec0f2db19f..ff6a7b5b9b 100644 --- a/app/Http/RequestHandlers/ReorderChildrenPage.php +++ b/app/Http/RequestHandlers/ReorderChildrenPage.php @@ -23,7 +23,7 @@ use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -45,12 +45,8 @@ class ReorderChildrenPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); $family = Registry::familyFactory()->make($xref, $tree); $family = Auth::checkFamilyAccess($family, true); diff --git a/app/Http/RequestHandlers/ReorderFamiliesAction.php b/app/Http/RequestHandlers/ReorderFamiliesAction.php index 1124285437..2efd089871 100644 --- a/app/Http/RequestHandlers/ReorderFamiliesAction.php +++ b/app/Http/RequestHandlers/ReorderFamiliesAction.php @@ -21,7 +21,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -47,12 +47,8 @@ class ReorderFamiliesAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); $individual = Registry::individualFactory()->make($xref, $tree); $individual = Auth::checkIndividualAccess($individual, true); diff --git a/app/Http/RequestHandlers/ReorderFamiliesPage.php b/app/Http/RequestHandlers/ReorderFamiliesPage.php index c8efdf3195..63633f7697 100644 --- a/app/Http/RequestHandlers/ReorderFamiliesPage.php +++ b/app/Http/RequestHandlers/ReorderFamiliesPage.php @@ -23,7 +23,7 @@ use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -45,16 +45,11 @@ class ReorderFamiliesPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); $individual = Registry::individualFactory()->make($xref, $tree); $individual = Auth::checkIndividualAccess($individual, true); - - $title = $individual->fullName() . ' — ' . I18N::translate('Re-order families'); + $title = $individual->fullName() . ' — ' . I18N::translate('Re-order families'); return $this->viewResponse('edit/reorder-families', [ 'famc_facts' => $individual->facts(['FAMC']), diff --git a/app/Http/RequestHandlers/ReorderMediaAction.php b/app/Http/RequestHandlers/ReorderMediaAction.php index 5afbfb6cc6..f0546c70a4 100644 --- a/app/Http/RequestHandlers/ReorderMediaAction.php +++ b/app/Http/RequestHandlers/ReorderMediaAction.php @@ -21,7 +21,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -31,7 +31,6 @@ use function array_search; use function assert; use function implode; use function is_array; -use function is_string; use function redirect; use function uksort; @@ -47,16 +46,11 @@ class ReorderMediaAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); $individual = Registry::individualFactory()->make($xref, $tree); $individual = Auth::checkIndividualAccess($individual, true); - - $params = (array) $request->getParsedBody(); + $params = (array) $request->getParsedBody(); $order = $params['order']; assert(is_array($order)); diff --git a/app/Http/RequestHandlers/ReorderMediaPage.php b/app/Http/RequestHandlers/ReorderMediaPage.php index 01c005a92d..aae6779e23 100644 --- a/app/Http/RequestHandlers/ReorderMediaPage.php +++ b/app/Http/RequestHandlers/ReorderMediaPage.php @@ -23,14 +23,11 @@ use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; -use function is_string; - /** * Reorder the media of an individual. */ @@ -45,16 +42,11 @@ class ReorderMediaPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); $individual = Registry::individualFactory()->make($xref, $tree); $individual = Auth::checkIndividualAccess($individual, true); - - $title = $individual->fullName() . ' — ' . I18N::translate('Re-order media'); + $title = $individual->fullName() . ' — ' . I18N::translate('Re-order media'); return $this->viewResponse('edit/reorder-media', [ 'individual' => $individual, diff --git a/app/Http/RequestHandlers/ReorderNamesAction.php b/app/Http/RequestHandlers/ReorderNamesAction.php index 285e30721b..39623aa5c1 100644 --- a/app/Http/RequestHandlers/ReorderNamesAction.php +++ b/app/Http/RequestHandlers/ReorderNamesAction.php @@ -21,7 +21,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -47,12 +47,8 @@ class ReorderNamesAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); $individual = Registry::individualFactory()->make($xref, $tree); $individual = Auth::checkIndividualAccess($individual, true); diff --git a/app/Http/RequestHandlers/ReorderNamesPage.php b/app/Http/RequestHandlers/ReorderNamesPage.php index f89815f42e..b795490004 100644 --- a/app/Http/RequestHandlers/ReorderNamesPage.php +++ b/app/Http/RequestHandlers/ReorderNamesPage.php @@ -23,14 +23,11 @@ use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; -use function is_string; - /** * Reorder the names of an individual. */ @@ -45,16 +42,11 @@ class ReorderNamesPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); $individual = Registry::individualFactory()->make($xref, $tree); $individual = Auth::checkIndividualAccess($individual, true); - - $title = $individual->fullName() . ' — ' . I18N::translate('Re-order names'); + $title = $individual->fullName() . ' — ' . I18N::translate('Re-order names'); return $this->viewResponse('edit/reorder-names', [ 'individual' => $individual, diff --git a/app/Http/RequestHandlers/ReportGenerate.php b/app/Http/RequestHandlers/ReportGenerate.php index 0d7a52e457..652cd6ac84 100644 --- a/app/Http/RequestHandlers/ReportGenerate.php +++ b/app/Http/RequestHandlers/ReportGenerate.php @@ -21,7 +21,6 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fig\Http\Message\StatusCodeInterface; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Module\ModuleReportInterface; @@ -30,13 +29,12 @@ use Fisharebest\Webtrees\Report\HtmlRenderer; use Fisharebest\Webtrees\Report\PdfRenderer; use Fisharebest\Webtrees\Report\ReportParserGenerate; use Fisharebest\Webtrees\Services\ModuleService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; use function addcslashes; -use function assert; use function ob_get_clean; use function ob_start; use function redirect; @@ -71,15 +69,12 @@ class ReportGenerate implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); - assert($user instanceof UserInterface); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); $data_filesystem = Registry::filesystem()->data(); - $report = $request->getAttribute('report'); + $report = Validator::attributes($request)->string('report'); $module = $this->module_service->findByName($report); if (!$module instanceof ModuleReportInterface) { diff --git a/app/Http/RequestHandlers/ReportListAction.php b/app/Http/RequestHandlers/ReportListAction.php index 4e39aae663..cc2fe86b2e 100644 --- a/app/Http/RequestHandlers/ReportListAction.php +++ b/app/Http/RequestHandlers/ReportListAction.php @@ -20,15 +20,13 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Module\ModuleReportInterface; use Fisharebest\Webtrees\Services\ModuleService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function redirect; use function route; @@ -58,11 +56,8 @@ class ReportListAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); - assert($user instanceof UserInterface); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); $params = (array) $request->getParsedBody(); diff --git a/app/Http/RequestHandlers/ReportListPage.php b/app/Http/RequestHandlers/ReportListPage.php index 5c6c834815..d47327e009 100644 --- a/app/Http/RequestHandlers/ReportListPage.php +++ b/app/Http/RequestHandlers/ReportListPage.php @@ -19,18 +19,15 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Module\ModuleReportInterface; use Fisharebest\Webtrees\Services\ModuleService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; - /** * Show all available reports. */ @@ -59,11 +56,8 @@ class ReportListPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); - assert($user instanceof UserInterface); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); $reports = $this->module_service ->findByComponent(ModuleReportInterface::class, $tree, $user); diff --git a/app/Http/RequestHandlers/ReportSetupAction.php b/app/Http/RequestHandlers/ReportSetupAction.php index 33f1f77fbf..2a2342f0a5 100644 --- a/app/Http/RequestHandlers/ReportSetupAction.php +++ b/app/Http/RequestHandlers/ReportSetupAction.php @@ -20,16 +20,14 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\Module\ModuleReportInterface; use Fisharebest\Webtrees\Services\ModuleService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function redirect; use function route; @@ -59,13 +57,10 @@ class ReportSetupAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); - $user = $request->getAttribute('user'); - assert($user instanceof UserInterface); - - $report = $request->getAttribute('report'); + $report = Validator::attributes($request)->string('report'); $module = $this->module_service->findByName($report); if (!$module instanceof ModuleReportInterface) { diff --git a/app/Http/RequestHandlers/ReportSetupPage.php b/app/Http/RequestHandlers/ReportSetupPage.php index 0890abc838..88d0bb9a23 100644 --- a/app/Http/RequestHandlers/ReportSetupPage.php +++ b/app/Http/RequestHandlers/ReportSetupPage.php @@ -20,7 +20,6 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Html; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; @@ -29,12 +28,11 @@ use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Report\ReportParserSetup; use Fisharebest\Webtrees\Services\LocalizationService; use Fisharebest\Webtrees\Services\ModuleService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function redirect; use function route; @@ -68,13 +66,10 @@ class ReportSetupPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); - $user = $request->getAttribute('user'); - assert($user instanceof UserInterface); - - $report = $request->getAttribute('report'); + $report = Validator::attributes($request)->string('report'); $module = $this->module_service->findByName($report); if (!$module instanceof ModuleReportInterface) { diff --git a/app/Http/RequestHandlers/RepositoryPage.php b/app/Http/RequestHandlers/RepositoryPage.php index 886c8b287b..ef919ac534 100644 --- a/app/Http/RequestHandlers/RepositoryPage.php +++ b/app/Http/RequestHandlers/RepositoryPage.php @@ -24,13 +24,11 @@ use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\ClipboardService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; -use function is_string; use function redirect; /** @@ -59,19 +57,14 @@ class RepositoryPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $slug = Validator::attributes($request)->string('slug', ''); $record = Registry::repositoryFactory()->make($xref, $tree); $record = Auth::checkRepositoryAccess($record, false); // Redirect to correct xref/slug - $slug = Registry::slugFactory()->make($record); - - if ($record->xref() !== $xref || $request->getAttribute('slug') !== $slug) { + if ($record->xref() !== $xref || Registry::slugFactory()->make($record) !== $slug) { return redirect($record->url(), StatusCodeInterface::STATUS_MOVED_PERMANENTLY); } diff --git a/app/Http/RequestHandlers/RobotsTxt.php b/app/Http/RequestHandlers/RobotsTxt.php index 71f01eed4c..318e4e125d 100644 --- a/app/Http/RequestHandlers/RobotsTxt.php +++ b/app/Http/RequestHandlers/RobotsTxt.php @@ -22,6 +22,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Http\Middleware\BadBotBlocker; use Fisharebest\Webtrees\Module\SiteMapModule; use Fisharebest\Webtrees\Services\ModuleService; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -62,7 +63,7 @@ class RobotsTxt implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $base_url = $request->getAttribute('base_url'); + $base_url = Validator::attributes($request)->string('base_url'); $data = [ 'bad_user_agents' => BadBotBlocker::BAD_ROBOTS, diff --git a/app/Http/RequestHandlers/SearchAdvancedAction.php b/app/Http/RequestHandlers/SearchAdvancedAction.php index 20c4213f2f..ed36a74803 100644 --- a/app/Http/RequestHandlers/SearchAdvancedAction.php +++ b/app/Http/RequestHandlers/SearchAdvancedAction.php @@ -19,13 +19,11 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; - /** * Search for genealogy data */ @@ -40,11 +38,8 @@ class SearchAdvancedAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $params = (array) $request->getParsedBody(); - + $tree = Validator::attributes($request)->tree(); + $params = (array) $request->getParsedBody(); $fields = $params['fields'] ?? []; $modifiers = $params['modifiers'] ?? []; $other_field = $params['other_field'] ?? ''; diff --git a/app/Http/RequestHandlers/SearchAdvancedPage.php b/app/Http/RequestHandlers/SearchAdvancedPage.php index d563570536..e24a0e7cdd 100644 --- a/app/Http/RequestHandlers/SearchAdvancedPage.php +++ b/app/Http/RequestHandlers/SearchAdvancedPage.php @@ -23,7 +23,7 @@ use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\SearchService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Support\Collection; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -33,7 +33,6 @@ use function array_fill_keys; use function array_filter; use function array_key_exists; use function array_merge; -use function assert; use function strtr; /** @@ -142,8 +141,7 @@ class SearchAdvancedPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $default_fields = array_fill_keys(self::DEFAULT_ADVANCED_FIELDS, ''); diff --git a/app/Http/RequestHandlers/SearchGeneralAction.php b/app/Http/RequestHandlers/SearchGeneralAction.php index 3bd0d7af95..c0769ed7a1 100644 --- a/app/Http/RequestHandlers/SearchGeneralAction.php +++ b/app/Http/RequestHandlers/SearchGeneralAction.php @@ -19,13 +19,11 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; - /** * Search for genealogy data */ @@ -40,8 +38,7 @@ class SearchGeneralAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $params = (array) $request->getParsedBody(); diff --git a/app/Http/RequestHandlers/SearchGeneralPage.php b/app/Http/RequestHandlers/SearchGeneralPage.php index b5606357e2..b45b5b7381 100644 --- a/app/Http/RequestHandlers/SearchGeneralPage.php +++ b/app/Http/RequestHandlers/SearchGeneralPage.php @@ -29,13 +29,13 @@ use Fisharebest\Webtrees\Services\SearchService; use Fisharebest\Webtrees\Services\TreeService; use Fisharebest\Webtrees\Site; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Support\Collection; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function preg_replace; use function redirect; use function trim; @@ -74,8 +74,7 @@ class SearchGeneralPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $params = $request->getQueryParams(); $query = $params['query'] ?? ''; diff --git a/app/Http/RequestHandlers/SearchPhoneticAction.php b/app/Http/RequestHandlers/SearchPhoneticAction.php index e3f14e4b26..6c0125a169 100644 --- a/app/Http/RequestHandlers/SearchPhoneticAction.php +++ b/app/Http/RequestHandlers/SearchPhoneticAction.php @@ -19,13 +19,11 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; - /** * Search for genealogy data */ @@ -40,8 +38,7 @@ class SearchPhoneticAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $params = (array) $request->getParsedBody(); diff --git a/app/Http/RequestHandlers/SearchPhoneticPage.php b/app/Http/RequestHandlers/SearchPhoneticPage.php index 9f34382507..33036a29a3 100644 --- a/app/Http/RequestHandlers/SearchPhoneticPage.php +++ b/app/Http/RequestHandlers/SearchPhoneticPage.php @@ -25,13 +25,12 @@ use Fisharebest\Webtrees\Services\SearchService; use Fisharebest\Webtrees\Services\TreeService; use Fisharebest\Webtrees\Site; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Support\Collection; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; - /** * Search for (and optionally replace) genealogy data */ @@ -64,8 +63,7 @@ class SearchPhoneticPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $params = $request->getQueryParams(); $firstname = $params['firstname'] ?? ''; diff --git a/app/Http/RequestHandlers/SearchQuickAction.php b/app/Http/RequestHandlers/SearchQuickAction.php index 8c2c271dac..dd76d25e58 100644 --- a/app/Http/RequestHandlers/SearchQuickAction.php +++ b/app/Http/RequestHandlers/SearchQuickAction.php @@ -21,12 +21,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\GedcomRecord; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function redirect; use function route; @@ -44,8 +43,7 @@ class SearchQuickAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $params = (array) $request->getParsedBody(); diff --git a/app/Http/RequestHandlers/SearchReplaceAction.php b/app/Http/RequestHandlers/SearchReplaceAction.php index a063590b5f..6221cb3b6c 100644 --- a/app/Http/RequestHandlers/SearchReplaceAction.php +++ b/app/Http/RequestHandlers/SearchReplaceAction.php @@ -25,14 +25,12 @@ use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\SearchService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Support\Collection; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; - /** * Search and replace genealogy data */ @@ -61,9 +59,7 @@ class SearchReplaceAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - + $tree = Validator::attributes($request)->tree(); $params = (array) $request->getParsedBody(); $search = $params['search'] ?? ''; $replace = $params['replace'] ?? ''; diff --git a/app/Http/RequestHandlers/SearchReplacePage.php b/app/Http/RequestHandlers/SearchReplacePage.php index 6d5e305dd4..62322b4836 100644 --- a/app/Http/RequestHandlers/SearchReplacePage.php +++ b/app/Http/RequestHandlers/SearchReplacePage.php @@ -21,13 +21,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; - /** * Search and replace genealogy data */ @@ -44,12 +42,9 @@ class SearchReplacePage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - + $tree = Validator::attributes($request)->tree(); $params = $request->getQueryParams(); - - $title = I18N::translate('Search and replace'); + $title = I18N::translate('Search and replace'); return $this->viewResponse('search-replace-page', [ 'context' => $params['context'] ?? 'all', diff --git a/app/Http/RequestHandlers/SelectDefaultTree.php b/app/Http/RequestHandlers/SelectDefaultTree.php index 3c68d2a55e..f0062f215d 100644 --- a/app/Http/RequestHandlers/SelectDefaultTree.php +++ b/app/Http/RequestHandlers/SelectDefaultTree.php @@ -23,12 +23,11 @@ use Fig\Http\Message\StatusCodeInterface; use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Site; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function e; use function redirect; use function route; @@ -45,8 +44,7 @@ class SelectDefaultTree implements RequestHandlerInterface, StatusCodeInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); Site::setPreference('DEFAULT_GEDCOM', $tree->name()); diff --git a/app/Http/RequestHandlers/SelectLanguage.php b/app/Http/RequestHandlers/SelectLanguage.php index af6f88326b..0eaa361266 100644 --- a/app/Http/RequestHandlers/SelectLanguage.php +++ b/app/Http/RequestHandlers/SelectLanguage.php @@ -21,6 +21,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Session; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -41,8 +42,7 @@ class SelectLanguage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $user = $request->getAttribute('user'); - assert($user instanceof UserInterface); + $user = Validator::attributes($request)->user(); $language = $request->getAttribute('language'); assert(is_string($language)); diff --git a/app/Http/RequestHandlers/SelectNewFact.php b/app/Http/RequestHandlers/SelectNewFact.php index 449cada6a5..be2590a298 100644 --- a/app/Http/RequestHandlers/SelectNewFact.php +++ b/app/Http/RequestHandlers/SelectNewFact.php @@ -19,7 +19,7 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -40,12 +40,8 @@ class SelectNewFact implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); $params = (array) $request->getParsedBody(); $fact = $params['fact']; diff --git a/app/Http/RequestHandlers/SelectTheme.php b/app/Http/RequestHandlers/SelectTheme.php index 9ca1b35bd7..88ba9dbf1b 100644 --- a/app/Http/RequestHandlers/SelectTheme.php +++ b/app/Http/RequestHandlers/SelectTheme.php @@ -21,6 +21,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Session; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -41,8 +42,7 @@ class SelectTheme implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $user = $request->getAttribute('user'); - assert($user instanceof UserInterface); + $user = Validator::attributes($request)->user(); $theme = $request->getAttribute('theme'); assert(is_string($theme)); diff --git a/app/Http/RequestHandlers/SetupWizard.php b/app/Http/RequestHandlers/SetupWizard.php index 25136cebac..2da653ebc4 100644 --- a/app/Http/RequestHandlers/SetupWizard.php +++ b/app/Http/RequestHandlers/SetupWizard.php @@ -35,6 +35,7 @@ use Fisharebest\Webtrees\Services\ModuleService; use Fisharebest\Webtrees\Services\ServerCheckService; use Fisharebest\Webtrees\Services\UserService; use Fisharebest\Webtrees\Session; +use Fisharebest\Webtrees\Validator; use Fisharebest\Webtrees\Webtrees; use Illuminate\Database\Capsule\Manager as DB; use Psr\Http\Message\ResponseInterface; @@ -130,15 +131,14 @@ class SetupWizard implements RequestHandlerInterface Registry::cache(new CacheFactory()); // We will need an IP address for the logs. - $ip_address = $request->getServerParams()['REMOTE_ADDR'] ?? '127.0.0.1'; - $request = $request->withAttribute('client-ip', $ip_address); + $ip_address = Validator::serverParams($request)->string('REMOTE_ADDR', '127.0.0.1'); + $request = $request->withAttribute('client-ip', $ip_address); app()->instance(ServerRequestInterface::class, $request); $data = $this->userData($request); - $params = (array) $request->getParsedBody(); - $step = (int) ($params['step'] ?? '1'); + $step = Validator::parsedBody($request)->integer('step', 1); $locales = $this->module_service ->setupLanguages() diff --git a/app/Http/RequestHandlers/SourcePage.php b/app/Http/RequestHandlers/SourcePage.php index 11fcacc09d..4349a22af2 100644 --- a/app/Http/RequestHandlers/SourcePage.php +++ b/app/Http/RequestHandlers/SourcePage.php @@ -24,13 +24,11 @@ use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\ClipboardService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; -use function is_string; use function redirect; /** @@ -59,19 +57,14 @@ class SourcePage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $slug = Validator::attributes($request)->string('slug', ''); $record = Registry::sourceFactory()->make($xref, $tree); $record = Auth::checkSourceAccess($record, false); // Redirect to correct xref/slug - $slug = Registry::slugFactory()->make($record); - - if ($record->xref() !== $xref || $request->getAttribute('slug') !== $slug) { + if ($record->xref() !== $xref || Registry::slugFactory()->make($record) !== $slug) { return redirect($record->url(), StatusCodeInterface::STATUS_MOVED_PERMANENTLY); } diff --git a/app/Http/RequestHandlers/SubmissionPage.php b/app/Http/RequestHandlers/SubmissionPage.php index 3d90a651ea..146b4bff62 100644 --- a/app/Http/RequestHandlers/SubmissionPage.php +++ b/app/Http/RequestHandlers/SubmissionPage.php @@ -23,7 +23,7 @@ use Fig\Http\Message\StatusCodeInterface; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Support\Collection; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -47,19 +47,14 @@ class SubmissionPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $slug = Validator::attributes($request)->string('slug', ''); $record = Registry::submissionFactory()->make($xref, $tree); $record = Auth::checkSubmissionAccess($record, false); // Redirect to correct xref/slug - $slug = Registry::slugFactory()->make($record); - - if ($record->xref() !== $xref || $request->getAttribute('slug') !== $slug) { + if ($record->xref() !== $xref || Registry::slugFactory()->make($record) !== $slug) { return redirect($record->url(), StatusCodeInterface::STATUS_MOVED_PERMANENTLY); } diff --git a/app/Http/RequestHandlers/SubmitterPage.php b/app/Http/RequestHandlers/SubmitterPage.php index b778e93352..1287b4d758 100644 --- a/app/Http/RequestHandlers/SubmitterPage.php +++ b/app/Http/RequestHandlers/SubmitterPage.php @@ -23,14 +23,12 @@ use Fig\Http\Message\StatusCodeInterface; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Support\Collection; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; -use function is_string; use function redirect; /** @@ -47,19 +45,14 @@ class SubmitterPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $slug = Validator::attributes($request)->string('slug', ''); $record = Registry::submitterFactory()->make($xref, $tree); $record = Auth::checkSubmitterAccess($record, false); // Redirect to correct xref/slug - $slug = Registry::slugFactory()->make($record); - - if ($record->xref() !== $xref || $request->getAttribute('slug') !== $slug) { + if ($record->xref() !== $xref || Registry::slugFactory()->make($record) !== $slug) { return redirect($record->url(), StatusCodeInterface::STATUS_MOVED_PERMANENTLY); } diff --git a/app/Http/RequestHandlers/SynchronizeTrees.php b/app/Http/RequestHandlers/SynchronizeTrees.php index df22977b5c..bd1c2fd506 100644 --- a/app/Http/RequestHandlers/SynchronizeTrees.php +++ b/app/Http/RequestHandlers/SynchronizeTrees.php @@ -45,6 +45,8 @@ class SynchronizeTrees implements RequestHandlerInterface { private AdminService $admin_service; + private StreamFactoryInterface $stream_factory; + private TimeoutService $timeout_service; private TreeService $tree_service; @@ -53,15 +55,18 @@ class SynchronizeTrees implements RequestHandlerInterface * AdminTreesController constructor. * * @param AdminService $admin_service + * @param StreamFactoryInterface $stream_factory * @param TimeoutService $timeout_service * @param TreeService $tree_service */ public function __construct( AdminService $admin_service, + StreamFactoryInterface $stream_factory, TimeoutService $timeout_service, TreeService $tree_service ) { $this->admin_service = $admin_service; + $this->stream_factory = $stream_factory; $this->timeout_service = $timeout_service; $this->tree_service = $tree_service; } @@ -86,7 +91,7 @@ class SynchronizeTrees implements RequestHandlerInterface if ($tree->getPreference('filemtime') !== $filemtime) { $resource = $data_filesystem->readStream($gedcom_file); - $stream = app(StreamFactoryInterface::class)->createStreamFromResource($resource); + $stream = $this->stream_factory->createStreamFromResource($resource); $this->tree_service->importGedcomFile($tree, $stream, $gedcom_file, ''); $stream->close(); $tree->setPreference('filemtime', $filemtime); diff --git a/app/Http/RequestHandlers/TreePage.php b/app/Http/RequestHandlers/TreePage.php index ebcb5b81a2..59fac2bda8 100644 --- a/app/Http/RequestHandlers/TreePage.php +++ b/app/Http/RequestHandlers/TreePage.php @@ -19,11 +19,10 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\Module\ModuleBlockInterface; use Fisharebest\Webtrees\Services\HomePageService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Query\Builder; use Illuminate\Database\Query\Expression; @@ -31,7 +30,6 @@ use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function e; /** @@ -58,11 +56,8 @@ class TreePage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); - assert($user instanceof UserInterface); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); $has_blocks = DB::table('block') ->where('gedcom_id', '=', $tree->id()) diff --git a/app/Http/RequestHandlers/TreePageBlock.php b/app/Http/RequestHandlers/TreePageBlock.php index cf12db600a..56d190fcf4 100644 --- a/app/Http/RequestHandlers/TreePageBlock.php +++ b/app/Http/RequestHandlers/TreePageBlock.php @@ -21,13 +21,12 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Module\ModuleBlockInterface; use Fisharebest\Webtrees\Services\HomePageService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function response; use function view; @@ -53,9 +52,7 @@ class TreePageBlock implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - + $tree = Validator::attributes($request)->tree(); $block_id = $request->getQueryParams()['block_id']; $block_id = (int) DB::table('block') diff --git a/app/Http/RequestHandlers/TreePageBlockEdit.php b/app/Http/RequestHandlers/TreePageBlockEdit.php index 79cf8086eb..256b796210 100644 --- a/app/Http/RequestHandlers/TreePageBlockEdit.php +++ b/app/Http/RequestHandlers/TreePageBlockEdit.php @@ -22,12 +22,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\HomePageService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function route; /** @@ -54,17 +53,17 @@ class TreePageBlockEdit implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); + $block_id = Validator::attributes($request)->integer('block_id'); - $block_id = (int) $request->getQueryParams()['block_id']; - $block = $this->home_page_service->treeBlock($request); - $title = $block->title() . ' — ' . I18N::translate('Preferences'); + $block = $this->home_page_service->treeBlock($request); + $title = $block->title() . ' — ' . I18N::translate('Preferences'); return $this->viewResponse('modules/edit-block-config', [ 'block' => $block, 'block_id' => $block_id, 'cancel_url' => route(TreePage::class, ['tree' => $tree->name()]), + 'save_url' => route(TreePageBlockUpdate::class, ['tree' => $tree->name(), 'block_id' => $block_id]), 'title' => $title, 'tree' => $tree, ]); diff --git a/app/Http/RequestHandlers/TreePageBlockUpdate.php b/app/Http/RequestHandlers/TreePageBlockUpdate.php index 5973f8fda6..0839ddfdcc 100644 --- a/app/Http/RequestHandlers/TreePageBlockUpdate.php +++ b/app/Http/RequestHandlers/TreePageBlockUpdate.php @@ -20,12 +20,11 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Services\HomePageService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function redirect; use function route; @@ -51,11 +50,10 @@ class TreePageBlockUpdate implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); + $block_id = Validator::attributes($request)->integer('block_id'); - $block = $this->home_page_service->treeBlock($request); - $block_id = (int) $request->getQueryParams()['block_id']; + $block = $this->home_page_service->treeBlock($request); $block->saveBlockConfiguration($request, $block_id); diff --git a/app/Http/RequestHandlers/TreePageEdit.php b/app/Http/RequestHandlers/TreePageEdit.php index 5bfd2ef106..8fd3d0d58b 100644 --- a/app/Http/RequestHandlers/TreePageEdit.php +++ b/app/Http/RequestHandlers/TreePageEdit.php @@ -19,17 +19,15 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Module\ModuleBlockInterface; use Fisharebest\Webtrees\Services\HomePageService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function route; /** @@ -56,11 +54,8 @@ class TreePageEdit implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); - assert($user instanceof UserInterface); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); $main_blocks = $this->home_page_service->treeBlocks($tree, $user, ModuleBlockInterface::MAIN_BLOCKS); $side_blocks = $this->home_page_service->treeBlocks($tree, $user, ModuleBlockInterface::SIDE_BLOCKS); diff --git a/app/Http/RequestHandlers/TreePageUpdate.php b/app/Http/RequestHandlers/TreePageUpdate.php index 1717c9ec3a..03ef0c8c1c 100644 --- a/app/Http/RequestHandlers/TreePageUpdate.php +++ b/app/Http/RequestHandlers/TreePageUpdate.php @@ -19,16 +19,15 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Module\ModuleBlockInterface; use Fisharebest\Webtrees\Services\HomePageService; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Support\Collection; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function redirect; use function route; @@ -54,11 +53,8 @@ class TreePageUpdate implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); - assert($user instanceof UserInterface); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); $params = (array) $request->getParsedBody(); diff --git a/app/Http/RequestHandlers/TreePreferencesAction.php b/app/Http/RequestHandlers/TreePreferencesAction.php index ff2d2fc662..7ba0237a2d 100644 --- a/app/Http/RequestHandlers/TreePreferencesAction.php +++ b/app/Http/RequestHandlers/TreePreferencesAction.php @@ -22,7 +22,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\I18N; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use PDOException; use Psr\Http\Message\ResponseInterface; @@ -30,7 +30,6 @@ use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; use function array_unique; -use function assert; use function e; use function implode; use function preg_replace; @@ -50,9 +49,7 @@ class TreePreferencesAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - + $tree = Validator::attributes($request)->tree(); $params = (array) $request->getParsedBody(); // For backwards compatibility with webtrees 1.x we store the two calendar formats in one variable diff --git a/app/Http/RequestHandlers/TreePreferencesPage.php b/app/Http/RequestHandlers/TreePreferencesPage.php index 7448a87e78..1a9fb0226f 100644 --- a/app/Http/RequestHandlers/TreePreferencesPage.php +++ b/app/Http/RequestHandlers/TreePreferencesPage.php @@ -32,14 +32,13 @@ use Fisharebest\Webtrees\Services\ModuleService; use Fisharebest\Webtrees\Services\TreeService; use Fisharebest\Webtrees\Services\UserService; use Fisharebest\Webtrees\SurnameTradition; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Support\Collection; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; use function app; -use function assert; use function e; use function explode; use function in_array; @@ -76,9 +75,7 @@ class TreePreferencesPage implements RequestHandlerInterface { $this->layout = 'layouts/administration'; - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - + $tree = Validator::attributes($request)->tree(); $data_folder = Registry::filesystem()->dataName(); $french_calendar_start = new Date('22 SEP 1792'); @@ -161,7 +158,7 @@ class TreePreferencesPage implements RequestHandlerInterface $title = I18N::translate('Preferences') . ' — ' . e($tree->title()); - $base_url = app(ServerRequestInterface::class)->getAttribute('base_url'); + $base_url = Validator::attributes($request)->string('base_url'); return $this->viewResponse('admin/trees-preferences', [ 'all_family_facts' => $all_family_facts, diff --git a/app/Http/RequestHandlers/TreePrivacyAction.php b/app/Http/RequestHandlers/TreePrivacyAction.php index 680e26e154..2d599497d1 100644 --- a/app/Http/RequestHandlers/TreePrivacyAction.php +++ b/app/Http/RequestHandlers/TreePrivacyAction.php @@ -21,13 +21,12 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\I18N; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function e; use function redirect; use function route; @@ -44,9 +43,7 @@ class TreePrivacyAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - + $tree = Validator::attributes($request)->tree(); $params = (array) $request->getParsedBody(); $delete_default_resn_id = $params['delete'] ?? []; diff --git a/app/Http/RequestHandlers/TreePrivacyPage.php b/app/Http/RequestHandlers/TreePrivacyPage.php index 5c514bfcaa..6867d0f4dc 100644 --- a/app/Http/RequestHandlers/TreePrivacyPage.php +++ b/app/Http/RequestHandlers/TreePrivacyPage.php @@ -27,13 +27,13 @@ use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\TreeService; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; use function array_merge; -use function assert; use function e; use function in_array; use function uasort; @@ -61,9 +61,7 @@ class TreePrivacyPage implements RequestHandlerInterface { $this->layout = 'layouts/administration'; - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - + $tree = Validator::attributes($request)->tree(); $title = e($tree->name()) . ' — ' . I18N::translate('Privacy'); $all_tags = $this->tagsForPrivacy(); $privacy_constants = $this->privacyConstants(); diff --git a/app/Http/RequestHandlers/UnconnectedAction.php b/app/Http/RequestHandlers/UnconnectedAction.php index 762e9c574c..fef5e37a33 100644 --- a/app/Http/RequestHandlers/UnconnectedAction.php +++ b/app/Http/RequestHandlers/UnconnectedAction.php @@ -19,13 +19,11 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; - /** * Find groups of unrelated individuals. */ @@ -40,8 +38,7 @@ class UnconnectedAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $params = (array) $request->getParsedBody(); diff --git a/app/Http/RequestHandlers/UnconnectedPage.php b/app/Http/RequestHandlers/UnconnectedPage.php index 15832fc198..26b680c71d 100644 --- a/app/Http/RequestHandlers/UnconnectedPage.php +++ b/app/Http/RequestHandlers/UnconnectedPage.php @@ -24,14 +24,12 @@ use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; -use Fisharebest\Webtrees\User; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function strtolower; /** @@ -48,12 +46,8 @@ class UnconnectedPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); - assert($user instanceof User); - + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); $aliases = (bool) ($request->getQueryParams()['aliases'] ?? false); $associates = (bool) ($request->getQueryParams()['associates'] ?? false); diff --git a/app/Http/RequestHandlers/UserEditAction.php b/app/Http/RequestHandlers/UserEditAction.php index 10792e6483..2341fbe981 100644 --- a/app/Http/RequestHandlers/UserEditAction.php +++ b/app/Http/RequestHandlers/UserEditAction.php @@ -29,6 +29,7 @@ use Fisharebest\Webtrees\Services\TreeService; use Fisharebest\Webtrees\Services\UserService; use Fisharebest\Webtrees\SiteUser; use Fisharebest\Webtrees\User; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -70,7 +71,7 @@ class UserEditAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $user = $request->getAttribute('user'); + $user = Validator::attributes($request)->user(); $params = (array) $request->getParsedBody(); @@ -100,7 +101,7 @@ class UserEditAction implements RequestHandlerInterface if ($approved && $edit_user->getPreference(UserInterface::PREF_IS_ACCOUNT_APPROVED) !== '1') { I18N::init($edit_user->getPreference(UserInterface::PREF_LANGUAGE)); - $base_url = $request->getAttribute('base_url'); + $base_url = Validator::attributes($request)->string('base_url'); $this->email_service->send( new SiteUser(), diff --git a/app/Http/RequestHandlers/UserListData.php b/app/Http/RequestHandlers/UserListData.php index a4a3691dc1..ec1307630e 100644 --- a/app/Http/RequestHandlers/UserListData.php +++ b/app/Http/RequestHandlers/UserListData.php @@ -26,6 +26,7 @@ use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\DatatablesService; use Fisharebest\Webtrees\Services\ModuleService; use Fisharebest\Webtrees\Services\UserService; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Query\JoinClause; use Psr\Http\Message\ResponseInterface; @@ -69,7 +70,7 @@ class UserListData implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $user = $request->getAttribute('user'); + $user = Validator::attributes($request)->user(); $languages = $this->module_service->findByInterface(ModuleLanguageInterface::class, true) ->mapWithKeys(static function (ModuleLanguageInterface $module): array { diff --git a/app/Http/RequestHandlers/UserListPage.php b/app/Http/RequestHandlers/UserListPage.php index 5868b3bf32..caa28c9230 100644 --- a/app/Http/RequestHandlers/UserListPage.php +++ b/app/Http/RequestHandlers/UserListPage.php @@ -21,6 +21,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -41,7 +42,7 @@ class UserListPage implements RequestHandlerInterface { $this->layout = 'layouts/administration'; - $user = $request->getAttribute('user'); + $user = Validator::attributes($request)->user(); $params = $request->getQueryParams(); $filter = $params['filter'] ?? ''; diff --git a/app/Http/RequestHandlers/UserPage.php b/app/Http/RequestHandlers/UserPage.php index 45ba45323d..b82eebe31b 100644 --- a/app/Http/RequestHandlers/UserPage.php +++ b/app/Http/RequestHandlers/UserPage.php @@ -19,12 +19,11 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Module\ModuleBlockInterface; use Fisharebest\Webtrees\Services\HomePageService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Query\Builder; use Illuminate\Database\Query\Expression; @@ -32,8 +31,6 @@ use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; - /** * Show a user's page. */ @@ -58,11 +55,8 @@ class UserPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); - assert($user instanceof UserInterface); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); $has_blocks = DB::table('block') ->where('user_id', '=', $user->id()) diff --git a/app/Http/RequestHandlers/UserPageBlock.php b/app/Http/RequestHandlers/UserPageBlock.php index 5ee708e1cb..ad3fa9cbf5 100644 --- a/app/Http/RequestHandlers/UserPageBlock.php +++ b/app/Http/RequestHandlers/UserPageBlock.php @@ -21,13 +21,12 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Module\ModuleBlockInterface; use Fisharebest\Webtrees\Services\HomePageService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function response; use function view; @@ -54,10 +53,8 @@ class UserPageBlock implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); $block_id = $request->getQueryParams()['block_id']; $block_id = (int) DB::table('block') diff --git a/app/Http/RequestHandlers/UserPageBlockEdit.php b/app/Http/RequestHandlers/UserPageBlockEdit.php index 4cb6712e54..d526bd7c82 100644 --- a/app/Http/RequestHandlers/UserPageBlockEdit.php +++ b/app/Http/RequestHandlers/UserPageBlockEdit.php @@ -22,12 +22,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\HomePageService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function route; /** @@ -54,18 +53,18 @@ class UserPageBlockEdit implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); + $block_id = Validator::attributes($request)->integer('block_id'); - $user = $request->getAttribute('user'); - $block_id = (int) $request->getQueryParams()['block_id']; - $block = $this->home_page_service->userBlock($request, $user); - $title = $block->title() . ' — ' . I18N::translate('Preferences'); + $block = $this->home_page_service->userBlock($request, $user); + $title = $block->title() . ' — ' . I18N::translate('Preferences'); return $this->viewResponse('modules/edit-block-config', [ 'block' => $block, 'block_id' => $block_id, 'cancel_url' => route(UserPage::class, ['tree' => $tree->name()]), + 'save_url' => route(UserPageBlockUpdate::class, ['tree' => $tree->name(), 'block_id' => $block_id]), 'title' => $title, 'tree' => $tree, ]); diff --git a/app/Http/RequestHandlers/UserPageBlockUpdate.php b/app/Http/RequestHandlers/UserPageBlockUpdate.php index 8c42280a08..8878cb10f3 100644 --- a/app/Http/RequestHandlers/UserPageBlockUpdate.php +++ b/app/Http/RequestHandlers/UserPageBlockUpdate.php @@ -20,12 +20,11 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Services\HomePageService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function redirect; use function route; @@ -51,13 +50,11 @@ class UserPageBlockUpdate implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); - $block = $this->home_page_service->userBlock($request, $user); - $block_id = (int) $request->getQueryParams()['block_id']; + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); + $block_id = Validator::attributes($request)->integer('block_id'); + $block = $this->home_page_service->userBlock($request, $user); $block->saveBlockConfiguration($request, $block_id); return redirect(route(UserPage::class, ['tree' => $tree->name()])); diff --git a/app/Http/RequestHandlers/UserPageEdit.php b/app/Http/RequestHandlers/UserPageEdit.php index f7378c16ae..bf468cb82d 100644 --- a/app/Http/RequestHandlers/UserPageEdit.php +++ b/app/Http/RequestHandlers/UserPageEdit.php @@ -19,17 +19,15 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Module\ModuleBlockInterface; use Fisharebest\Webtrees\Services\HomePageService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function route; /** @@ -56,13 +54,8 @@ class UserPageEdit implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); - assert($user instanceof UserInterface); - - $user = $request->getAttribute('user'); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); $main_blocks = $this->home_page_service->userBlocks($tree, $user, ModuleBlockInterface::MAIN_BLOCKS); $side_blocks = $this->home_page_service->userBlocks($tree, $user, ModuleBlockInterface::SIDE_BLOCKS); $all_blocks = $this->home_page_service->availableUserBlocks($tree, $user); diff --git a/app/Http/RequestHandlers/UserPageUpdate.php b/app/Http/RequestHandlers/UserPageUpdate.php index 73b30a2ab7..815d4fb1a8 100644 --- a/app/Http/RequestHandlers/UserPageUpdate.php +++ b/app/Http/RequestHandlers/UserPageUpdate.php @@ -19,16 +19,15 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Module\ModuleBlockInterface; use Fisharebest\Webtrees\Services\HomePageService; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Support\Collection; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use function assert; use function redirect; use function route; @@ -54,11 +53,8 @@ class UserPageUpdate implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); - assert($user instanceof UserInterface); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); $params = (array) $request->getParsedBody(); $defaults = (bool) ($params['defaults'] ?? false); diff --git a/app/Http/RequestHandlers/VerifyEmail.php b/app/Http/RequestHandlers/VerifyEmail.php index f0a9900078..0257842ad1 100644 --- a/app/Http/RequestHandlers/VerifyEmail.php +++ b/app/Http/RequestHandlers/VerifyEmail.php @@ -28,6 +28,7 @@ use Fisharebest\Webtrees\Services\EmailService; use Fisharebest\Webtrees\Services\UserService; use Fisharebest\Webtrees\SiteUser; use Fisharebest\Webtrees\User; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -66,7 +67,7 @@ class VerifyEmail implements RequestHandlerInterface public function handle(ServerRequestInterface $request): ResponseInterface { $token = $request->getAttribute('token'); - $tree = $request->getAttribute('tree'); + $tree = Validator::attributes($request)->treeOptional(); $username = $request->getAttribute('username'); $title = I18N::translate('User verification'); @@ -80,7 +81,7 @@ class VerifyEmail implements RequestHandlerInterface // switch language to administrator settings I18N::init($administrator->getPreference(UserInterface::PREF_LANGUAGE)); - $base_url = $request->getAttribute('base_url'); + $base_url = Validator::attributes($request)->string('base_url'); /* I18N: %s is a server name/URL */ $subject = I18N::translate('New user at %s', $base_url); diff --git a/app/Http/Routes/WebRoutes.php b/app/Http/Routes/WebRoutes.php index 86d45cd8d4..3e3033ff55 100644 --- a/app/Http/Routes/WebRoutes.php +++ b/app/Http/Routes/WebRoutes.php @@ -505,8 +505,8 @@ class WebRoutes $router->get(TreePageEdit::class, '/tree-page-edit'); $router->post(GedcomLoad::class, '/load'); $router->post(TreePageUpdate::class, '/tree-page-update'); - $router->get(TreePageBlockEdit::class, '/tree-page-block-edit'); - $router->post(TreePageBlockUpdate::class, '/tree-page-block-edit'); + $router->get(TreePageBlockEdit::class, '/tree-page-block-edit/{block_id}'); + $router->post(TreePageBlockUpdate::class, '/tree-page-block-update/{block_id}'); $router->get(TreePrivacyPage::class, '/privacy'); $router->post(TreePrivacyAction::class, '/privacy'); $router->get(UnconnectedPage::class, '/unconnected'); @@ -624,8 +624,8 @@ class WebRoutes $router->get(UserPageBlock::class, '/my-page-block'); $router->get(UserPageEdit::class, '/my-page-edit'); $router->post(UserPageUpdate::class, '/my-page-edit'); - $router->get(UserPageBlockEdit::class, '/my-page-block-edit'); - $router->post(UserPageBlockUpdate::class, '/my-page-block-edit'); + $router->get(UserPageBlockEdit::class, '/my-page-block-edit/{block_id}'); + $router->post(UserPageBlockUpdate::class, '/my-page-block-edit/{block_id}'); }); // User routes without a tree. diff --git a/app/Log.php b/app/Log.php index bcf4cef50b..4da3c8dde5 100644 --- a/app/Log.php +++ b/app/Log.php @@ -59,8 +59,10 @@ class Log private static function addLog(string $message, string $log_type, Tree $tree = null): void { if (app()->has(ServerRequestInterface::class)) { - $request = app(ServerRequestInterface::class); - $ip_address = $request->getAttribute('client-ip'); + $request = app(ServerRequestInterface::class); + assert($request instanceof ServerRequestInterface); + + $ip_address = Validator::attributes($request)->string('client-ip'); } else { $ip_address = '127.0.0.1'; } diff --git a/app/Module/AncestorsChartModule.php b/app/Module/AncestorsChartModule.php index 2954f38fc1..facbd0c9d2 100644 --- a/app/Module/AncestorsChartModule.php +++ b/app/Module/AncestorsChartModule.php @@ -22,21 +22,18 @@ namespace Fisharebest\Webtrees\Module; use Aura\Router\RouterContainer; use Fig\Http\Message\RequestMethodInterface; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Menu; +use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\ChartService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; use function app; use function assert; -use function is_string; -use function max; -use function min; use function route; /** @@ -53,6 +50,12 @@ class AncestorsChartModule extends AbstractModule implements ModuleChartInterfac public const CHART_STYLE_INDIVIDUALS = 'individuals'; public const CHART_STYLE_FAMILIES = 'families'; + private const CHART_STYLES = [ + self::CHART_STYLE_TREE, + self::CHART_STYLE_INDIVIDUALS, + self::CHART_STYLE_FAMILIES, + ]; + // Defaults protected const DEFAULT_GENERATIONS = '4'; protected const DEFAULT_STYLE = self::CHART_STYLE_TREE; @@ -176,39 +179,29 @@ class AncestorsChartModule extends AbstractModule implements ModuleChartInterfac */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - - $individual = Registry::individualFactory()->make($xref, $tree); - $individual = Auth::checkIndividualAccess($individual, false, true); - - $ajax = $request->getQueryParams()['ajax'] ?? ''; - $generations = (int) $request->getAttribute('generations'); - $style = $request->getAttribute('style'); - $user = $request->getAttribute('user'); - - Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user); - + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); + $style = Validator::attributes($request)->isInArray(self::CHART_STYLES)->string('style'); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $generations = Validator::attributes($request)->isBetween(self::MINIMUM_GENERATIONS, self::MAXIMUM_GENERATIONS)->integer('generations'); + $ajax = Validator::queryParams($request)->boolean('ajax', false); // Convert POST requests into GET requests for pretty URLs. if ($request->getMethod() === RequestMethodInterface::METHOD_POST) { - $params = (array) $request->getParsedBody(); - return redirect(route(static::class, [ 'tree' => $tree->name(), - 'xref' => $params['xref'], - 'style' => $params['style'], - 'generations' => $params['generations'], + 'xref' => Validator::parsedBody($request)->string('xref', ''), + 'style' => Validator::parsedBody($request)->string('style', ''), + 'generations' => Validator::parsedBody($request)->string('generations', ''), ])); } - $generations = min($generations, self::MAXIMUM_GENERATIONS); - $generations = max($generations, self::MINIMUM_GENERATIONS); + Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user); + + $individual = Registry::individualFactory()->make($xref, $tree); + $individual = Auth::checkIndividualAccess($individual, false, true); - if ($ajax === '1') { + if ($ajax) { $this->layout = 'layouts/ajax'; $ancestors = $this->chart_service->sosaStradonitzAncestors($individual, $generations); diff --git a/app/Module/BranchesListModule.php b/app/Module/BranchesListModule.php index 588dc301d8..e6f822de9c 100644 --- a/app/Module/BranchesListModule.php +++ b/app/Module/BranchesListModule.php @@ -31,6 +31,7 @@ use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\ModuleService; use Fisharebest\Webtrees\Soundex; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Query\Builder; use Illuminate\Database\Query\JoinClause; @@ -132,7 +133,10 @@ class BranchesListModule extends AbstractModule implements ModuleListInterface, */ public function listUrl(Tree $tree, array $parameters = []): string { - $xref = app(ServerRequestInterface::class)->getAttribute('xref', ''); + $request = app(ServerRequestInterface::class); + assert($request instanceof ServerRequestInterface); + + $xref = Validator::attributes($request)->isXref()->string('xref', ''); if ($xref !== '') { $individual = Registry::individualFactory()->make($xref, $tree); @@ -164,7 +168,9 @@ class BranchesListModule extends AbstractModule implements ModuleListInterface, */ public function getPageAction(ServerRequestInterface $request): ResponseInterface { - return redirect($this->listUrl($request->getAttribute('tree'), $request->getQueryParams())); + $tree = Validator::attributes($request)->tree(); + + return redirect($this->listUrl($tree, $request->getQueryParams())); } /** @@ -174,11 +180,8 @@ class BranchesListModule extends AbstractModule implements ModuleListInterface, */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); - assert($user instanceof UserInterface); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user); @@ -190,11 +193,11 @@ class BranchesListModule extends AbstractModule implements ModuleListInterface, $surname = (string) $request->getAttribute('surname'); $params = $request->getQueryParams(); - $ajax = $params['ajax'] ?? ''; + $ajax = Validator::queryParams($request)->boolean('ajax', false); $soundex_std = (bool) ($params['soundex_std'] ?? false); $soundex_dm = (bool) ($params['soundex_dm'] ?? false); - if ($ajax === '1') { + if ($ajax) { $this->layout = 'layouts/ajax'; // Highlight direct-line ancestors of this individual. diff --git a/app/Module/CensusAssistantModule.php b/app/Module/CensusAssistantModule.php index d0384b12e9..d0b24e4b46 100644 --- a/app/Module/CensusAssistantModule.php +++ b/app/Module/CensusAssistantModule.php @@ -23,12 +23,11 @@ use Fisharebest\Webtrees\Census\CensusInterface; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use function array_keys; -use function assert; use function count; use function e; use function response; @@ -86,8 +85,7 @@ class CensusAssistantModule extends AbstractModule */ public function postCensusIndividualAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $params = (array) $request->getParsedBody(); $individual = Registry::individualFactory()->make($params['xref'], $tree); diff --git a/app/Module/ChartsMenuModule.php b/app/Module/ChartsMenuModule.php index 6343102abc..03780f91ce 100644 --- a/app/Module/ChartsMenuModule.php +++ b/app/Module/ChartsMenuModule.php @@ -24,6 +24,7 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Menu; use Fisharebest\Webtrees\Services\ModuleService; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ServerRequestInterface; /** @@ -86,8 +87,10 @@ class ChartsMenuModule extends AbstractModule implements ModuleMenuInterface */ public function getMenu(Tree $tree): ?Menu { - $request = app(ServerRequestInterface::class); - $xref = $request->getAttribute('xref', ''); + $request = app(ServerRequestInterface::class); + assert($request instanceof ServerRequestInterface); + + $xref = Validator::attributes($request)->isXref()->string('xref', ''); $individual = $tree->significantIndividual(Auth::user(), $xref); $submenus = $this->module_service->findByComponent(ModuleChartInterface::class, $tree, Auth::user()) ->map(static function (ModuleChartInterface $module) use ($individual): Menu { diff --git a/app/Module/ClippingsCartModule.php b/app/Module/ClippingsCartModule.php index 4c05b16373..c860d03950 100644 --- a/app/Module/ClippingsCartModule.php +++ b/app/Module/ClippingsCartModule.php @@ -167,12 +167,10 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function getMenu(Tree $tree): ?Menu { - /** @var ServerRequestInterface $request */ $request = app(ServerRequestInterface::class); + assert($request instanceof ServerRequestInterface); - $route = $request->getAttribute('route'); - assert($route instanceof Route); - + $route = Validator::attributes($request)->route(); $cart = Session::get('cart'); $cart = is_array($cart) ? $cart : []; $count = count($cart[$tree->name()] ?? []); @@ -250,8 +248,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function getDownloadFormAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $title = I18N::translate('Family tree clippings cart') . ' — ' . I18N::translate('Download'); @@ -270,15 +267,14 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function postDownloadAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $data_filesystem = Registry::filesystem()->data(); - $format = Validator::parsedBody($request)->isInArray(['gedcom', 'zip'])->requiredString('format'); - $privacy = Validator::parsedBody($request)->isInArray(['none', 'gedadmin', 'user', 'visitor'])->requiredString('privacy'); - $encoding = Validator::parsedBody($request)->isInArray([UTF8::NAME, UTF16BE::NAME, ANSEL::NAME, ASCII::NAME, Windows1252::NAME])->requiredString('encoding'); - $line_endings = Validator::parsedBody($request)->isInArray(['CRLF', 'LF'])->requiredString('line_endings'); + $format = Validator::parsedBody($request)->isInArray(['gedcom', 'zip'])->string('format'); + $privacy = Validator::parsedBody($request)->isInArray(['none', 'gedadmin', 'user', 'visitor'])->string('privacy'); + $encoding = Validator::parsedBody($request)->isInArray([UTF8::NAME, UTF16BE::NAME, ANSEL::NAME, ASCII::NAME, Windows1252::NAME])->string('encoding'); + $line_endings = Validator::parsedBody($request)->isInArray(['CRLF', 'LF'])->string('line_endings'); if ($privacy === 'none' && !Auth::isManager($tree)) { $privacy = 'member'; @@ -399,8 +395,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function getEmptyAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $cart = Session::get('cart'); $cart = is_array($cart) ? $cart : []; @@ -424,8 +419,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function postRemoveAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $xref = $request->getQueryParams()['xref'] ?? ''; @@ -451,8 +445,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function getShowAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); return $this->viewResponse('modules/clippings/show', [ 'module' => $this->name(), @@ -500,8 +493,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function getAddFamilyAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $xref = $request->getQueryParams()['xref'] ?? ''; @@ -534,8 +526,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function postAddFamilyAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $params = (array) $request->getParsedBody(); @@ -600,8 +591,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function getAddIndividualAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $xref = $request->getQueryParams()['xref'] ?? ''; @@ -646,8 +636,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function postAddIndividualAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $params = (array) $request->getParsedBody(); @@ -733,8 +722,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function getAddLocationAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $xref = $request->getQueryParams()['xref'] ?? ''; @@ -763,8 +751,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function postAddLocationAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $xref = $request->getQueryParams()['xref'] ?? ''; @@ -783,8 +770,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function getAddMediaAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $xref = $request->getQueryParams()['xref'] ?? ''; @@ -813,8 +799,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function postAddMediaAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $xref = $request->getQueryParams()['xref'] ?? ''; @@ -833,8 +818,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function getAddNoteAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $xref = $request->getQueryParams()['xref'] ?? ''; @@ -863,8 +847,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function postAddNoteAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $xref = $request->getQueryParams()['xref'] ?? ''; @@ -883,8 +866,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function getAddRepositoryAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $xref = $request->getQueryParams()['xref'] ?? ''; @@ -913,8 +895,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function postAddRepositoryAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $xref = $request->getQueryParams()['xref'] ?? ''; @@ -937,8 +918,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function getAddSourceAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $xref = $request->getQueryParams()['xref'] ?? ''; @@ -968,8 +948,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function postAddSourceAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $params = (array) $request->getParsedBody(); @@ -1000,8 +979,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function getAddSubmitterAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $xref = $request->getQueryParams()['xref'] ?? ''; @@ -1030,8 +1008,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function postAddSubmitterAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $xref = $request->getQueryParams()['xref'] ?? ''; diff --git a/app/Module/ColorsTheme.php b/app/Module/ColorsTheme.php index 315c7f8a12..c71c54bc56 100644 --- a/app/Module/ColorsTheme.php +++ b/app/Module/ColorsTheme.php @@ -20,12 +20,12 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Menu; use Fisharebest\Webtrees\Session; use Fisharebest\Webtrees\Site; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -83,8 +83,7 @@ class ColorsTheme extends CloudsTheme */ public function postPaletteAction(ServerRequestInterface $request): ResponseInterface { - $user = $request->getAttribute('user'); - assert($user instanceof UserInterface); + $user = Validator::attributes($request)->user(); $palette = $request->getQueryParams()['palette']; assert(array_key_exists($palette, $this->palettes())); diff --git a/app/Module/CompactTreeChartModule.php b/app/Module/CompactTreeChartModule.php index c6dd1b1cad..5772f2b865 100644 --- a/app/Module/CompactTreeChartModule.php +++ b/app/Module/CompactTreeChartModule.php @@ -22,19 +22,18 @@ namespace Fisharebest\Webtrees\Module; use Aura\Router\RouterContainer; use Fig\Http\Message\RequestMethodInterface; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Menu; +use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\ChartService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; use function app; use function assert; -use function is_string; use function route; /** @@ -153,31 +152,25 @@ class CompactTreeChartModule extends AbstractModule implements ModuleChartInterf */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - - $individual = Registry::individualFactory()->make($xref, $tree); - $individual = Auth::checkIndividualAccess($individual, false, true); - - $user = $request->getAttribute('user'); - $ajax = $request->getQueryParams()['ajax'] ?? ''; + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $ajax = Validator::queryParams($request)->boolean('ajax', false); // Convert POST requests into GET requests for pretty URLs. if ($request->getMethod() === RequestMethodInterface::METHOD_POST) { - $params = (array) $request->getParsedBody(); - return redirect(route(static::class, [ 'tree' => $tree->name(), - 'xref' => $params['xref'], + 'xref' => Validator::parsedBody($request)->string('xref', ''), ])); } Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user); - if ($ajax === '1') { + $individual = Registry::individualFactory()->make($xref, $tree); + $individual = Auth::checkIndividualAccess($individual, false, true); + + if ($ajax) { $this->layout = 'layouts/ajax'; return $this->viewResponse('modules/compact-chart/chart', [ diff --git a/app/Module/ContactsFooterModule.php b/app/Module/ContactsFooterModule.php index 1fff5ff0f8..d5e0d3aedf 100644 --- a/app/Module/ContactsFooterModule.php +++ b/app/Module/ContactsFooterModule.php @@ -22,6 +22,7 @@ namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\UserService; use Fisharebest\Webtrees\User; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ServerRequestInterface; /** @@ -84,7 +85,7 @@ class ContactsFooterModule extends AbstractModule implements ModuleFooterInterfa */ public function getFooter(ServerRequestInterface $request): string { - $tree = $request->getAttribute('tree'); + $tree = Validator::attributes($request)->treeOptional(); if ($tree === null) { return ''; diff --git a/app/Module/DescendancyChartModule.php b/app/Module/DescendancyChartModule.php index 7f975bd6d9..07b1d44320 100644 --- a/app/Module/DescendancyChartModule.php +++ b/app/Module/DescendancyChartModule.php @@ -27,14 +27,13 @@ use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Menu; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\ChartService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; use function app; use function assert; -use function is_string; use function max; use function min; use function route; @@ -176,38 +175,29 @@ class DescendancyChartModule extends AbstractModule implements ModuleChartInterf */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - - $individual = Registry::individualFactory()->make($xref, $tree); - $individual = Auth::checkIndividualAccess($individual, false, true); - - $user = $request->getAttribute('user'); - $style = $request->getAttribute('style'); - $generations = (int) $request->getAttribute('generations'); - $ajax = $request->getQueryParams()['ajax'] ?? ''; + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $style = Validator::attributes($request)->string('style'); + $generations = Validator::attributes($request)->isBetween(self::MINIMUM_GENERATIONS, self::MAXIMUM_GENERATIONS)->integer('generations'); + $ajax = Validator::queryParams($request)->boolean('style', false); // Convert POST requests into GET requests for pretty URLs. if ($request->getMethod() === RequestMethodInterface::METHOD_POST) { - $params = (array) $request->getParsedBody(); - return redirect(route(static::class, [ 'tree' => $tree->name(), - 'xref' => $params['xref'], - 'style' => $params['style'], - 'generations' => $params['generations'], + 'generations' => Validator::parsedBody($request)->string('generations', ''), + 'style' => Validator::parsedBody($request)->string('style', ''), + 'xref' => Validator::parsedBody($request)->string('xref', ''), ])); } Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user); - $generations = min($generations, self::MAXIMUM_GENERATIONS); - $generations = max($generations, self::MINIMUM_GENERATIONS); + $individual = Registry::individualFactory()->make($xref, $tree); + $individual = Auth::checkIndividualAccess($individual, false, true); - if ($ajax === '1') { + if ($ajax) { $this->layout = 'layouts/ajax'; switch ($style) { diff --git a/app/Module/DescendancyModule.php b/app/Module/DescendancyModule.php index 848a3d601d..281af1520b 100644 --- a/app/Module/DescendancyModule.php +++ b/app/Module/DescendancyModule.php @@ -24,11 +24,10 @@ use Fisharebest\Webtrees\Family; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Services\SearchService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; -use function assert; use function view; /** @@ -89,9 +88,7 @@ class DescendancyModule extends AbstractModule implements ModuleSidebarInterface */ public function getSearchAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - + $tree = Validator::attributes($request)->tree(); $search = $request->getQueryParams()['search']; $html = ''; @@ -119,9 +116,7 @@ class DescendancyModule extends AbstractModule implements ModuleSidebarInterface */ public function getDescendantsAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - + $tree = Validator::attributes($request)->tree(); $xref = $request->getQueryParams()['xref'] ?? ''; $individual = Registry::individualFactory()->make($xref, $tree); diff --git a/app/Module/FamilyBookChartModule.php b/app/Module/FamilyBookChartModule.php index 8de562b6e4..aa7ba2d7d3 100644 --- a/app/Module/FamilyBookChartModule.php +++ b/app/Module/FamilyBookChartModule.php @@ -26,16 +26,13 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Menu; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; use function app; use function assert; -use function is_string; -use function max; -use function min; use function route; /** @@ -50,7 +47,6 @@ class FamilyBookChartModule extends AbstractModule implements ModuleChartInterfa // Defaults public const DEFAULT_GENERATIONS = '2'; public const DEFAULT_DESCENDANT_GENERATIONS = '5'; - public const DEFAULT_MAXIMUM_GENERATIONS = '9'; protected const DEFAULT_PARAMETERS = [ 'book_size' => self::DEFAULT_GENERATIONS, 'generations' => self::DEFAULT_DESCENDANT_GENERATIONS, @@ -58,6 +54,9 @@ class FamilyBookChartModule extends AbstractModule implements ModuleChartInterfa ]; // Limits + protected const MINIMUM_BOOK_SIZE = 2; + protected const MAXIMUM_BOOK_SIZE = 5; + protected const MINIMUM_GENERATIONS = 2; protected const MAXIMUM_GENERATIONS = 10; @@ -161,44 +160,31 @@ class FamilyBookChartModule extends AbstractModule implements ModuleChartInterfa */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - - $individual = Registry::individualFactory()->make($xref, $tree); - $individual = Auth::checkIndividualAccess($individual, false, true); - - $user = $request->getAttribute('user'); - $book_size = (int) $request->getAttribute('book_size'); - $generations = (int) $request->getAttribute('generations'); - $spouses = (bool) $request->getAttribute('spouses'); - $ajax = $request->getQueryParams()['ajax'] ?? ''; + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $book_size = Validator::attributes($request)->isBetween(self::MINIMUM_BOOK_SIZE, self::MAXIMUM_BOOK_SIZE)->integer('book_size'); + $generations = Validator::attributes($request)->isBetween(self::MINIMUM_GENERATIONS, self::MAXIMUM_GENERATIONS)->integer('generations'); + $spouses = Validator::attributes($request)->boolean('spouses'); + $ajax = Validator::queryParams($request)->boolean('ajax', false); // Convert POST requests into GET requests for pretty URLs. if ($request->getMethod() === RequestMethodInterface::METHOD_POST) { - $params = (array) $request->getParsedBody(); - return redirect(route(static::class, [ 'tree' => $tree->name(), - 'xref' => $params['xref'], - 'book_size' => $params['book_size'], - 'generations' => $params['generations'], - 'spouses' => $params['spouses'] ?? false, + 'xref' => Validator::parsedBody($request)->string('xref', ''), + 'book_size' => Validator::parsedBody($request)->string('book_size', ''), + 'generations' => Validator::parsedBody($request)->string('generations', ''), + 'spouses' => Validator::parsedBody($request)->string('spouses', ''), ])); } Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user); - $generations = min($generations, self::MAXIMUM_GENERATIONS); - $generations = max($generations, self::MINIMUM_GENERATIONS); - - // Generations of ancestors/descendants in each mini-tree. - $book_size = min($book_size, 5); - $book_size = max($book_size, 2); + $individual = Registry::individualFactory()->make($xref, $tree); + $individual = Auth::checkIndividualAccess($individual, false, true); - if ($ajax === '1') { + if ($ajax) { $this->layout = 'layouts/ajax'; return $this->viewResponse('modules/family-book-chart/chart', [ @@ -221,6 +207,8 @@ class FamilyBookChartModule extends AbstractModule implements ModuleChartInterfa 'book_size' => $book_size, 'generations' => $generations, 'individual' => $individual, + 'maximum_book_size' => self::MAXIMUM_BOOK_SIZE, + 'minimum_book_size' => self::MINIMUM_BOOK_SIZE, 'maximum_generations' => self::MAXIMUM_GENERATIONS, 'minimum_generations' => self::MINIMUM_GENERATIONS, 'module' => $this->name(), diff --git a/app/Module/FamilyListModule.php b/app/Module/FamilyListModule.php index 5f872223d1..e46b03efb9 100644 --- a/app/Module/FamilyListModule.php +++ b/app/Module/FamilyListModule.php @@ -20,14 +20,11 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\I18N; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; -use function assert; - /** * Class FamilyListModule */ @@ -74,11 +71,8 @@ class FamilyListModule extends IndividualListModule */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); - assert($user instanceof UserInterface); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user); diff --git a/app/Module/FamilyTreeFavoritesModule.php b/app/Module/FamilyTreeFavoritesModule.php index 7b82955fc7..74f40e3b72 100644 --- a/app/Module/FamilyTreeFavoritesModule.php +++ b/app/Module/FamilyTreeFavoritesModule.php @@ -25,13 +25,12 @@ use Fisharebest\Webtrees\Http\RequestHandlers\TreePage; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Support\Str; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; -use function assert; - /** * Class FamilyTreeFavoritesModule */ @@ -162,10 +161,8 @@ class FamilyTreeFavoritesModule extends AbstractModule implements ModuleBlockInt */ public function postAddFavoriteAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); $params = (array) $request->getParsedBody(); $note = $params['note']; @@ -198,10 +195,8 @@ class FamilyTreeFavoritesModule extends AbstractModule implements ModuleBlockInt */ public function postDeleteFavoriteAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); $favorite_id = $request->getQueryParams()['favorite_id']; if (Auth::isManager($tree, $user)) { diff --git a/app/Module/FamilyTreeNewsModule.php b/app/Module/FamilyTreeNewsModule.php index fe4901e535..cec1d4833e 100644 --- a/app/Module/FamilyTreeNewsModule.php +++ b/app/Module/FamilyTreeNewsModule.php @@ -27,14 +27,13 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\HtmlService; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Query\Expression; use Illuminate\Support\Str; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; -use function assert; - /** * Class FamilyTreeNewsModule */ @@ -157,8 +156,7 @@ class FamilyTreeNewsModule extends AbstractModule implements ModuleBlockInterfac */ public function getEditNewsAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); if (!Auth::isManager($tree)) { throw new HttpAccessDeniedException(); @@ -201,8 +199,7 @@ class FamilyTreeNewsModule extends AbstractModule implements ModuleBlockInterfac */ public function postEditNewsAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); if (!Auth::isManager($tree)) { throw new HttpAccessDeniedException(); @@ -247,8 +244,7 @@ class FamilyTreeNewsModule extends AbstractModule implements ModuleBlockInterfac */ public function postDeleteNewsAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $news_id = $request->getQueryParams()['news_id']; diff --git a/app/Module/FamilyTreeStatisticsModule.php b/app/Module/FamilyTreeStatisticsModule.php index f489693e78..ad0a45ed46 100644 --- a/app/Module/FamilyTreeStatisticsModule.php +++ b/app/Module/FamilyTreeStatisticsModule.php @@ -47,6 +47,16 @@ class FamilyTreeStatisticsModule extends AbstractModule implements ModuleBlockIn /** Show this number of surnames by default */ private const DEFAULT_NUMBER_OF_SURNAMES = '10'; + private ModuleService $module_service; + + /** + * @param ModuleService $module_service + */ + public function __construct(ModuleService $module_service) + { + $this->module_service = $module_service; + } + /** * How should this module be identified in the control panel, etc.? * @@ -132,10 +142,10 @@ class FamilyTreeStatisticsModule extends AbstractModule implements ModuleBlockIn uksort($all_surnames, I18N::comparator()); - //find a module providing individual lists - $module = app(ModuleService::class)->findByComponent(ModuleListInterface::class, $tree, Auth::user())->first(static function (ModuleInterface $module) { - return $module instanceof IndividualListModule; - }); + // Find a module providing individual lists + $module = $this->module_service + ->findByComponent(ModuleListInterface::class, $tree, Auth::user()) + ->first(static fn (ModuleInterface $module): bool => $module instanceof IndividualListModule); $surnames = view('lists/surnames-compact-list', [ 'module' => $module, diff --git a/app/Module/FanChartModule.php b/app/Module/FanChartModule.php index 62aee6902f..d3975ee474 100644 --- a/app/Module/FanChartModule.php +++ b/app/Module/FanChartModule.php @@ -27,7 +27,7 @@ use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Menu; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\ChartService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Fisharebest\Webtrees\Webtrees; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -54,7 +54,6 @@ use function imagettfbbox; use function imagettftext; use function implode; use function intdiv; -use function is_string; use function max; use function mb_substr; use function min; @@ -221,44 +220,31 @@ class FanChartModule extends AbstractModule implements ModuleChartInterface, Req */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - - $individual = Registry::individualFactory()->make($xref, $tree); - $individual = Auth::checkIndividualAccess($individual, false, true); - - $style = $request->getAttribute('style'); - $generations = (int) $request->getAttribute('generations'); - $width = (int) $request->getAttribute('width'); - $ajax = $request->getQueryParams()['ajax'] ?? ''; + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $style = Validator::attributes($request)->string('style'); + $generations = Validator::attributes($request)->isBetween(self::MINIMUM_GENERATIONS, self::MAXIMUM_GENERATIONS)->integer('generations'); + $width = Validator::attributes($request)->isBetween(self::MINIMUM_WIDTH, self::MAXIMUM_WIDTH)->integer('width'); + $ajax = Validator::queryParams($request)->boolean('ajax', false); // Convert POST requests into GET requests for pretty URLs. if ($request->getMethod() === RequestMethodInterface::METHOD_POST) { - $params = (array) $request->getParsedBody(); - return redirect(route(static::class, [ 'tree' => $tree->name(), - 'xref' => $params['xref'], - 'style' => $params['style'], - 'generations' => $params['generations'], - 'width' => $params['width'], - ])); + 'generations' => Validator::parsedBody($request)->string('generations', ''), + 'style' => Validator::parsedBody($request)->string('style', ''), + 'width' => Validator::parsedBody($request)->string('width', ''), + 'xref' => Validator::parsedBody($request)->string('xref', ''), + ])); } Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user); - $width = min($width, self::MAXIMUM_WIDTH); - $width = max($width, self::MINIMUM_WIDTH); - - $generations = min($generations, self::MAXIMUM_GENERATIONS); - $generations = max($generations, self::MINIMUM_GENERATIONS); + $individual = Registry::individualFactory()->make($xref, $tree); + $individual = Auth::checkIndividualAccess($individual, false, true); - if ($ajax === '1') { + if ($ajax) { return $this->chart($individual, $style, $width, $generations); } diff --git a/app/Module/FrequentlyAskedQuestionsModule.php b/app/Module/FrequentlyAskedQuestionsModule.php index bbdc473d34..a15ad3a249 100644 --- a/app/Module/FrequentlyAskedQuestionsModule.php +++ b/app/Module/FrequentlyAskedQuestionsModule.php @@ -25,13 +25,13 @@ use Fisharebest\Webtrees\Menu; use Fisharebest\Webtrees\Services\HtmlService; use Fisharebest\Webtrees\Services\TreeService; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Query\Builder; use Illuminate\Support\Collection; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; -use function assert; use function redirect; use function route; @@ -121,7 +121,7 @@ class FrequentlyAskedQuestionsModule extends AbstractModule implements ModuleCon $this->layout = 'layouts/administration'; // This module can't run without a tree - $tree = $request->getAttribute('tree'); + $tree = Validator::attributes($request)->treeOptional(); if (!$tree instanceof Tree) { $tree = $this->tree_service->all()->first(); @@ -388,8 +388,7 @@ class FrequentlyAskedQuestionsModule extends AbstractModule implements ModuleCon */ public function getShowAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); // Filter foreign languages. $faqs = $this->faqsForTree($tree) diff --git a/app/Module/GoogleAnalyticsModule.php b/app/Module/GoogleAnalyticsModule.php index 0dda4e271e..6a54a95aae 100644 --- a/app/Module/GoogleAnalyticsModule.php +++ b/app/Module/GoogleAnalyticsModule.php @@ -22,8 +22,11 @@ namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ServerRequestInterface; +use function assert; + /** * Class GoogleAnalyticsModule - add support for Google analytics. */ @@ -96,10 +99,11 @@ class GoogleAnalyticsModule extends AbstractModule implements ModuleAnalyticsInt public function analyticsSnippet(array $parameters): string { $request = app(ServerRequestInterface::class); + assert($request instanceof ServerRequestInterface); // Add extra dimensions (i.e. filtering categories) - $tree = $request->getAttribute('tree'); - $user = $request->getAttribute('user'); + $tree = Validator::attributes($request)->treeOptional(); + $user = Validator::attributes($request)->user(); $parameters['dimensions'] = (object) [ 'dimension1' => $tree instanceof Tree ? $tree->name() : '-', diff --git a/app/Module/HitCountFooterModule.php b/app/Module/HitCountFooterModule.php index 202ea974e4..96250827cc 100644 --- a/app/Module/HitCountFooterModule.php +++ b/app/Module/HitCountFooterModule.php @@ -32,6 +32,7 @@ use Fisharebest\Webtrees\Http\RequestHandlers\UserPage; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Session; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -124,11 +125,9 @@ class HitCountFooterModule extends AbstractModule implements ModuleFooterInterfa */ public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { - $route = $request->getAttribute('route'); - assert($route instanceof Route); - - $tree = $request->getAttribute('tree'); - $user = $request->getAttribute('user'); + $route = Validator::attributes($request)->route(); + $tree = Validator::attributes($request)->treeOptional(); + $user = Validator::attributes($request)->user(); if ($tree instanceof Tree && $tree->getPreference('SHOW_COUNTER')) { $page_name = self::PAGE_NAMES[$route->name] ?? ''; @@ -141,7 +140,8 @@ class HitCountFooterModule extends AbstractModule implements ModuleFooterInterfa case RepositoryPage::class: case SourcePage::class: case SubmitterPage::class: - $this->page_hits = $this->countHit($tree, $page_name, $request->getAttribute('xref', '')); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $this->page_hits = $this->countHit($tree, $page_name, $xref); break; case TreePage::class: diff --git a/app/Module/HourglassChartModule.php b/app/Module/HourglassChartModule.php index 1f38c0f7aa..4a5c6c92d1 100644 --- a/app/Module/HourglassChartModule.php +++ b/app/Module/HourglassChartModule.php @@ -22,12 +22,12 @@ namespace Fisharebest\Webtrees\Module; use Aura\Router\RouterContainer; use Fig\Http\Message\RequestMethodInterface; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Family; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Menu; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Registry; +use Fisharebest\Webtrees\Validator; use Illuminate\Support\Collection; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -35,7 +35,6 @@ use Psr\Http\Server\RequestHandlerInterface; use function app; use function assert; -use function is_string; use function response; use function view; @@ -159,38 +158,29 @@ class HourglassChartModule extends AbstractModule implements ModuleChartInterfac */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - - $individual = Registry::individualFactory()->make($xref, $tree); - $individual = Auth::checkIndividualAccess($individual, false, true); - - $user = $request->getAttribute('user'); - $generations = (int) $request->getAttribute('generations'); - $spouses = (bool) $request->getAttribute('spouses'); - $ajax = $request->getQueryParams()['ajax'] ?? ''; + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $user = Validator::attributes($request)->user(); + $generations = Validator::attributes($request)->isBetween(self::MINIMUM_GENERATIONS, self::MAXIMUM_GENERATIONS)->integer('generations'); + $spouses = Validator::attributes($request)->boolean('spouses'); + $ajax = Validator::queryParams($request)->boolean('ajax', false); // Convert POST requests into GET requests for pretty URLs. if ($request->getMethod() === RequestMethodInterface::METHOD_POST) { - $params = (array) $request->getParsedBody(); - return redirect(route(static::class, [ 'tree' => $tree->name(), - 'xref' => $params['xref'], - 'generations' => $params['generations'], - 'spouses' => $params['spouses'] ?? false, + 'xref' => Validator::parsedBody($request)->string('xref', ''), + 'generations' => Validator::parsedBody($request)->string('generations', ''), + 'spouses' => Validator::parsedBody($request)->string('spouses', ''), ])); } Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user); - $generations = min($generations, self::MAXIMUM_GENERATIONS); - $generations = max($generations, self::MINIMUM_GENERATIONS); + $individual = Registry::individualFactory()->make($xref, $tree); + $individual = Auth::checkIndividualAccess($individual, false, true); - if ($ajax === '1') { + if ($ajax) { $this->layout = 'layouts/ajax'; return $this->viewResponse('modules/hourglass-chart/chart', [ @@ -228,8 +218,7 @@ class HourglassChartModule extends AbstractModule implements ModuleChartInterfac */ public function getAncestorsAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $xref = $request->getQueryParams()['xref'] ?? ''; @@ -251,8 +240,7 @@ class HourglassChartModule extends AbstractModule implements ModuleChartInterfac */ public function getDescendantsAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $xref = $request->getQueryParams()['xref'] ?? ''; diff --git a/app/Module/IndividualListModule.php b/app/Module/IndividualListModule.php index 05feaea0bf..7290f16f44 100644 --- a/app/Module/IndividualListModule.php +++ b/app/Module/IndividualListModule.php @@ -31,6 +31,7 @@ use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\LocalizationService; use Fisharebest\Webtrees\Session; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Query\Builder; use Illuminate\Database\Query\Expression; @@ -127,7 +128,10 @@ class IndividualListModule extends AbstractModule implements ModuleListInterface */ public function listUrl(Tree $tree, array $parameters = []): string { - $xref = app(ServerRequestInterface::class)->getAttribute('xref', ''); + $request = app(ServerRequestInterface::class); + assert($request instanceof ServerRequestInterface); + + $xref = Validator::attributes($request)->isXref()->string('xref', ''); if ($xref !== '') { $individual = Registry::individualFactory()->make($xref, $tree); @@ -161,7 +165,9 @@ class IndividualListModule extends AbstractModule implements ModuleListInterface */ public function getListAction(ServerRequestInterface $request): ResponseInterface { - return redirect($this->listUrl($request->getAttribute('tree'), $request->getQueryParams())); + $tree = Validator::attributes($request)->tree(); + + return redirect($this->listUrl($tree, $request->getQueryParams())); } /** @@ -171,11 +177,8 @@ class IndividualListModule extends AbstractModule implements ModuleListInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); - assert($user instanceof UserInterface); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user); diff --git a/app/Module/InteractiveTreeModule.php b/app/Module/InteractiveTreeModule.php index 7834d34a4e..82c871be20 100644 --- a/app/Module/InteractiveTreeModule.php +++ b/app/Module/InteractiveTreeModule.php @@ -25,13 +25,10 @@ use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Menu; use Fisharebest\Webtrees\Module\InteractiveTree\TreeView; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; -use function assert; - /** * Class InteractiveTreeModule * Tip : you could change the number of generations loaded before ajax calls both in individual page and in treeview page to optimize speed and server load @@ -187,18 +184,15 @@ class InteractiveTreeModule extends AbstractModule implements ModuleChartInterfa */ public function getChartAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); + $xref = Validator::queryParams($request)->isXref()->string('xref'); - $xref = Validator::queryParams($request)->isXref()->requiredString('xref'); + Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user); $individual = Registry::individualFactory()->make($xref, $tree); $individual = Auth::checkIndividualAccess($individual, false, true); - $user = $request->getAttribute('user'); - - Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user); - $tv = new TreeView('tv'); [$html, $js] = $tv->drawViewport($individual, 4); @@ -221,8 +215,7 @@ class InteractiveTreeModule extends AbstractModule implements ModuleChartInterfa */ public function postChartAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $params = (array) $request->getParsedBody(); @@ -241,8 +234,7 @@ class InteractiveTreeModule extends AbstractModule implements ModuleChartInterfa */ public function getDetailsAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $pid = $request->getQueryParams()['pid']; $individual = Registry::individualFactory()->make($pid, $tree); @@ -262,8 +254,7 @@ class InteractiveTreeModule extends AbstractModule implements ModuleChartInterfa */ public function getIndividualsAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $q = $request->getQueryParams()['q']; $instance = $request->getQueryParams()['instance']; diff --git a/app/Module/LifespansChartModule.php b/app/Module/LifespansChartModule.php index 2222aeb434..742b7b1712 100644 --- a/app/Module/LifespansChartModule.php +++ b/app/Module/LifespansChartModule.php @@ -30,6 +30,7 @@ use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Place; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Query\JoinClause; use Psr\Http\Message\ResponseInterface; @@ -153,17 +154,10 @@ class LifespansChartModule extends AbstractModule implements ModuleChartInterfac */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); - $xrefs = $request->getQueryParams()['xrefs'] ?? []; - $ajax = $request->getQueryParams()['ajax'] ?? ''; - - // URLs created by older versions may already contain an array. - if (!is_array($xrefs)) { - $xrefs = explode(self::SEPARATOR, $xrefs); - } + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); + $xrefs = Validator::queryParams($request)->array('xrefs'); + $ajax = Validator::queryParams($request)->boolean('ajax', false); $params = (array) $request->getParsedBody(); @@ -217,7 +211,7 @@ class LifespansChartModule extends AbstractModule implements ModuleChartInterfac Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user); - if ($ajax === '1') { + if ($ajax) { $this->layout = 'layouts/ajax'; return $this->chart($tree, $xrefs); diff --git a/app/Module/LocationListModule.php b/app/Module/LocationListModule.php index 6a0b95ce11..bc72e53921 100644 --- a/app/Module/LocationListModule.php +++ b/app/Module/LocationListModule.php @@ -21,12 +21,12 @@ namespace Fisharebest\Webtrees\Module; use Aura\Router\RouterContainer; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\GedcomRecord; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Location; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -124,7 +124,9 @@ class LocationListModule extends AbstractModule implements ModuleListInterface, */ public function getListAction(ServerRequestInterface $request): ResponseInterface { - return redirect($this->listUrl($request->getAttribute('tree'), $request->getQueryParams())); + $tree = Validator::attributes($request)->tree(); + + return redirect($this->listUrl($tree, $request->getQueryParams())); } /** @@ -147,11 +149,8 @@ class LocationListModule extends AbstractModule implements ModuleListInterface, */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); - assert($user instanceof UserInterface); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user); diff --git a/app/Module/MediaListModule.php b/app/Module/MediaListModule.php index 3dc1833841..b1da1b2419 100644 --- a/app/Module/MediaListModule.php +++ b/app/Module/MediaListModule.php @@ -22,12 +22,12 @@ namespace Fisharebest\Webtrees\Module; use Aura\Router\RouterContainer; use Fig\Http\Message\RequestMethodInterface; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\GedcomRecord; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Media; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Query\Builder; use Illuminate\Database\Query\JoinClause; @@ -145,7 +145,9 @@ class MediaListModule extends AbstractModule implements ModuleListInterface, Req */ public function getListAction(ServerRequestInterface $request): ResponseInterface { - return redirect($this->listUrl($request->getAttribute('tree'), $request->getQueryParams())); + $tree = Validator::attributes($request)->tree(); + + return redirect($this->listUrl($tree, $request->getQueryParams())); } /** @@ -155,11 +157,8 @@ class MediaListModule extends AbstractModule implements ModuleListInterface, Req */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); - assert($user instanceof UserInterface); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); $data_filesystem = Registry::filesystem()->data(); diff --git a/app/Module/ModuleAnalyticsTrait.php b/app/Module/ModuleAnalyticsTrait.php index 0def02ed67..3524d0a599 100644 --- a/app/Module/ModuleAnalyticsTrait.php +++ b/app/Module/ModuleAnalyticsTrait.php @@ -22,10 +22,12 @@ namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\Http\RequestHandlers\ModulesAnalyticsPage; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use function app; +use function assert; /** * Trait ModuleAnalyticsTrait - default implementation of ModuleAnalyticsInterface @@ -42,11 +44,10 @@ trait ModuleAnalyticsTrait public function analyticsCanShow(): bool { $request = app(ServerRequestInterface::class); + assert($request instanceof ServerRequestInterface); // If the browser sets the DNT header, then we won't use analytics. - $dnt = $request->getServerParams()['HTTP_DNT'] ?? ''; - - if ($dnt === '1') { + if (Validator::serverParams($request)->boolean('HTTP_DNT', false)) { return false; } diff --git a/app/Module/ModuleTabTrait.php b/app/Module/ModuleTabTrait.php index 4c5020a370..00581c9f77 100644 --- a/app/Module/ModuleTabTrait.php +++ b/app/Module/ModuleTabTrait.php @@ -22,12 +22,11 @@ namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Http\Exceptions\HttpAccessDeniedException; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Support\Collection; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; -use function assert; use function response; use function view; @@ -98,16 +97,14 @@ trait ModuleTabTrait */ public function getTabAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); $xref = $request->getQueryParams()['xref']; $record = Registry::individualFactory()->make($xref, $tree); $record = Auth::checkIndividualAccess($record); - $user = $request->getAttribute('user'); - if ($this->accessLevel($tree, ModuleTabInterface::class) < Auth::accessLevel($tree, $user)) { throw new HttpAccessDeniedException(); } diff --git a/app/Module/ModuleThemeTrait.php b/app/Module/ModuleThemeTrait.php index c15e1f9a3a..6c99c7222e 100644 --- a/app/Module/ModuleThemeTrait.php +++ b/app/Module/ModuleThemeTrait.php @@ -43,6 +43,8 @@ use Fisharebest\Webtrees\Menu; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\ModuleService; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; +use PhpParser\Node\Expr\AssignOp\Mod; use Psr\Http\Message\ServerRequestInterface; use function app; @@ -144,7 +146,11 @@ trait ModuleThemeTrait public function individualBoxMenuCharts(Individual $individual): array { $menus = []; - foreach (app(ModuleService::class)->findByComponent(ModuleChartInterface::class, $individual->tree(), Auth::user()) as $chart) { + + $module_service = app(ModuleService::class); + assert($module_service instanceof ModuleService); + + foreach ($module_service->findByComponent(ModuleChartInterface::class, $individual->tree(), Auth::user()) as $chart) { $menu = $chart->chartBoxMenu($individual); if ($menu) { $menus[] = $menu; @@ -194,11 +200,10 @@ trait ModuleThemeTrait */ public function menuChangeBlocks(Tree $tree): ?Menu { - /** @var ServerRequestInterface $request */ $request = app(ServerRequestInterface::class); + assert($request instanceof ServerRequestInterface); - $route = $request->getAttribute('route'); - assert($route instanceof Route); + $route = Validator::attributes($request)->route(); if (Auth::check() && $route->name === UserPage::class) { return new Menu(I18N::translate('Customize this page'), route(UserPageEdit::class, ['tree' => $tree->name()]), 'menu-change-blocks'); @@ -267,13 +272,13 @@ trait ModuleThemeTrait } $request = app(ServerRequestInterface::class); + assert($request instanceof ServerRequestInterface); // Return to this page after login... $redirect = $request->getQueryParams()['url'] ?? (string) $request->getUri(); - $tree = $request->getAttribute('tree'); - $route = $request->getAttribute('route'); - assert($route instanceof Route); + $tree = Validator::attributes($request)->treeOptional(); + $route = Validator::attributes($request)->route(); // ...but switch from the tree-page to the user-page if ($route->name === TreePage::class) { @@ -387,10 +392,12 @@ trait ModuleThemeTrait { $my_xref = $tree->getUserPreference(Auth::user(), UserInterface::PREF_TREE_ACCOUNT_XREF); - $pedigree_chart = app(ModuleService::class)->findByComponent(ModuleChartInterface::class, $tree, Auth::user()) - ->first(static function (ModuleInterface $module): bool { - return $module instanceof PedigreeChartModule; - }); + $module_service = app(ModuleService::class); + assert($module_service instanceof ModuleService); + + $pedigree_chart = $module_service + ->findByComponent(ModuleChartInterface::class, $tree, Auth::user()) + ->first(static fn (ModuleInterface $module): bool => $module instanceof PedigreeChartModule); if ($my_xref !== '' && $pedigree_chart instanceof PedigreeChartModule) { $individual = Registry::individualFactory()->make($my_xref, $tree); @@ -417,9 +424,12 @@ trait ModuleThemeTrait public function menuPendingChanges(?Tree $tree): ?Menu { if ($tree instanceof Tree && $tree->hasPendingEdit() && Auth::isModerator($tree)) { + $request = app(ServerRequestInterface::class); + assert($request instanceof ServerRequestInterface); + $url = route(PendingChanges::class, [ 'tree' => $tree->name(), - 'url' => (string) app(ServerRequestInterface::class)->getUri(), + 'url' => (string) $request->getUri(), ]); return new Menu(I18N::translate('Pending changes'), $url, 'menu-pending'); @@ -435,7 +445,10 @@ trait ModuleThemeTrait */ public function menuThemes(): ?Menu { - $themes = app(ModuleService::class)->findByInterface(ModuleThemeInterface::class, false, true); + $module_service = app(ModuleService::class); + assert($module_service instanceof ModuleService); + + $themes = $module_service->findByInterface(ModuleThemeInterface::class, false, true); $current_theme = app(ModuleThemeInterface::class); @@ -468,10 +481,12 @@ trait ModuleThemeTrait return []; } - return app(ModuleService::class)->findByComponent(ModuleMenuInterface::class, $tree, Auth::user()) - ->map(static function (ModuleMenuInterface $menu) use ($tree): ?Menu { - return $menu->getMenu($tree); - }) + $module_service = app(ModuleService::class); + assert($module_service instanceof ModuleService); + + return $module_service + ->findByComponent(ModuleMenuInterface::class, $tree, Auth::user()) + ->map(static fn (ModuleMenuInterface $menu): ?Menu => $menu->getMenu($tree)) ->filter() ->all(); } diff --git a/app/Module/NoteListModule.php b/app/Module/NoteListModule.php index d2e2c02d74..5cc440842f 100644 --- a/app/Module/NoteListModule.php +++ b/app/Module/NoteListModule.php @@ -21,12 +21,12 @@ namespace Fisharebest\Webtrees\Module; use Aura\Router\RouterContainer; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\GedcomRecord; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Note; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -134,7 +134,9 @@ class NoteListModule extends AbstractModule implements ModuleListInterface, Requ */ public function getListAction(ServerRequestInterface $request): ResponseInterface { - return redirect($this->listUrl($request->getAttribute('tree'), $request->getQueryParams())); + $tree = Validator::attributes($request)->tree(); + + return redirect($this->listUrl($tree, $request->getQueryParams())); } /** @@ -144,11 +146,8 @@ class NoteListModule extends AbstractModule implements ModuleListInterface, Requ */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); - assert($user instanceof UserInterface); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user); diff --git a/app/Module/OpenStreetMap.php b/app/Module/OpenStreetMap.php index 32760c8eed..9c7f0f5a0d 100644 --- a/app/Module/OpenStreetMap.php +++ b/app/Module/OpenStreetMap.php @@ -20,7 +20,6 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\I18N; -use Psr\Http\Message\ResponseInterface; /** * Class OpenStreetMap - use maps within webtrees diff --git a/app/Module/PedigreeChartModule.php b/app/Module/PedigreeChartModule.php index bbe6a71b1d..bbad65c000 100644 --- a/app/Module/PedigreeChartModule.php +++ b/app/Module/PedigreeChartModule.php @@ -27,14 +27,13 @@ use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Menu; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\ChartService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; use function app; use function assert; -use function is_string; use function max; use function min; use function route; @@ -186,38 +185,29 @@ class PedigreeChartModule extends AbstractModule implements ModuleChartInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - - $individual = Registry::individualFactory()->make($xref, $tree); - $individual = Auth::checkIndividualAccess($individual, false, true); - - $ajax = $request->getQueryParams()['ajax'] ?? ''; - $generations = (int) $request->getAttribute('generations'); + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $ajax = Validator::queryParams($request)->boolean('ajax', false); + $generations = Validator::attributes($request)->isBetween(self::MINIMUM_GENERATIONS, self::MAXIMUM_GENERATIONS)->integer('generations'); $style = $request->getAttribute('style'); - $user = $request->getAttribute('user'); + $user = Validator::attributes($request)->user(); // Convert POST requests into GET requests for pretty URLs. if ($request->getMethod() === RequestMethodInterface::METHOD_POST) { - $params = (array) $request->getParsedBody(); - return redirect(route(self::class, [ - 'tree' => $request->getAttribute('tree')->name(), - 'xref' => $params['xref'], - 'style' => $params['style'], - 'generations' => $params['generations'], + 'tree' => $tree->name(), + 'xref' => Validator::parsedBody($request)->string('xref', ''), + 'style' => Validator::parsedBody($request)->string('style', ''), + 'generations' => Validator::parsedBody($request)->string('generations', ''), ])); } Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user); - $generations = min($generations, self::MAXIMUM_GENERATIONS); - $generations = max($generations, self::MINIMUM_GENERATIONS); + $individual = Registry::individualFactory()->make($xref, $tree); + $individual = Auth::checkIndividualAccess($individual, false, true); - if ($ajax === '1') { + if ($ajax) { $this->layout = 'layouts/ajax'; $ancestors = $this->chart_service->sosaStradonitzAncestors($individual, $generations); diff --git a/app/Module/PedigreeMapModule.php b/app/Module/PedigreeMapModule.php index 1ea5013cf9..4780bd7539 100644 --- a/app/Module/PedigreeMapModule.php +++ b/app/Module/PedigreeMapModule.php @@ -32,7 +32,7 @@ use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\ChartService; use Fisharebest\Webtrees\Services\LeafletJsService; use Fisharebest\Webtrees\Services\RelationshipService; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -40,9 +40,7 @@ use Psr\Http\Server\RequestHandlerInterface; use function app; use function array_key_exists; use function assert; -use function count; use function intdiv; -use function is_string; use function redirect; use function route; use function ucfirst; @@ -64,6 +62,7 @@ class PedigreeMapModule extends AbstractModule implements ModuleChartInterface, ]; // Limits + public const MINIMUM_GENERATIONS = 1; public const MAXIMUM_GENERATIONS = 10; // CSS colors defined for each generation @@ -183,30 +182,25 @@ class PedigreeMapModule extends AbstractModule implements ModuleChartInterface, */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - - $individual = Registry::individualFactory()->make($xref, $tree); - $individual = Auth::checkIndividualAccess($individual, false, true); - - $user = $request->getAttribute('user'); - $generations = (int) $request->getAttribute('generations'); - Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); + $generations = Validator::attributes($request)->isBetween(self::MINIMUM_GENERATIONS, self::MAXIMUM_GENERATIONS)->integer('generations'); + $xref = Validator::attributes($request)->isXref()->string('xref'); // Convert POST requests into GET requests for pretty URLs. if ($request->getMethod() === RequestMethodInterface::METHOD_POST) { - $params = (array) $request->getParsedBody(); - return redirect(route(static::class, [ 'tree' => $tree->name(), - 'xref' => $params['xref'], - 'generations' => $params['generations'], + 'xref' => Validator::parsedBody($request)->string('xref', ''), + 'generations' => Validator::parsedBody($request)->string('generations', ''), ])); } + Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user); + + $individual = Registry::individualFactory()->make($xref, $tree); + $individual = Auth::checkIndividualAccess($individual, false, true); + $map = view('modules/pedigree-map/chart', [ 'data' => $this->getMapData($request), 'leaflet_config' => $this->leaflet_js_service->config(), @@ -231,9 +225,6 @@ class PedigreeMapModule extends AbstractModule implements ModuleChartInterface, */ private function getMapData(ServerRequestInterface $request): array { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - $facts = $this->getPedigreeMapFacts($request, $this->chart_service); $geojson = [ @@ -308,14 +299,14 @@ class PedigreeMapModule extends AbstractModule implements ModuleChartInterface, */ private function getPedigreeMapFacts(ServerRequestInterface $request, ChartService $chart_service): array { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $generations = (int) $request->getAttribute('generations'); - $xref = $request->getAttribute('xref'); + $tree = Validator::attributes($request)->tree(); + $generations = Validator::attributes($request)->isBetween(self::MINIMUM_GENERATIONS, self::MAXIMUM_GENERATIONS)->integer('generations'); + $xref = Validator::attributes($request)->isXref()->string('xref'); $individual = Registry::individualFactory()->make($xref, $tree); + $individual = Auth::checkIndividualAccess($individual, false, true); $ancestors = $chart_service->sosaStradonitzAncestors($individual, $generations); $facts = []; + foreach ($ancestors as $sosa => $person) { if ($person->canShow()) { $birth = $person->facts(Gedcom::BIRTH_EVENTS, true) @@ -352,6 +343,9 @@ class PedigreeMapModule extends AbstractModule implements ModuleChartInterface, $sosa = intdiv($sosa, 2); } - return app(RelationshipService::class)->legacyNameAlgorithm($path); + $relationship_service = app(RelationshipService::class); + assert($relationship_service instanceof RelationshipService); + + return $relationship_service->legacyNameAlgorithm($path); } } diff --git a/app/Module/PlaceHierarchyListModule.php b/app/Module/PlaceHierarchyListModule.php index 901a863c2a..8a7fba443a 100644 --- a/app/Module/PlaceHierarchyListModule.php +++ b/app/Module/PlaceHierarchyListModule.php @@ -21,7 +21,6 @@ namespace Fisharebest\Webtrees\Module; use Aura\Router\RouterContainer; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Family; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; @@ -33,6 +32,7 @@ use Fisharebest\Webtrees\Services\ModuleService; use Fisharebest\Webtrees\Services\SearchService; use Fisharebest\Webtrees\Statistics; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -156,7 +156,9 @@ class PlaceHierarchyListModule extends AbstractModule implements ModuleListInter */ public function getListAction(ServerRequestInterface $request): ResponseInterface { - return redirect($this->listUrl($request->getAttribute('tree'), $request->getQueryParams())); + $tree = Validator::attributes($request)->tree(); + + return redirect($this->listUrl($tree, $request->getQueryParams())); } /** @@ -179,11 +181,8 @@ class PlaceHierarchyListModule extends AbstractModule implements ModuleListInter */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); - assert($user instanceof UserInterface); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user); diff --git a/app/Module/PrivacyPolicy.php b/app/Module/PrivacyPolicy.php index 54d7805b78..a8f73173be 100644 --- a/app/Module/PrivacyPolicy.php +++ b/app/Module/PrivacyPolicy.php @@ -24,11 +24,11 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\ModuleService; use Fisharebest\Webtrees\Services\UserService; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Support\Collection; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; -use function assert; use function view; /** @@ -95,15 +95,13 @@ class PrivacyPolicy extends AbstractModule implements ModuleFooterInterface */ public function getFooter(ServerRequestInterface $request): string { - $tree = $request->getAttribute('tree'); + $tree = Validator::attributes($request)->treeOptional(); + $user = Validator::attributes($request)->user(); if ($tree === null) { return ''; } - $user = $request->getAttribute('user'); - assert($user instanceof UserInterface); - return view('modules/privacy-policy/footer', [ 'tree' => $tree, 'uses_analytics' => $this->analyticsModules($tree, $user)->isNotEmpty(), @@ -117,11 +115,8 @@ class PrivacyPolicy extends AbstractModule implements ModuleFooterInterface */ public function getPageAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); - assert($user instanceof UserInterface); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); $title = I18N::translate('Privacy policy'); diff --git a/app/Module/RelationshipsChartModule.php b/app/Module/RelationshipsChartModule.php index a3c684e30b..48938bf988 100644 --- a/app/Module/RelationshipsChartModule.php +++ b/app/Module/RelationshipsChartModule.php @@ -35,6 +35,7 @@ use Fisharebest\Webtrees\Services\ModuleService; use Fisharebest\Webtrees\Services\RelationshipService; use Fisharebest\Webtrees\Services\TreeService; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Query\JoinClause; use Illuminate\Support\Collection; @@ -44,7 +45,6 @@ use Psr\Http\Server\RequestHandlerInterface; use function app; use function assert; -use function is_string; use function redirect; use function route; use function view; @@ -72,16 +72,20 @@ class RelationshipsChartModule extends AbstractModule implements ModuleChartInte 'recursion' => self::DEFAULT_RECURSION, ]; + private ModuleService $module_service; + private TreeService $tree_service; private RelationshipService $relationship_service; /** + * @param ModuleService $module_service * @param RelationshipService $relationship_service * @param TreeService $tree_service */ - public function __construct(RelationshipService $relationship_service, TreeService $tree_service) + public function __construct(ModuleService $module_service, RelationshipService $relationship_service, TreeService $tree_service) { + $this->module_service = $module_service; $this->relationship_service = $relationship_service; $this->tree_service = $tree_service; } @@ -204,29 +208,22 @@ class RelationshipsChartModule extends AbstractModule implements ModuleChartInte */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - assert(is_string($xref)); - - $xref2 = $request->getAttribute('xref2') ?? ''; - - $ajax = $request->getQueryParams()['ajax'] ?? ''; + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $xref2 = Validator::attributes($request)->isXref()->string('xref2', ''); + $ajax = Validator::queryParams($request)->boolean('ajax', false); $ancestors = (int) $request->getAttribute('ancestors'); $recursion = (int) $request->getAttribute('recursion'); - $user = $request->getAttribute('user'); + $user = Validator::attributes($request)->user(); // Convert POST requests into GET requests for pretty URLs. if ($request->getMethod() === RequestMethodInterface::METHOD_POST) { - $params = (array) $request->getParsedBody(); - return redirect(route(static::class, [ - 'ancestors' => $params['ancestors'], - 'recursion' => $params['recursion'], 'tree' => $tree->name(), - 'xref' => $params['xref'], - 'xref2' => $params['xref2'], + 'ancestors' => Validator::parsedBody($request)->string('ancestors', ''), + 'recursion' => Validator::parsedBody($request)->string('recursion', ''), + 'xref' => Validator::parsedBody($request)->string('xref', ''), + 'xref2' => Validator::parsedBody($request)->string('xref2', ''), ])); } @@ -238,6 +235,8 @@ class RelationshipsChartModule extends AbstractModule implements ModuleChartInte $recursion = min($recursion, $max_recursion); + Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user); + if ($individual1 instanceof Individual) { $individual1 = Auth::checkIndividualAccess($individual1, false, true); } @@ -246,10 +245,8 @@ class RelationshipsChartModule extends AbstractModule implements ModuleChartInte $individual2 = Auth::checkIndividualAccess($individual2, false, true); } - Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user); - if ($individual1 instanceof Individual && $individual2 instanceof Individual) { - if ($ajax === '1') { + if ($ajax) { return $this->chart($individual1, $individual2, $recursion, $ancestors); } @@ -327,12 +324,10 @@ class RelationshipsChartModule extends AbstractModule implements ModuleChartInte return Registry::familyFactory()->make($xref, $tree); }); - $language = app(ModuleService::class) + $language = $this->module_service ->findByInterface(ModuleLanguageInterface::class, true) ->first(fn (ModuleLanguageInterface $language): bool => $language->locale()->languageTag() === I18N::languageTag()); - - echo '<h3>', I18N::translate('Relationship: %s', $this->relationship_service->nameFromPath($nodes->all(), $language)), '</h3>'; $num_paths++; @@ -355,17 +350,17 @@ class RelationshipsChartModule extends AbstractModule implements ModuleChartInte case 'bro': case 'sis': case 'sib': - $table[$x + 1][$y] = '<div style="background:url(' . e(asset('css/images/hline.png')) . ') repeat-x center; width: 94px; text-align: center"><div class="hline-text" style="height: 32px;">' . app(RelationshipService::class)->legacyNameAlgorithm($relationships[$n], Registry::individualFactory()->make($path[$n - 1], $tree), Registry::individualFactory()->make($path[$n + 1], $tree)) . '</div><div style="height: 32px;">' . view('icons/arrow-right') . '</div></div>'; + $table[$x + 1][$y] = '<div style="background:url(' . e(asset('css/images/hline.png')) . ') repeat-x center; width: 94px; text-align: center"><div class="hline-text" style="height: 32px;">' . $this->relationship_service->legacyNameAlgorithm($relationships[$n], Registry::individualFactory()->make($path[$n - 1], $tree), Registry::individualFactory()->make($path[$n + 1], $tree)) . '</div><div style="height: 32px;">' . view('icons/arrow-right') . '</div></div>'; $x += 2; break; case 'son': case 'dau': case 'chi': if ($n > 2 && preg_match('/fat|mot|par/', $relationships[$n - 2])) { - $table[$x + 1][$y - 1] = '<div style="background:url(' . $diagonal2 . '); width: 64px; height: 64px; text-align: center;"><div style="height: 32px; text-align: end;">' . app(RelationshipService::class)->legacyNameAlgorithm($relationships[$n], Registry::individualFactory()->make($path[$n - 1], $tree), Registry::individualFactory()->make($path[$n + 1], $tree)) . '</div><div style="height: 32px; text-align: start;">' . view('icons/arrow-down') . '</div></div>'; + $table[$x + 1][$y - 1] = '<div style="background:url(' . $diagonal2 . '); width: 64px; height: 64px; text-align: center;"><div style="height: 32px; text-align: end;">' . $this->relationship_service->legacyNameAlgorithm($relationships[$n], Registry::individualFactory()->make($path[$n - 1], $tree), Registry::individualFactory()->make($path[$n + 1], $tree)) . '</div><div style="height: 32px; text-align: start;">' . view('icons/arrow-down') . '</div></div>'; $x += 2; } else { - $table[$x][$y - 1] = '<div style="background:url(' . e('"' . asset('css/images/vline.png') . '"') . ') repeat-y center; height: 64px; text-align: center;"><div class="vline-text" style="display: inline-block; width:50%; line-height: 64px;">' . app(RelationshipService::class)->legacyNameAlgorithm($relationships[$n], Registry::individualFactory()->make($path[$n - 1], $tree), Registry::individualFactory()->make($path[$n + 1], $tree)) . '</div><div style="display: inline-block; width:50%; line-height: 64px;">' . view('icons/arrow-down') . '</div></div>'; + $table[$x][$y - 1] = '<div style="background:url(' . e('"' . asset('css/images/vline.png') . '"') . ') repeat-y center; height: 64px; text-align: center;"><div class="vline-text" style="display: inline-block; width:50%; line-height: 64px;">' . $this->relationship_service->legacyNameAlgorithm($relationships[$n], Registry::individualFactory()->make($path[$n - 1], $tree), Registry::individualFactory()->make($path[$n + 1], $tree)) . '</div><div style="display: inline-block; width:50%; line-height: 64px;">' . view('icons/arrow-down') . '</div></div>'; } $y -= 2; break; @@ -373,10 +368,10 @@ class RelationshipsChartModule extends AbstractModule implements ModuleChartInte case 'mot': case 'par': if ($n > 2 && preg_match('/son|dau|chi/', $relationships[$n - 2])) { - $table[$x + 1][$y + 1] = '<div style="background:url(' . $diagonal1 . '); background-position: top right; width: 64px; height: 64px; text-align: center;"><div style="height: 32px; text-align: start;">' . app(RelationshipService::class)->legacyNameAlgorithm($relationships[$n], Registry::individualFactory()->make($path[$n - 1], $tree), Registry::individualFactory()->make($path[$n + 1], $tree)) . '</div><div style="height: 32px; text-align: end;">' . view('icons/arrow-down') . '</div></div>'; + $table[$x + 1][$y + 1] = '<div style="background:url(' . $diagonal1 . '); background-position: top right; width: 64px; height: 64px; text-align: center;"><div style="height: 32px; text-align: start;">' . $this->relationship_service->legacyNameAlgorithm($relationships[$n], Registry::individualFactory()->make($path[$n - 1], $tree), Registry::individualFactory()->make($path[$n + 1], $tree)) . '</div><div style="height: 32px; text-align: end;">' . view('icons/arrow-down') . '</div></div>'; $x += 2; } else { - $table[$x][$y + 1] = '<div style="background:url(' . e('"' . asset('css/images/vline.png') . '"') . ') repeat-y center; height: 64px; text-align:center; "><div class="vline-text" style="display: inline-block; width: 50%; line-height: 64px;">' . app(RelationshipService::class)->legacyNameAlgorithm($relationships[$n], Registry::individualFactory()->make($path[$n - 1], $tree), Registry::individualFactory()->make($path[$n + 1], $tree)) . '</div><div style="display: inline-block; width: 50%; line-height: 32px">' . view('icons/arrow-up') . '</div></div>'; + $table[$x][$y + 1] = '<div style="background:url(' . e('"' . asset('css/images/vline.png') . '"') . ') repeat-y center; height: 64px; text-align:center; "><div class="vline-text" style="display: inline-block; width: 50%; line-height: 64px;">' . $this->relationship_service->legacyNameAlgorithm($relationships[$n], Registry::individualFactory()->make($path[$n - 1], $tree), Registry::individualFactory()->make($path[$n + 1], $tree)) . '</div><div style="display: inline-block; width: 50%; line-height: 32px">' . view('icons/arrow-up') . '</div></div>'; } $y += 2; break; diff --git a/app/Module/ReportsMenuModule.php b/app/Module/ReportsMenuModule.php index 03a6c61592..c3e256f8fa 100644 --- a/app/Module/ReportsMenuModule.php +++ b/app/Module/ReportsMenuModule.php @@ -24,6 +24,7 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Menu; use Fisharebest\Webtrees\Services\ModuleService; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ServerRequestInterface; use function app; @@ -88,8 +89,10 @@ class ReportsMenuModule extends AbstractModule implements ModuleMenuInterface */ public function getMenu(Tree $tree): ?Menu { - $request = app(ServerRequestInterface::class); - $xref = $request->getAttribute('xref', ''); + $request = app(ServerRequestInterface::class); + assert($request instanceof ServerRequestInterface); + + $xref = Validator::attributes($request)->isXref()->string('xref', ''); $individual = $tree->significantIndividual(Auth::user(), $xref); $submenus = $this->module_service->findByComponent(ModuleReportInterface::class, $tree, Auth::user()) ->map(static function (ModuleReportInterface $module) use ($individual): Menu { diff --git a/app/Module/RepositoryListModule.php b/app/Module/RepositoryListModule.php index c55eb5a397..c98974f315 100644 --- a/app/Module/RepositoryListModule.php +++ b/app/Module/RepositoryListModule.php @@ -20,13 +20,13 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Module; use Aura\Router\RouterContainer; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\GedcomRecord; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Repository; use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\Auth; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -137,7 +137,9 @@ class RepositoryListModule extends AbstractModule implements ModuleListInterface */ public function getListAction(ServerRequestInterface $request): ResponseInterface { - return redirect($this->listUrl($request->getAttribute('tree'), $request->getQueryParams())); + $tree = Validator::attributes($request)->tree(); + + return redirect($this->listUrl($tree, $request->getQueryParams())); } /** @@ -147,11 +149,8 @@ class RepositoryListModule extends AbstractModule implements ModuleListInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); - assert($user instanceof UserInterface); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user); diff --git a/app/Module/ShareAnniversaryModule.php b/app/Module/ShareAnniversaryModule.php index b766fb8ee9..af6115bc68 100644 --- a/app/Module/ShareAnniversaryModule.php +++ b/app/Module/ShareAnniversaryModule.php @@ -29,7 +29,7 @@ use Fisharebest\Webtrees\Http\Exceptions\HttpNotFoundException; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Support\Collection; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -139,14 +139,11 @@ class ShareAnniversaryModule extends AbstractModule implements ModuleShareInterf */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $xref = $request->getAttribute('xref'); - $fact_id = $request->getAttribute('fact_id'); - - $record = Registry::gedcomRecordFactory()->make($xref, $tree); - $record = Auth::checkRecordAccess($record); + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $fact_id = Validator::attributes($request)->string('fact_id'); + $record = Registry::gedcomRecordFactory()->make($xref, $tree); + $record = Auth::checkRecordAccess($record); $fact = $record->facts() ->filter(fn (Fact $fact): bool => $fact->id() === $fact_id) diff --git a/app/Module/SiteMapModule.php b/app/Module/SiteMapModule.php index 3c2101431d..e1fa8617f4 100644 --- a/app/Module/SiteMapModule.php +++ b/app/Module/SiteMapModule.php @@ -38,6 +38,7 @@ use Fisharebest\Webtrees\Services\TreeService; use Fisharebest\Webtrees\Source; use Fisharebest\Webtrees\Submitter; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Query\Expression; use Illuminate\Support\Collection; @@ -188,8 +189,7 @@ class SiteMapModule extends AbstractModule implements ModuleConfigInterface, Req */ public function handle(ServerRequestInterface $request): ResponseInterface { - $route = $request->getAttribute('route'); - assert($route instanceof Route); + $route = Validator::attributes($request)->route(); if ($route->name === 'sitemap-style') { $content = view('modules/sitemap/sitemap-xsl'); @@ -305,11 +305,9 @@ class SiteMapModule extends AbstractModule implements ModuleConfigInterface, Req */ private function siteMapFile(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $type = $request->getAttribute('type'); - $page = (int) $request->getAttribute('page'); + $tree = Validator::attributes($request)->tree('tree'); + $type = Validator::attributes($request)->string('type'); + $page = Validator::attributes($request)->integer('page'); if ($tree->getPreference('include_in_sitemap') !== '1') { throw new HttpNotFoundException(); diff --git a/app/Module/SourceListModule.php b/app/Module/SourceListModule.php index a8e3a5834f..d2ea8ef01b 100644 --- a/app/Module/SourceListModule.php +++ b/app/Module/SourceListModule.php @@ -21,11 +21,11 @@ namespace Fisharebest\Webtrees\Module; use Aura\Router\RouterContainer; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\GedcomRecord; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -135,7 +135,9 @@ class SourceListModule extends AbstractModule implements ModuleListInterface, Re */ public function getListAction(ServerRequestInterface $request): ResponseInterface { - return redirect($this->listUrl($request->getAttribute('tree'), $request->getQueryParams())); + $tree = Validator::attributes($request)->tree(); + + return redirect($this->listUrl($tree, $request->getQueryParams())); } /** @@ -145,11 +147,8 @@ class SourceListModule extends AbstractModule implements ModuleListInterface, Re */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); - assert($user instanceof UserInterface); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user); diff --git a/app/Module/StatisticsChartModule.php b/app/Module/StatisticsChartModule.php index 5d50addf88..327e037981 100644 --- a/app/Module/StatisticsChartModule.php +++ b/app/Module/StatisticsChartModule.php @@ -24,7 +24,7 @@ use Fisharebest\Webtrees\Http\Exceptions\HttpNotFoundException; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Statistics; -use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -134,10 +134,8 @@ class StatisticsChartModule extends AbstractModule implements ModuleChartInterfa */ public function getChartAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user); @@ -224,8 +222,7 @@ class StatisticsChartModule extends AbstractModule implements ModuleChartInterfa { $this->layout = 'layouts/ajax'; - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); return $this->viewResponse('modules/statistics-chart/custom', [ 'module' => $this, diff --git a/app/Module/StoriesModule.php b/app/Module/StoriesModule.php index 88a714e66c..ae4088f7ab 100644 --- a/app/Module/StoriesModule.php +++ b/app/Module/StoriesModule.php @@ -20,7 +20,6 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Http\Exceptions\HttpNotFoundException; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Http\RequestHandlers\ControlPanel; use Fisharebest\Webtrees\I18N; @@ -29,12 +28,11 @@ use Fisharebest\Webtrees\Menu; use Fisharebest\Webtrees\Services\HtmlService; use Fisharebest\Webtrees\Services\TreeService; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; -use function assert; -use function is_string; use function redirect; use function route; @@ -217,7 +215,7 @@ class StoriesModule extends AbstractModule implements ModuleConfigInterface, Mod $this->layout = 'layouts/administration'; // This module can't run without a tree - $tree = $request->getAttribute('tree'); + $tree = Validator::attributes($request)->treeOptional(); if (!$tree instanceof Tree) { $tree = $this->tree_service->all()->first(); @@ -281,12 +279,9 @@ class StoriesModule extends AbstractModule implements ModuleConfigInterface, Mod { $this->layout = 'layouts/administration'; - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - + $tree = Validator::attributes($request)->tree(); $block_id = (int) ($request->getQueryParams()['block_id'] ?? 0); - - $url = $request->getQueryParams()['url'] ?? ''; + $url = $request->getQueryParams()['url'] ?? ''; if ($block_id === 0) { // Creating a new story @@ -328,12 +323,9 @@ class StoriesModule extends AbstractModule implements ModuleConfigInterface, Mod */ public function postAdminEditAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - + $tree = Validator::attributes($request)->tree(); $block_id = (int) ($request->getQueryParams()['block_id'] ?? 0); - - $params = (array) $request->getParsedBody(); + $params = (array) $request->getParsedBody(); $xref = $params['xref']; $story_body = $params['story_body']; @@ -381,9 +373,7 @@ class StoriesModule extends AbstractModule implements ModuleConfigInterface, Mod */ public function postAdminDeleteAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - + $tree = Validator::attributes($request)->tree(); $block_id = $request->getQueryParams()['block_id']; DB::table('block_setting') @@ -410,8 +400,7 @@ class StoriesModule extends AbstractModule implements ModuleConfigInterface, Mod */ public function getShowListAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $stories = DB::table('block') ->where('module_name', '=', $this->name()) diff --git a/app/Module/SubmitterListModule.php b/app/Module/SubmitterListModule.php index 7140130a66..60b9e43ed2 100644 --- a/app/Module/SubmitterListModule.php +++ b/app/Module/SubmitterListModule.php @@ -21,12 +21,12 @@ namespace Fisharebest\Webtrees\Module; use Aura\Router\RouterContainer; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\GedcomRecord; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Submitter; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -147,7 +147,9 @@ class SubmitterListModule extends AbstractModule implements ModuleListInterface, */ public function getListAction(ServerRequestInterface $request): ResponseInterface { - return redirect($this->listUrl($request->getAttribute('tree'), $request->getQueryParams())); + $tree = Validator::attributes($request)->tree(); + + return redirect($this->listUrl($tree, $request->getQueryParams())); } /** @@ -157,11 +159,8 @@ class SubmitterListModule extends AbstractModule implements ModuleListInterface, */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); - assert($user instanceof UserInterface); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user); diff --git a/app/Module/ThemeSelectModule.php b/app/Module/ThemeSelectModule.php index 14106aa048..4f709a4e63 100644 --- a/app/Module/ThemeSelectModule.php +++ b/app/Module/ThemeSelectModule.php @@ -68,7 +68,10 @@ class ThemeSelectModule extends AbstractModule implements ModuleBlockInterface */ public function getBlock(Tree $tree, int $block_id, string $context, array $config = []): string { - $menu = app(ModuleThemeInterface::class)->menuThemes(); + $theme = app(ModuleThemeInterface::class); + assert($theme instanceof ModuleThemeInterface); + + $menu = $theme->menuThemes(); if ($menu instanceof Menu) { $content = '<ul class="nav text-justify" role="menu">' . view('components/menu-item', ['menu' => $menu]) . '</ul>'; diff --git a/app/Module/TimelineChartModule.php b/app/Module/TimelineChartModule.php index becc6f8040..57a509e206 100644 --- a/app/Module/TimelineChartModule.php +++ b/app/Module/TimelineChartModule.php @@ -29,6 +29,7 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Support\Collection; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -141,36 +142,28 @@ class TimelineChartModule extends AbstractModule implements ModuleChartInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); - $scale = (int) $request->getAttribute('scale'); - $xrefs = $request->getQueryParams()['xrefs'] ?? []; - $ajax = $request->getQueryParams()['ajax'] ?? ''; - - + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); + $scale = Validator::attributes($request)->isBetween(self::MINIMUM_SCALE, self::MAXIMUM_SCALE)->integer('scale'); + $xrefs = Validator::queryParams($request)->array('xrefs'); + $ajax = Validator::queryParams($request)->boolean('ajax', false); $params = (array) $request->getParsedBody(); - $add = $params['add'] ?? ''; - Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user); - - $scale = min($scale, self::MAXIMUM_SCALE); - $scale = max($scale, self::MINIMUM_SCALE); - $xrefs[] = $add; $xrefs = array_filter(array_unique($xrefs)); // Convert POST requests into GET requests for pretty URLs. if ($request->getMethod() === RequestMethodInterface::METHOD_POST) { return redirect(route(static::class, [ - 'scale' => $scale, 'tree' => $tree->name(), + 'scale' => $scale, 'xrefs' => $xrefs, ])); } + Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user); + // Find the requested individuals. $individuals = (new Collection($xrefs)) ->uniqueStrict() @@ -207,9 +200,7 @@ class TimelineChartModule extends AbstractModule implements ModuleChartInterface return $individual instanceof Individual && $individual->canShow(); }); - Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user); - - if ($ajax === '1') { + if ($ajax) { $this->layout = 'layouts/ajax'; return $this->chart($tree, $xrefs, $scale); diff --git a/app/Module/UserFavoritesModule.php b/app/Module/UserFavoritesModule.php index caffb0b1ef..1a59b2d016 100644 --- a/app/Module/UserFavoritesModule.php +++ b/app/Module/UserFavoritesModule.php @@ -26,13 +26,12 @@ use Fisharebest\Webtrees\Http\RequestHandlers\UserPage; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Support\Str; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; -use function assert; - /** * Class UserFavoritesModule */ @@ -164,10 +163,8 @@ class UserFavoritesModule extends AbstractModule implements ModuleBlockInterface */ public function postAddFavoriteAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); $params = (array) $request->getParsedBody(); $note = $params['note']; @@ -200,11 +197,9 @@ class UserFavoritesModule extends AbstractModule implements ModuleBlockInterface */ public function postDeleteFavoriteAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); - $favorite_id = $request->getQueryParams()['favorite_id']; + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); + $favorite_id = Validator::queryParams($request)->integer('favorite_id'); if (Auth::check()) { DB::table('favorite') diff --git a/app/Module/UserJournalModule.php b/app/Module/UserJournalModule.php index 65b384aa99..2ec8db52cb 100644 --- a/app/Module/UserJournalModule.php +++ b/app/Module/UserJournalModule.php @@ -27,13 +27,13 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\HtmlService; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Query\Expression; use Illuminate\Support\Str; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; -use function assert; use function redirect; /** @@ -158,8 +158,7 @@ class UserJournalModule extends AbstractModule implements ModuleBlockInterface */ public function getEditJournalAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); if (!Auth::check()) { throw new HttpAccessDeniedException(); @@ -199,8 +198,7 @@ class UserJournalModule extends AbstractModule implements ModuleBlockInterface */ public function postEditJournalAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); if (!Auth::check()) { throw new HttpAccessDeniedException(); @@ -244,9 +242,7 @@ class UserJournalModule extends AbstractModule implements ModuleBlockInterface */ public function postDeleteJournalAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - + $tree = Validator::attributes($request)->tree(); $news_id = $request->getQueryParams()['news_id']; DB::table('news') diff --git a/app/Module/UserMessagesModule.php b/app/Module/UserMessagesModule.php index d336c23b82..b4bdbd00e8 100644 --- a/app/Module/UserMessagesModule.php +++ b/app/Module/UserMessagesModule.php @@ -27,12 +27,12 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\UserService; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Support\Str; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; -use function assert; use function route; use function view; @@ -86,19 +86,16 @@ class UserMessagesModule extends AbstractModule implements ModuleBlockInterface */ public function postDeleteMessageAction(ServerRequestInterface $request): ResponseInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $params = (array) $request->getParsedBody(); - - $message_ids = $params['message_id'] ?? []; + $tree = Validator::attributes($request)->tree(); + $context = Validator::queryParams($request)->string('context'); + $message_ids = Validator::parsedBody($request)->array('message_ids'); DB::table('message') ->where('user_id', '=', Auth::id()) ->whereIn('message_id', $message_ids) ->delete(); - if ($request->getQueryParams()['context'] === ModuleBlockInterface::CONTEXT_USER_PAGE) { + if ($context === ModuleBlockInterface::CONTEXT_USER_PAGE) { $url = route(UserPage::class, ['tree' => $tree->name()]); } else { $url = route(TreePage::class, ['tree' => $tree->name()]); diff --git a/app/Report/ReportParserBase.php b/app/Report/ReportParserBase.php index f3d1d87395..94d501f4a6 100644 --- a/app/Report/ReportParserBase.php +++ b/app/Report/ReportParserBase.php @@ -21,7 +21,6 @@ namespace Fisharebest\Webtrees\Report; use DomainException; use Exception; -use Fisharebest\Webtrees\Registry; use XMLParser; use function call_user_func; diff --git a/app/Services/CaptchaService.php b/app/Services/CaptchaService.php index 942af11010..dc0c363648 100644 --- a/app/Services/CaptchaService.php +++ b/app/Services/CaptchaService.php @@ -20,6 +20,7 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Services; use Fisharebest\Webtrees\Session; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ServerRequestInterface; use Ramsey\Uuid\Uuid; @@ -69,9 +70,14 @@ class CaptchaService $x = Session::pull('captcha-x'); $y = Session::pull('captcha-y'); $z = Session::pull('captcha-z'); + + assert(is_int($t)); + assert(is_string($x)); + assert(is_string($y)); + assert(is_string($z)); - $value_x = $request->getParsedBody()[$x] ?? ''; - $value_y = $request->getParsedBody()[$y] ?? ''; + $value_x = Validator::parsedBody($request)->string($x, ''); + $value_y = Validator::parsedBody($request)->string($y, ''); // The captcha uses javascript to copy value z from field y to field x. // Expect it in both fields. diff --git a/app/Services/EmailService.php b/app/Services/EmailService.php index c4699aa05e..e2df35181a 100644 --- a/app/Services/EmailService.php +++ b/app/Services/EmailService.php @@ -23,6 +23,7 @@ use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Log; use Fisharebest\Webtrees\Site; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ServerRequestInterface; use Symfony\Component\Mailer\Exception\TransportExceptionInterface; use Symfony\Component\Mailer\Mailer; @@ -135,7 +136,7 @@ class EmailService $request = app(ServerRequestInterface::class); assert($request instanceof ServerRequestInterface); - $sendmail_command = $request->getAttribute('sendmail_command', '/usr/sbin/sendmail -bs'); + $sendmail_command = Validator::attributes($request)->string('sendmail_command', '/usr/sbin/sendmail -bs'); return new SendmailTransport($sendmail_command); diff --git a/app/Services/HomePageService.php b/app/Services/HomePageService.php index 267a2b8db0..dd91842953 100644 --- a/app/Services/HomePageService.php +++ b/app/Services/HomePageService.php @@ -25,11 +25,11 @@ use Fisharebest\Webtrees\Http\Exceptions\HttpNotFoundException; use Fisharebest\Webtrees\Module\ModuleBlockInterface; use Fisharebest\Webtrees\Module\ModuleInterface; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Support\Collection; use Psr\Http\Message\ServerRequestInterface; -use function assert; use function is_numeric; use function is_object; @@ -59,10 +59,8 @@ class HomePageService */ public function treeBlock(ServerRequestInterface $request): ModuleBlockInterface { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $block_id = (int) $request->getQueryParams()['block_id']; + $tree = Validator::attributes($request)->tree(); + $block_id = Validator::attributes($request)->integer('block_id'); $block = DB::table('block') ->where('block_id', '=', $block_id) @@ -91,7 +89,7 @@ class HomePageService */ public function userBlock(ServerRequestInterface $request, UserInterface $user): ModuleBlockInterface { - $block_id = (int) $request->getQueryParams()['block_id']; + $block_id = Validator::attributes($request)->integer('block_id'); $block = DB::table('block') ->where('block_id', '=', $block_id) diff --git a/app/Services/MediaFileService.php b/app/Services/MediaFileService.php index 13789fcb9d..ba34994f2c 100644 --- a/app/Services/MediaFileService.php +++ b/app/Services/MediaFileService.php @@ -24,6 +24,7 @@ use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Query\Expression; use Illuminate\Database\Query\JoinClause; @@ -39,7 +40,6 @@ use RuntimeException; use function array_combine; use function array_diff; use function array_intersect; -use function assert; use function dirname; use function explode; use function ini_get; @@ -156,8 +156,7 @@ class MediaFileService */ public function uploadFile(ServerRequestInterface $request): string { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); + $tree = Validator::attributes($request)->tree(); $data_filesystem = Registry::filesystem()->data(); diff --git a/app/Services/UserService.php b/app/Services/UserService.php index c660689da1..592a0e9ecc 100644 --- a/app/Services/UserService.php +++ b/app/Services/UserService.php @@ -26,15 +26,14 @@ use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Http\RequestHandlers\ContactPage; use Fisharebest\Webtrees\Http\RequestHandlers\MessagePage; use Fisharebest\Webtrees\Individual; -use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\User; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Query\Builder; use Illuminate\Database\Query\JoinClause; use Illuminate\Support\Collection; use Psr\Http\Message\ServerRequestInterface; -use function assert; use function max; use function time; @@ -393,10 +392,8 @@ class UserService */ public function contactLink(User $contact_user, ServerRequestInterface $request): string { - $tree = $request->getAttribute('tree'); - assert($tree instanceof Tree); - - $user = $request->getAttribute('user'); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); if ($contact_user->getPreference(UserInterface::PREF_CONTACT_METHOD) === 'mailto') { $url = 'mailto:' . $contact_user->email(); diff --git a/app/Session.php b/app/Session.php index e796d26f20..67dfc86c18 100644 --- a/app/Session.php +++ b/app/Session.php @@ -63,7 +63,7 @@ class Session // Store sessions in the database session_set_save_handler(new SessionDatabaseHandler($request)); - $url = $request->getAttribute('base_url'); + $url = Validator::attributes($request)->string('base_url'); $secure = parse_url($url, PHP_URL_SCHEME) === 'https'; $domain = (string) parse_url($url, PHP_URL_HOST); $path = (string) parse_url($url, PHP_URL_PATH); diff --git a/app/SessionDatabaseHandler.php b/app/SessionDatabaseHandler.php index 3dbda3a9ea..8b514c2ffd 100644 --- a/app/SessionDatabaseHandler.php +++ b/app/SessionDatabaseHandler.php @@ -87,7 +87,7 @@ class SessionDatabaseHandler implements SessionHandlerInterface */ public function write($id, $data): bool { - $ip_address = $this->request->getAttribute('client-ip'); + $ip_address = Validator::attributes($this->request)->string('client-ip'); $session_time = time(); $user_id = (int) Auth::id(); diff --git a/app/Statistics/Repository/IndividualRepository.php b/app/Statistics/Repository/IndividualRepository.php index cc62465d2d..ef6b9f3b52 100644 --- a/app/Statistics/Repository/IndividualRepository.php +++ b/app/Statistics/Repository/IndividualRepository.php @@ -582,10 +582,13 @@ class IndividualRepository implements IndividualRepositoryInterface break; } - //find a module providing individual lists - $module = app(ModuleService::class)->findByComponent(ModuleListInterface::class, $this->tree, Auth::user())->first(static function (ModuleInterface $module): bool { - return $module instanceof IndividualListModule; - }); + // find a module providing individual lists + $module_service = app(ModuleService::class); + assert($module_service instanceof ModuleService); + + $module = $module_service + ->findByComponent(ModuleListInterface::class, $this->tree, Auth::user()) + ->first(static fn (ModuleInterface $module): bool => $module instanceof IndividualListModule); if ($type === 'list') { return view('lists/surnames-bullet-list', [ diff --git a/app/Statistics/Repository/ServerRepository.php b/app/Statistics/Repository/ServerRepository.php index 19be90ed93..c29df81dbb 100644 --- a/app/Statistics/Repository/ServerRepository.php +++ b/app/Statistics/Repository/ServerRepository.php @@ -21,7 +21,6 @@ namespace Fisharebest\Webtrees\Statistics\Repository; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; -use Fisharebest\Webtrees\Site; use Fisharebest\Webtrees\SiteUser; use Fisharebest\Webtrees\Statistics\Repository\Interfaces\ServerRepositoryInterface; diff --git a/app/Tree.php b/app/Tree.php index ddc6a605d6..80fa5e6d12 100644 --- a/app/Tree.php +++ b/app/Tree.php @@ -30,7 +30,9 @@ use League\Flysystem\FilesystemOperator; use function app; use function array_key_exists; +use function assert; use function date; +use function is_string; use function str_starts_with; use function strtoupper; use function substr_replace; @@ -389,7 +391,10 @@ class Tree if (Auth::user()->getPreference(UserInterface::PREF_AUTO_ACCEPT_EDITS) === '1') { $record = Registry::gedcomRecordFactory()->new($xref, $gedcom, null, $this); - app(PendingChangesService::class)->acceptRecord($record); + $pending_changes_service = app(PendingChangesService::class); + assert($pending_changes_service instanceof PendingChangesService); + + $pending_changes_service->acceptRecord($record); return $record; } @@ -432,7 +437,10 @@ class Tree if (Auth::user()->getPreference(UserInterface::PREF_AUTO_ACCEPT_EDITS) === '1') { $record = Registry::familyFactory()->new($xref, $gedcom, null, $this); - app(PendingChangesService::class)->acceptRecord($record); + $pending_changes_service = app(PendingChangesService::class); + assert($pending_changes_service instanceof PendingChangesService); + + $pending_changes_service->acceptRecord($record); return $record; } @@ -475,7 +483,10 @@ class Tree if (Auth::user()->getPreference(UserInterface::PREF_AUTO_ACCEPT_EDITS) === '1') { $record = Registry::individualFactory()->new($xref, $gedcom, null, $this); - app(PendingChangesService::class)->acceptRecord($record); + $pending_changes_service = app(PendingChangesService::class); + assert($pending_changes_service instanceof PendingChangesService); + + $pending_changes_service->acceptRecord($record); return $record; } @@ -518,7 +529,10 @@ class Tree if (Auth::user()->getPreference(UserInterface::PREF_AUTO_ACCEPT_EDITS) === '1') { $record = Registry::mediaFactory()->new($xref, $gedcom, null, $this); - app(PendingChangesService::class)->acceptRecord($record); + $pending_changes_service = app(PendingChangesService::class); + assert($pending_changes_service instanceof PendingChangesService); + + $pending_changes_service->acceptRecord($record); return $record; } @@ -562,11 +576,13 @@ class Tree $individual = Registry::individualFactory()->make($this->getPreference('PEDIGREE_ROOT_ID'), $this); } if ($individual === null) { - $xref = (string) DB::table('individuals') + $xref = DB::table('individuals') ->where('i_file', '=', $this->id()) ->min('i_id'); - $individual = Registry::individualFactory()->make($xref, $this); + if (is_string($xref)) { + $individual = Registry::individualFactory()->make($xref, $this); + } } if ($individual === null) { // always return a record diff --git a/app/TreeUser.php b/app/TreeUser.php index c268e0f8ba..de2b7ab723 100644 --- a/app/TreeUser.php +++ b/app/TreeUser.php @@ -22,6 +22,8 @@ namespace Fisharebest\Webtrees; use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Services\UserService; +use function assert; + /** * A tree can act as a user, for example to send email. */ @@ -57,6 +59,8 @@ class TreeUser implements UserInterface public function email(): string { $user_service = app(UserService::class); + assert($user_service instanceof UserService); + $contact_id = (int) $this->getPreference('CONTACT_USER_ID'); if ($contact_id !== 0) { diff --git a/app/User.php b/app/User.php index c091297863..ada09e242c 100644 --- a/app/User.php +++ b/app/User.php @@ -23,6 +23,8 @@ use Closure; use Fisharebest\Webtrees\Contracts\UserInterface; use Illuminate\Database\Capsule\Manager as DB; +use function is_string; + /** * Provide an interface to the wt_user table. */ @@ -235,7 +237,7 @@ class User implements UserInterface ->where('user_id', '=', $this->id()) ->value('password'); - if ($password_hash !== null && password_verify($password, $password_hash)) { + if (is_string($password_hash) && password_verify($password, $password_hash)) { if (password_needs_rehash($password_hash, PASSWORD_DEFAULT)) { $this->setPassword($password); } diff --git a/app/Validator.php b/app/Validator.php index 3423cb6db3..c71674c8b8 100644 --- a/app/Validator.php +++ b/app/Validator.php @@ -19,7 +19,9 @@ declare(strict_types=1); namespace Fisharebest\Webtrees; +use Aura\Router\Route; use Closure; +use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Http\Exceptions\HttpBadRequestException; use LogicException; use Psr\Http\Message\ServerRequestInterface; @@ -38,7 +40,7 @@ use function str_starts_with; */ class Validator { - /** @var array<string|array<string>> */ + /** @var array<string|Tree|UserInterface|array<string>> */ private array $parameters; /** @var array<Closure> */ @@ -57,6 +59,16 @@ class Validator * * @return self */ + public static function attributes(ServerRequestInterface $request): self + { + return new self($request->getAttributes()); + } + + /** + * @param ServerRequestInterface $request + * + * @return self + */ public static function parsedBody(ServerRequestInterface $request): self { return new self((array) $request->getParsedBody()); @@ -73,6 +85,16 @@ class Validator } /** + * @param ServerRequestInterface $request + * + * @return self + */ + public static function serverParams(ServerRequestInterface $request): self + { + return new self($request->getServerParams()); + } + + /** * @param int $minimum * @param int $maximum * @@ -140,6 +162,22 @@ class Validator /** * @return $this */ + public function isTag(): self + { + $this->rules[] = static function (?string $value): ?string { + if (is_string($value) && preg_match('/^' . Gedcom::REGEX_TAG . '$/', $value) === 1) { + return $value; + } + + return null; + }; + + return $this; + } + + /** + * @return $this + */ public function isXref(): self { $this->rules[] = static function (?string $value): ?string { @@ -158,7 +196,7 @@ class Validator * * @return array<string>|null */ - public function array(string $parameter): ?array + public function optionalArray(string $parameter): ?array { $value = $this->parameters[$parameter] ?? null; @@ -176,7 +214,7 @@ class Validator * * @return int|null */ - public function integer(string $parameter): ?int + public function optionalInteger(string $parameter): ?int { $value = $this->parameters[$parameter] ?? null; @@ -196,7 +234,7 @@ class Validator * * @return string|null */ - public function string(string $parameter): ?string + public function optionalString(string $parameter): ?string { $value = $this->parameters[$parameter] ?? null; @@ -210,29 +248,80 @@ class Validator } /** + * @param string $parameter + * @param bool|null $default + * + * @return bool + */ + public function boolean(string $parameter, bool $default = null): bool + { + $value = $this->parameters[$parameter] ?? null; + + if (in_array($value, ['1', true], true)) { + return true; + } + + if (in_array($value, ['0', '', false], true)) { + return false; + } + + if ($default === null) { + throw new HttpBadRequestException(I18N::translate('The parameter “%s” is missing.', $parameter)); + } + + return $default; + } + + /** * @param string $parameter * * @return array<string> */ - public function requiredArray(string $parameter): array + public function array(string $parameter): array { - $value = $this->array($parameter); + $value = $this->parameters[$parameter] ?? null; - if ($value === null) { - throw new HttpBadRequestException(I18N::translate('The parameter “%s” is missing.', $parameter)); + if (!is_array($value)) { + $value = null; } + $callback = static fn (?array $value, Closure $rule): ?array => $rule($value); + + $value = array_reduce($this->rules, $callback, $value); + $value ??= []; + + $check_utf8 = static function($v, $k) use ($parameter) { + if (is_string($k) && !preg_match('//u', $k) || is_string($v) && !preg_match('//u', $v)) { + throw new HttpBadRequestException(I18N::translate('The parameter “%s” is missing.', $parameter)); + } + }; + + array_walk_recursive($value, $check_utf8); + return $value; } /** - * @param string $parameter + * @param string $parameter + * @param int|null $default * * @return int */ - public function requiredInteger(string $parameter): int + public function integer(string $parameter, int $default = null): int { - $value = $this->integer($parameter); + $value = $this->parameters[$parameter] ?? null; + + if (is_string($value) && ctype_digit($value)) { + $value = (int) $value; + } else { + $value = null; + } + + $callback = static fn (?int $value, Closure $rule): ?int => $rule($value); + + $value = array_reduce($this->rules, $callback, $value); + + $value ??= $default; if ($value === null) { throw new HttpBadRequestException(I18N::translate('The parameter “%s” is missing.', $parameter)); @@ -244,16 +333,90 @@ class Validator /** * @param string $parameter * + * @return Route + */ + public function route(string $parameter = 'route'): Route + { + $value = $this->parameters[$parameter] ?? null; + + if ($value instanceof Route) { + return $value; + } + + throw new HttpBadRequestException(I18N::translate('The parameter “%s” is missing.', $parameter)); + } + + /** + * @param string $parameter + * @param string|null $default + * * @return string */ - public function requiredString(string $parameter): string + public function string(string $parameter, string $default = null): string { - $value = $this->string($parameter); + $value = $this->parameters[$parameter] ?? null; - if ($value === null) { + if (!is_string($value)) { + $value = null; + } + + $callback = static fn (?string $value, Closure $rule): ?string => $rule($value); + + $value = array_reduce($this->rules, $callback, $value); + $value ??= $default; + + if ($value === null || preg_match('//u', $value) !== 1) { throw new HttpBadRequestException(I18N::translate('The parameter “%s” is missing.', $parameter)); } return $value; } + + /** + * @param string $parameter + * + * @return Tree + */ + public function tree(string $parameter = 'tree'): Tree + { + $value = $this->parameters[$parameter] ?? null; + + if ($value instanceof Tree) { + return $value; + } + + throw new HttpBadRequestException(I18N::translate('The parameter “%s” is missing.', $parameter)); + } + + /** + * @param string $parameter + * + * @return Tree|null + */ + public function treeOptional(string $parameter = 'tree'): ?Tree + { + $value = $this->parameters[$parameter] ?? null; + + if ($value === null || $value instanceof Tree) { + return $value; + } + + throw new HttpBadRequestException(I18N::translate('The parameter “%s” is missing.', $parameter)); + } + + /** + * @param string $parameter + * + * @return UserInterface + */ + public function user(string $parameter = 'user'): UserInterface + { + $value = $this->parameters[$parameter] ?? null; + + if ($value instanceof UserInterface) { + return $value; + } + + throw new HttpBadRequestException(I18N::translate('The parameter “%s” is missing.', $parameter)); + } } |
