diff options
| author | Greg Roach <greg@subaqua.co.uk> | 2022-11-15 13:20:16 +0000 |
|---|---|---|
| committer | Greg Roach <greg@subaqua.co.uk> | 2022-11-18 11:55:56 +0000 |
| commit | 748dbe155a6d19d66918ad136947fa23ee8f8469 (patch) | |
| tree | ed4743592d3b0aea968f9cbae7e5d32c00b546fe /app | |
| parent | f783aa1f4cd6d54a90d24a3d6be2996a3951fced (diff) | |
| download | webtrees-748dbe155a6d19d66918ad136947fa23ee8f8469.tar.gz webtrees-748dbe155a6d19d66918ad136947fa23ee8f8469.tar.bz2 webtrees-748dbe155a6d19d66918ad136947fa23ee8f8469.zip | |
Use Validator
Diffstat (limited to 'app')
155 files changed, 997 insertions, 1135 deletions
diff --git a/app/Http/Middleware/Router.php b/app/Http/Middleware/Router.php index a45f53f84a..c051326460 100644 --- a/app/Http/Middleware/Router.php +++ b/app/Http/Middleware/Router.php @@ -80,7 +80,7 @@ class Router implements MiddlewareInterface if (!Validator::attributes($request)->boolean('rewrite_urls', false)) { // Ugly URLs store the path in a query parameter. - $url_route = $request->getQueryParams()['route'] ?? ''; + $url_route = Validator::queryParams($request)->string('route', ''); $uri = $request->getUri()->withPath($url_route); $pretty = $request->withUri($uri); } diff --git a/app/Http/RequestHandlers/AbstractModuleComponentAction.php b/app/Http/RequestHandlers/AbstractModuleComponentAction.php index 5320b48e11..2253a945f4 100644 --- a/app/Http/RequestHandlers/AbstractModuleComponentAction.php +++ b/app/Http/RequestHandlers/AbstractModuleComponentAction.php @@ -91,15 +91,12 @@ abstract class AbstractModuleComponentAction implements RequestHandlerInterface protected function updateAccessLevel(string $interface, ServerRequestInterface $request): void { $modules = $this->module_service->findByInterface($interface, true); - - $params = (array) $request->getParsedBody(); - - $trees = $this->tree_service->all(); + $trees = $this->tree_service->all(); foreach ($modules as $module) { foreach ($trees as $tree) { $key = 'access-' . $module->name() . '-' . $tree->id(); - $access_level = (int) ($params[$key] ?? 0); + $access_level = Validator::parsedBody($request)->integer($key); if ($access_level !== $module->accessLevel($tree, $interface)) { DB::table('module_privacy')->updateOrInsert([ @@ -126,11 +123,8 @@ abstract class AbstractModuleComponentAction implements RequestHandlerInterface protected function updateOrder(string $interface, string $column, ServerRequestInterface $request): void { $modules = $this->module_service->findByInterface($interface, true); - - $params = (array) $request->getParsedBody(); - - $order = (array) ($params['order'] ?? []); - $order = array_flip($order); + $order = Validator::parsedBody($request)->array('order'); + $order = array_flip($order); foreach ($modules as $module) { DB::table('module') diff --git a/app/Http/RequestHandlers/AccountUpdate.php b/app/Http/RequestHandlers/AccountUpdate.php index 420bc7c1a3..fb231a2a4d 100644 --- a/app/Http/RequestHandlers/AccountUpdate.php +++ b/app/Http/RequestHandlers/AccountUpdate.php @@ -64,16 +64,14 @@ class AccountUpdate implements RequestHandlerInterface assert($user instanceof User); - $params = (array) $request->getParsedBody(); - - $contact_method = $params['contact-method']; - $email = $params['email']; - $language = $params['language']; - $real_name = $params['real_name']; - $password = $params['password']; - $time_zone = $params['timezone']; - $user_name = $params['user_name']; - $visible_online = $params['visible-online'] ?? ''; + $contact_method = Validator::parsedBody($request)->string('contact-method'); + $email = Validator::parsedBody($request)->string('email'); + $language = Validator::parsedBody($request)->string('language'); + $real_name = Validator::parsedBody($request)->string('real_name'); + $password = Validator::parsedBody($request)->string('password'); + $time_zone = Validator::parsedBody($request)->string('timezone'); + $user_name = Validator::parsedBody($request)->string('user_name'); + $visible_online = Validator::parsedBody($request)->boolean('visible-online', false); // Change the password if ($password !== '') { @@ -102,10 +100,10 @@ class AccountUpdate implements RequestHandlerInterface $user->setPreference(UserInterface::PREF_CONTACT_METHOD, $contact_method); $user->setPreference(UserInterface::PREF_LANGUAGE, $language); $user->setPreference(UserInterface::PREF_TIME_ZONE, $time_zone); - $user->setPreference(UserInterface::PREF_IS_VISIBLE_ONLINE, $visible_online); + $user->setPreference(UserInterface::PREF_IS_VISIBLE_ONLINE, (string) $visible_online); if ($tree instanceof Tree) { - $default_xref = $params['default-xref']; + $default_xref = Validator::parsedBody($request)->string('default-xref'); $tree->setUserPreference($user, UserInterface::PREF_TREE_DEFAULT_XREF, $default_xref); } diff --git a/app/Http/RequestHandlers/AddMediaFileAction.php b/app/Http/RequestHandlers/AddMediaFileAction.php index c855df9714..1fb1fc1c51 100644 --- a/app/Http/RequestHandlers/AddMediaFileAction.php +++ b/app/Http/RequestHandlers/AddMediaFileAction.php @@ -66,9 +66,8 @@ class AddMediaFileAction implements RequestHandlerInterface $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'] ?? ''; + $title = Validator::parsedBody($request)->string('title'); + $type = Validator::parsedBody($request)->string('type'); $file = $this->media_file_service->uploadFile($request); diff --git a/app/Http/RequestHandlers/AddNewFact.php b/app/Http/RequestHandlers/AddNewFact.php index f339e6419d..7b7fb9a2f3 100644 --- a/app/Http/RequestHandlers/AddNewFact.php +++ b/app/Http/RequestHandlers/AddNewFact.php @@ -67,7 +67,7 @@ class AddNewFact implements RequestHandlerInterface throw new HttpAccessDeniedException(); } - $include_hidden = (bool) ($request->getQueryParams()['include_hidden'] ?? false); + $include_hidden = Validator::queryParams($request)->boolean('include_hidden', false); $record = Registry::gedcomRecordFactory()->make($xref, $tree); $record = Auth::checkRecordAccess($record, true); diff --git a/app/Http/RequestHandlers/AdminMediaFileThumbnail.php b/app/Http/RequestHandlers/AdminMediaFileThumbnail.php index 58070e8a74..70a43e7c1a 100644 --- a/app/Http/RequestHandlers/AdminMediaFileThumbnail.php +++ b/app/Http/RequestHandlers/AdminMediaFileThumbnail.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 AdminMediaFileThumbnail 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()->thumbnailResponse($filesystem, $path, 120, 120, 'contain'); } diff --git a/app/Http/RequestHandlers/CalendarAction.php b/app/Http/RequestHandlers/CalendarAction.php index 2771f9a470..713786ef11 100644 --- a/app/Http/RequestHandlers/CalendarAction.php +++ b/app/Http/RequestHandlers/CalendarAction.php @@ -39,14 +39,16 @@ class CalendarAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - $view = Validator::attributes($request)->string('view'); - - $params = (array) $request->getParsedBody(); - - $params['tree'] = $tree->name(); - $params['view'] = $view; - - return redirect(route(CalendarPage::class, $params)); + return redirect(route(CalendarPage::class, [ + 'tree' => Validator::attributes($request)->tree()->name(), + 'view' => Validator::attributes($request)->isInArray(['day', 'month', 'year'])->string('view'), + 'cal' => Validator::parsedBody($request)->string('cal'), + 'day' => Validator::parsedBody($request)->integer('day'), + 'month' => Validator::parsedBody($request)->string('month'), + 'year' => Validator::parsedBody($request)->integer('year'), + 'filterev' => Validator::parsedBody($request)->string('filterev'), + 'filterof' => Validator::parsedBody($request)->string('filterof'), + 'filtersx' => Validator::parsedBody($request)->string('filtersx'), + ])); } } diff --git a/app/Http/RequestHandlers/CalendarEvents.php b/app/Http/RequestHandlers/CalendarEvents.php index 2018400670..62114f6158 100644 --- a/app/Http/RequestHandlers/CalendarEvents.php +++ b/app/Http/RequestHandlers/CalendarEvents.php @@ -75,17 +75,15 @@ class CalendarEvents implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - $view = Validator::attributes($request)->isInArray(['day', 'month', 'year'])->string('view'); - $CALENDAR_FORMAT = $tree->getPreference('CALENDAR_FORMAT'); - - $cal = $request->getQueryParams()['cal'] ?? ''; - $day = $request->getQueryParams()['day'] ?? ''; - $month = $request->getQueryParams()['month'] ?? ''; - $year = $request->getQueryParams()['year'] ?? ''; - $filterev = $request->getQueryParams()['filterev'] ?? 'BIRT-MARR-DEAT'; - $filterof = $request->getQueryParams()['filterof'] ?? 'all'; - $filtersx = $request->getQueryParams()['filtersx'] ?? ''; + $tree = Validator::attributes($request)->tree(); + $view = Validator::attributes($request)->isInArray(['day', 'month', 'year'])->string('view'); + $cal = Validator::queryParams($request)->string('cal'); + $day = Validator::queryParams($request)->string('day'); + $month = Validator::queryParams($request)->string('month'); + $year = Validator::queryParams($request)->string('year'); + $filterev = Validator::queryParams($request)->string('filterev'); + $filterof = Validator::queryParams($request)->string('filterof'); + $filtersx = Validator::queryParams($request)->string('filtersx'); $ged_date = new Date($cal . ' ' . $day . ' ' . $month . ' ' . $year); $cal_date = $ged_date->minimumDate(); @@ -94,6 +92,8 @@ class CalendarEvents implements RequestHandlerInterface $days_in_month = $cal_date->daysInMonth(); $days_in_week = $cal_date->daysInWeek(); + $CALENDAR_FORMAT = $tree->getPreference('CALENDAR_FORMAT'); + // Day and year share the same layout. if ($view !== 'month') { if ($view === 'day') { diff --git a/app/Http/RequestHandlers/CalendarPage.php b/app/Http/RequestHandlers/CalendarPage.php index 16420370bd..e23aaf61de 100644 --- a/app/Http/RequestHandlers/CalendarPage.php +++ b/app/Http/RequestHandlers/CalendarPage.php @@ -58,13 +58,13 @@ class CalendarPage implements RequestHandlerInterface { $tree = Validator::attributes($request)->tree(); $view = Validator::attributes($request)->isInArray(['day', 'month', 'year'])->string('view'); - $cal = $request->getQueryParams()['cal'] ?? ''; - $day = $request->getQueryParams()['day'] ?? ''; - $month = $request->getQueryParams()['month'] ?? ''; - $year = $request->getQueryParams()['year'] ?? ''; - $filterev = $request->getQueryParams()['filterev'] ?? 'BIRT-MARR-DEAT'; - $filterof = $request->getQueryParams()['filterof'] ?? 'all'; - $filtersx = $request->getQueryParams()['filtersx'] ?? ''; + $cal = Validator::queryParams($request)->string('cal', ''); + $day = Validator::queryParams($request)->string('day', ''); + $month = Validator::queryParams($request)->string('month', ''); + $year = Validator::queryParams($request)->string('year', ''); + $filterev = Validator::queryParams($request)->string('filterev', 'BIRT-MARR-DEAT'); + $filterof = Validator::queryParams($request)->string('filterof', 'all'); + $filtersx = Validator::queryParams($request)->string('filtersx', ''); if ($cal . $day . $month . $year === '') { // No date specified? Use the most likely calendar diff --git a/app/Http/RequestHandlers/ChangeFamilyMembersAction.php b/app/Http/RequestHandlers/ChangeFamilyMembersAction.php index 25568b18a1..ced4113e3d 100644 --- a/app/Http/RequestHandlers/ChangeFamilyMembersAction.php +++ b/app/Http/RequestHandlers/ChangeFamilyMembersAction.php @@ -42,19 +42,14 @@ class ChangeFamilyMembersAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - - $params = (array) $request->getParsedBody(); - - $xref = $params['xref']; + $tree = Validator::attributes($request)->tree(); + $xref = Validator::parsedBody($request)->isXref()->string('xref'); $family = Registry::familyFactory()->make($xref, $tree); $family = Auth::checkFamilyAccess($family, true); - $params = (array) $request->getParsedBody(); - - $HUSB = $params['HUSB'] ?? ''; - $WIFE = $params['WIFE'] ?? ''; - $CHIL = $params['CHIL'] ?? []; + $HUSB = Validator::parsedBody($request)->isXref()->string('HUSB', ''); + $WIFE = Validator::parsedBody($request)->isXref()->string('WIFE', ''); + $CHIL = Validator::parsedBody($request)->isXref()->array('CHIL'); // Current family members $old_father = $family->husband(); diff --git a/app/Http/RequestHandlers/ChangeFamilyMembersPage.php b/app/Http/RequestHandlers/ChangeFamilyMembersPage.php index 8560ee24f1..19a05fe72e 100644 --- a/app/Http/RequestHandlers/ChangeFamilyMembersPage.php +++ b/app/Http/RequestHandlers/ChangeFamilyMembersPage.php @@ -43,11 +43,10 @@ class ChangeFamilyMembersPage implements RequestHandlerInterface public function handle(ServerRequestInterface $request): ResponseInterface { $tree = Validator::attributes($request)->tree(); - $xref = $request->getQueryParams()['xref']; + $xref = Validator::queryParams($request)->string('xref'); $family = Registry::familyFactory()->make($xref, $tree); $family = Auth::checkFamilyAccess($family, true); - - $title = I18N::translate('Change family members') . ' – ' . $family->fullName(); + $title = I18N::translate('Change family members') . ' – ' . $family->fullName(); return $this->viewResponse('edit/change-family-members', [ 'tree' => $tree, diff --git a/app/Http/RequestHandlers/CreateLocationAction.php b/app/Http/RequestHandlers/CreateLocationAction.php index b754a5f520..1e36e88f84 100644 --- a/app/Http/RequestHandlers/CreateLocationAction.php +++ b/app/Http/RequestHandlers/CreateLocationAction.php @@ -39,9 +39,7 @@ class CreateLocationAction implements RequestHandlerInterface public function handle(ServerRequestInterface $request): ResponseInterface { $tree = Validator::attributes($request)->tree(); - - $params = (array) $request->getParsedBody(); - $name = $params['location_name']; + $name = Validator::parsedBody($request)->string('name'); $gedcom = "0 @@ _LOC\n1 NAME " . $name; diff --git a/app/Http/RequestHandlers/CreateMediaObjectAction.php b/app/Http/RequestHandlers/CreateMediaObjectAction.php index 99ec37fad8..b82b02996d 100644 --- a/app/Http/RequestHandlers/CreateMediaObjectAction.php +++ b/app/Http/RequestHandlers/CreateMediaObjectAction.php @@ -63,11 +63,10 @@ class CreateMediaObjectAction implements RequestHandlerInterface public function handle(ServerRequestInterface $request): ResponseInterface { $tree = Validator::attributes($request)->tree(); - $params = (array) $request->getParsedBody(); - $note = $params['media-note'] ?? ''; - $title = $params['title'] ?? ''; - $type = $params['type'] ?? ''; - $restriction = $params['restriction'] ?? ''; + $note = Validator::parsedBody($request)->string('media-note'); + $title = Validator::parsedBody($request)->string('title'); + $type = Validator::parsedBody($request)->string('type'); + $restriction = Validator::parsedBody($request)->string('restriction'); $file = $this->media_file_service->uploadFile($request); diff --git a/app/Http/RequestHandlers/CreateMediaObjectFromFile.php b/app/Http/RequestHandlers/CreateMediaObjectFromFile.php index b4026531c3..10b450332d 100644 --- a/app/Http/RequestHandlers/CreateMediaObjectFromFile.php +++ b/app/Http/RequestHandlers/CreateMediaObjectFromFile.php @@ -36,7 +36,7 @@ class CreateMediaObjectFromFile implements RequestHandlerInterface private PendingChangesService $pending_changes_service; /** - * CreateMediaObjectFromFileAction constructor. + * CreateMediaObjectFromFile constructor. * * @param MediaFileService $media_file_service * @param PendingChangesService $pending_changes_service @@ -55,11 +55,10 @@ class CreateMediaObjectFromFile implements RequestHandlerInterface public function handle(ServerRequestInterface $request): ResponseInterface { $tree = Validator::attributes($request)->tree(); - $params = (array) $request->getParsedBody(); - $file = $params['file'] ?? ''; - $type = $params['type'] ?? ''; - $title = $params['title'] ?? ''; - $note = $params['note'] ?? ''; + $file = Validator::parsedBody($request)->string('file'); + $type = Validator::parsedBody($request)->string('type'); + $title = Validator::parsedBody($request)->string('title'); + $note = Validator::parsedBody($request)->string('note'); $gedcom = "0 @@ OBJE\n" . $this->media_file_service->createMediaFileGedcom($file, $type, $title, $note); diff --git a/app/Http/RequestHandlers/CreateNoteAction.php b/app/Http/RequestHandlers/CreateNoteAction.php index 4876e7f28c..2c6f7fe986 100644 --- a/app/Http/RequestHandlers/CreateNoteAction.php +++ b/app/Http/RequestHandlers/CreateNoteAction.php @@ -41,9 +41,8 @@ class CreateNoteAction implements RequestHandlerInterface public function handle(ServerRequestInterface $request): ResponseInterface { $tree = Validator::attributes($request)->tree(); - $params = (array) $request->getParsedBody(); - $note = $params['note']; - $restriction = $params['restriction']; + $note = Validator::parsedBody($request)->string('note'); + $restriction = Validator::parsedBody($request)->isInArray(['none', 'privacy', 'confidential', 'locked'])->string('restriction'); // Convert HTML line endings to GEDCOM continuations $note = strtr($note, ["\r\n" => "\n1 CONT "]); diff --git a/app/Http/RequestHandlers/CreateSourceAction.php b/app/Http/RequestHandlers/CreateSourceAction.php index 022774a716..34e88a65ad 100644 --- a/app/Http/RequestHandlers/CreateSourceAction.php +++ b/app/Http/RequestHandlers/CreateSourceAction.php @@ -40,17 +40,15 @@ class CreateSourceAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - - $params = (array) $request->getParsedBody(); - $title = $params['source-title']; - $abbreviation = $params['source-abbreviation']; - $author = $params['source-author']; - $publication = $params['source-publication']; - $repository = $params['source-repository']; - $call_number = $params['source-call-number']; - $text = $params['source-text']; - $restriction = $params['restriction']; + $tree = Validator::attributes($request)->tree(); + $title = Validator::parsedBody($request)->string('source-title'); + $abbreviation = Validator::parsedBody($request)->string('source-abbreviation'); + $author = Validator::parsedBody($request)->string('source-author'); + $publication = Validator::parsedBody($request)->string('source-publication'); + $repository = Validator::parsedBody($request)->string('source-repository'); + $call_number = Validator::parsedBody($request)->string('source-call-number'); + $text = Validator::parsedBody($request)->string('source-text'); + $restriction = Validator::parsedBody($request)->string('restriction'); // Fix non-printing characters $title = trim(preg_replace('/\s+/', ' ', $title)); diff --git a/app/Http/RequestHandlers/CreateSubmissionAction.php b/app/Http/RequestHandlers/CreateSubmissionAction.php index cfe733e945..bf7798e4ac 100644 --- a/app/Http/RequestHandlers/CreateSubmissionAction.php +++ b/app/Http/RequestHandlers/CreateSubmissionAction.php @@ -39,8 +39,7 @@ class CreateSubmissionAction implements RequestHandlerInterface public function handle(ServerRequestInterface $request): ResponseInterface { $tree = Validator::attributes($request)->tree(); - $params = (array) $request->getParsedBody(); - $submitter = $params['submitter']; + $submitter = Validator::parsedBody($request)->string('submitter'); $gedcom = "0 @@ SUBN\n1 SUBM @" . $submitter . '@'; diff --git a/app/Http/RequestHandlers/CreateSubmitterAction.php b/app/Http/RequestHandlers/CreateSubmitterAction.php index 027022829c..835e85a8c0 100644 --- a/app/Http/RequestHandlers/CreateSubmitterAction.php +++ b/app/Http/RequestHandlers/CreateSubmitterAction.php @@ -41,12 +41,11 @@ class CreateSubmitterAction implements RequestHandlerInterface public function handle(ServerRequestInterface $request): ResponseInterface { $tree = Validator::attributes($request)->tree(); - $params = (array) $request->getParsedBody(); - $name = $params['submitter_name']; - $address = $params['submitter_address']; - $email = $params['submitter_email']; - $phone = $params['submitter_phone']; - $restriction = $params['restriction']; + $name = Validator::parsedBody($request)->string('submitter_name'); + $address = Validator::parsedBody($request)->string('submitter_address'); + $email = Validator::parsedBody($request)->string('submitter_email'); + $phone = Validator::parsedBody($request)->string('submitter_phone'); + $restriction = Validator::parsedBody($request)->string('restriction'); // Fix non-printing characters $name = trim(preg_replace('/\s+/', ' ', $name)); diff --git a/app/Http/RequestHandlers/CreateTreeAction.php b/app/Http/RequestHandlers/CreateTreeAction.php index c9fc04b22a..d24181498f 100644 --- a/app/Http/RequestHandlers/CreateTreeAction.php +++ b/app/Http/RequestHandlers/CreateTreeAction.php @@ -23,6 +23,7 @@ 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; @@ -55,9 +56,8 @@ class CreateTreeAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $params = (array) $request->getParsedBody(); - $name = $params['name']; - $title = $params['title']; + $name = Validator::parsedBody($request)->string('name'); + $title = Validator::parsedBody($request)->string('title'); if ($this->tree_service->all()->get($name) instanceof Tree) { FlashMessages::addMessage(I18N::translate('The family tree “%s” already exists.', e($name)), 'danger'); diff --git a/app/Http/RequestHandlers/CreateTreePage.php b/app/Http/RequestHandlers/CreateTreePage.php index e99173d3ff..45d4d2d9fd 100644 --- a/app/Http/RequestHandlers/CreateTreePage.php +++ b/app/Http/RequestHandlers/CreateTreePage.php @@ -22,6 +22,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\TreeService; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -55,8 +56,8 @@ class CreateTreePage implements RequestHandlerInterface $this->layout = 'layouts/administration'; $title = I18N::translate('Create a family tree'); - $tree_name = $request->getQueryParams()['name'] ?? $this->tree_service->uniqueTreeName(); - $tree_title = $request->getQueryParams()['title'] ?? I18N::translate('My family tree'); + $tree_name = Validator::queryParams($request)->string('name', $this->tree_service->uniqueTreeName()); + $tree_title = Validator::queryParams($request)->string('title', I18N::translate('My family tree')); return $this->viewResponse('admin/trees-create', [ 'title' => $title, diff --git a/app/Http/RequestHandlers/DataFixSelect.php b/app/Http/RequestHandlers/DataFixSelect.php index bb2c7b4b84..037f6df8e4 100644 --- a/app/Http/RequestHandlers/DataFixSelect.php +++ b/app/Http/RequestHandlers/DataFixSelect.php @@ -55,9 +55,8 @@ class DataFixSelect implements RequestHandlerInterface { $tree = Validator::attributes($request)->tree(); $data_fixes = $this->module_service->findByInterface(ModuleDataFixInterface::class); - $data_fix = $request->getParsedBody()['data_fix'] ?? ''; - - $module = $data_fixes->get($data_fix); + $data_fix = Validator::parsedBody($request)->string('data_fix'); + $module = $data_fixes->get($data_fix); if ($module instanceof ModuleDataFixInterface) { return redirect(route(DataFixPage::class, ['tree' => $tree->name(), 'data_fix' => $module->name()])); diff --git a/app/Http/RequestHandlers/DataFixUpdate.php b/app/Http/RequestHandlers/DataFixUpdate.php index 5be7c13cf6..f31f71c1fa 100644 --- a/app/Http/RequestHandlers/DataFixUpdate.php +++ b/app/Http/RequestHandlers/DataFixUpdate.php @@ -60,7 +60,7 @@ class DataFixUpdate implements RequestHandlerInterface $module = $this->module_service->findByName($data_fix); assert($module instanceof ModuleDataFixInterface); - $xref = $request->getQueryParams()['xref'] ?? ''; + $xref = Validator::queryParams($request)->isXref()->string('xref'); $params = $request->getQueryParams(); $record = Registry::gedcomRecordFactory()->make($xref, $tree); diff --git a/app/Http/RequestHandlers/DataFixUpdateAll.php b/app/Http/RequestHandlers/DataFixUpdateAll.php index 7c82b73eb3..0eed6d5be9 100644 --- a/app/Http/RequestHandlers/DataFixUpdateAll.php +++ b/app/Http/RequestHandlers/DataFixUpdateAll.php @@ -82,8 +82,8 @@ class DataFixUpdateAll implements RequestHandlerInterface return response([]); } - $start = $request->getQueryParams()['start'] ?? ''; - $end = $request->getQueryParams()['end'] ?? ''; + $start = Validator::queryParams($request)->string('start'); + $end = Validator::queryParams($request)->string('end'); if ($start === '' || $end === '') { return $this->createUpdateRanges($tree, $module, $rows, $params); diff --git a/app/Http/RequestHandlers/DeletePath.php b/app/Http/RequestHandlers/DeletePath.php index f77a19b09a..f886a5c3e7 100644 --- a/app/Http/RequestHandlers/DeletePath.php +++ b/app/Http/RequestHandlers/DeletePath.php @@ -22,6 +22,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; +use Fisharebest\Webtrees\Validator; use League\Flysystem\FilesystemException; use League\Flysystem\UnableToDeleteDirectory; use League\Flysystem\UnableToDeleteFile; @@ -65,7 +66,7 @@ class DeletePath implements RequestHandlerInterface { $data_filesystem = Registry::filesystem()->data(); - $path = $request->getQueryParams()['path'] ?? ''; + $path = Validator::queryParams($request)->string('path'); $normalized_path = $this->whitespace_path_normalizer->normalizePath($path); diff --git a/app/Http/RequestHandlers/EditFactAction.php b/app/Http/RequestHandlers/EditFactAction.php index 1941fa4560..8f29994807 100644 --- a/app/Http/RequestHandlers/EditFactAction.php +++ b/app/Http/RequestHandlers/EditFactAction.php @@ -67,7 +67,6 @@ class EditFactAction implements RequestHandlerInterface $record = Registry::gedcomRecordFactory()->make($xref, $tree); $record = Auth::checkRecordAccess($record, true); - $params = (array) $request->getParsedBody(); $keep_chan = Validator::parsedBody($request)->boolean('keep_chan', false); $levels = Validator::parsedBody($request)->array('levels'); $tags = Validator::parsedBody($request)->array('tags'); @@ -77,7 +76,7 @@ class EditFactAction implements RequestHandlerInterface $census_assistant = $this->module_service->findByInterface(CensusAssistantModule::class)->first(); if ($census_assistant instanceof CensusAssistantModule && $record instanceof Individual) { - $ca_individuals = $params['ca_individuals']['xref'] ?? []; + $ca_individuals = Validator::parsedBody($request)->array('ca_individuals')['xref'] ?? []; if ($ca_individuals !== []) { $gedcom = $census_assistant->updateCensusAssistant($request, $record, $fact_id, $gedcom, $keep_chan); diff --git a/app/Http/RequestHandlers/EditMediaFileAction.php b/app/Http/RequestHandlers/EditMediaFileAction.php index faada44b6b..cf6afb6aa7 100644 --- a/app/Http/RequestHandlers/EditMediaFileAction.php +++ b/app/Http/RequestHandlers/EditMediaFileAction.php @@ -71,17 +71,14 @@ class EditMediaFileAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $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(); - $folder = $params['folder'] ?? ''; - $new_file = $params['new_file'] ?? ''; - $remote = $params['remote'] ?? ''; - $title = $params['title'] ?? ''; - $type = $params['type'] ?? ''; + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $fact_id = Validator::attributes($request)->string('fact_id'); + $folder = Validator::parsedBody($request)->string('folder'); + $new_file = Validator::parsedBody($request)->string('new_file'); + $remote = Validator::parsedBody($request)->string('remote'); + $title = Validator::parsedBody($request)->string('title'); + $type = Validator::parsedBody($request)->string('type'); $media = Registry::mediaFactory()->make($xref, $tree); $media = Auth::checkMediaAccess($media, true); @@ -120,6 +117,8 @@ class EditMediaFileAction implements RequestHandlerInterface $file = $media_file->filename(); } + $data_filesystem = Registry::filesystem()->data(); + $filesystem = $media->tree()->mediaFilesystem($data_filesystem); $old = $media_file->filename(); $new = $file; diff --git a/app/Http/RequestHandlers/EditNoteAction.php b/app/Http/RequestHandlers/EditNoteAction.php index cea508776e..3579dd7705 100644 --- a/app/Http/RequestHandlers/EditNoteAction.php +++ b/app/Http/RequestHandlers/EditNoteAction.php @@ -40,13 +40,11 @@ class EditNoteAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $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']; + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $note = Registry::noteFactory()->make($xref, $tree); + $note = Auth::checkNoteAccess($note, true); + $NOTE = Validator::parsedBody($request)->string('NOTE'); // Convert HTML line endings to GEDCOM continuations $NOTE = strtr($NOTE, ["\r\n" => "\n1 CONT "]); diff --git a/app/Http/RequestHandlers/EditRawFactAction.php b/app/Http/RequestHandlers/EditRawFactAction.php index 7d41268402..ca4e8ee8c7 100644 --- a/app/Http/RequestHandlers/EditRawFactAction.php +++ b/app/Http/RequestHandlers/EditRawFactAction.php @@ -47,8 +47,7 @@ class EditRawFactAction implements RequestHandlerInterface $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']; + $gedcom = Validator::parsedBody($request)->string('gedcom'); // Cleanup the client’s bad editing? $gedcom = preg_replace('/[\r\n]+/', "\n", $gedcom); // Empty lines diff --git a/app/Http/RequestHandlers/EditRawRecordAction.php b/app/Http/RequestHandlers/EditRawRecordAction.php index 64c92a1fe2..4d429eacce 100644 --- a/app/Http/RequestHandlers/EditRawRecordAction.php +++ b/app/Http/RequestHandlers/EditRawRecordAction.php @@ -46,15 +46,13 @@ class EditRawRecordAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $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']; - $facts = $params['fact'] ?? []; - $fact_ids = $params['fact_id'] ?? []; + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $record = Registry::gedcomRecordFactory()->make($xref, $tree); + $record = Auth::checkRecordAccess($record, true); + $level0 = Validator::parsedBody($request)->string('level0'); + $facts = Validator::parsedBody($request)->array('fact'); + $fact_ids = Validator::parsedBody($request)->array('fact_id'); // Generate the level-0 line for the record. switch ($record->tag()) { diff --git a/app/Http/RequestHandlers/EditRecordPage.php b/app/Http/RequestHandlers/EditRecordPage.php index 72fff00049..438eff5fd2 100644 --- a/app/Http/RequestHandlers/EditRecordPage.php +++ b/app/Http/RequestHandlers/EditRecordPage.php @@ -57,16 +57,13 @@ class EditRecordPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - $xref = Validator::attributes($request)->isXref()->string('xref'); - $record = Registry::gedcomRecordFactory()->make($xref, $tree); - $record = Auth::checkRecordAccess($record, true); - - $include_hidden = (bool) ($request->getQueryParams()['include_hidden'] ?? false); - - $can_edit_raw = Auth::isAdmin() || $tree->getPreference('SHOW_GEDCOM_RECORD') === '1'; - - $subtags = Registry::elementFactory()->make($record->tag())->subtags(); + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $record = Registry::gedcomRecordFactory()->make($xref, $tree); + $record = Auth::checkRecordAccess($record, true); + $include_hidden = Validator::queryParams($request)->boolean('include_hidden', false); + $can_edit_raw = Auth::isAdmin() || $tree->getPreference('SHOW_GEDCOM_RECORD') === '1'; + $subtags = Registry::elementFactory()->make($record->tag())->subtags(); $gedcom = $this->gedcom_edit_service->insertMissingRecordSubtags($record, $include_hidden); $hidden = $this->gedcom_edit_service->insertMissingRecordSubtags($record, true); diff --git a/app/Http/RequestHandlers/EmailPreferencesAction.php b/app/Http/RequestHandlers/EmailPreferencesAction.php index e7138669f6..da72723862 100644 --- a/app/Http/RequestHandlers/EmailPreferencesAction.php +++ b/app/Http/RequestHandlers/EmailPreferencesAction.php @@ -57,31 +57,43 @@ class EmailPreferencesAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $user = Validator::attributes($request)->user(); - $params = (array) $request->getParsedBody(); + $user = Validator::attributes($request)->user(); + $active = Validator::parsedBody($request)->string('SMTP_ACTIVE'); + $disp_name = Validator::parsedBody($request)->string('SMTP_DISP_NAME'); + $from_name = Validator::parsedBody($request)->string('SMTP_FROM_NAME'); + $host = Validator::parsedBody($request)->string('SMTP_HOST'); + $port = Validator::parsedBody($request)->string('SMTP_PORT'); + $auth = Validator::parsedBody($request)->string('SMTP_AUTH'); + $auth_user = Validator::parsedBody($request)->string('SMTP_AUTH_USER'); + $auth_pass = Validator::parsedBody($request)->string('SMTP_AUTH_PASS'); + $ssl = Validator::parsedBody($request)->string('SMTP_SSL'); + $helo = Validator::parsedBody($request)->string('SMTP_HELO'); + $dkim_domain = Validator::parsedBody($request)->string('DKIM_DOMAIN'); + $dkim_selector = Validator::parsedBody($request)->string('DKIM_SELECTOR'); + $dkim_key = Validator::parsedBody($request)->string('DKIM_KEY'); + $test = Validator::parsedBody($request)->boolean('test', false); - Site::setPreference('SMTP_ACTIVE', $params['SMTP_ACTIVE']); - Site::setPreference('SMTP_DISP_NAME', $params['SMTP_DISP_NAME']); - Site::setPreference('SMTP_FROM_NAME', $params['SMTP_FROM_NAME']); - Site::setPreference('SMTP_HOST', $params['SMTP_HOST']); - Site::setPreference('SMTP_PORT', $params['SMTP_PORT']); - Site::setPreference('SMTP_AUTH', $params['SMTP_AUTH']); - Site::setPreference('SMTP_AUTH_USER', $params['SMTP_AUTH_USER']); - Site::setPreference('SMTP_SSL', $params['SMTP_SSL']); - Site::setPreference('SMTP_HELO', $params['SMTP_HELO']); - Site::setPreference('DKIM_DOMAIN', $params['DKIM_DOMAIN']); - Site::setPreference('DKIM_SELECTOR', $params['DKIM_SELECTOR']); - Site::setPreference('DKIM_KEY', $params['DKIM_KEY']); - if ($params['SMTP_AUTH_PASS'] !== '') { - Site::setPreference('SMTP_AUTH_PASS', $params['SMTP_AUTH_PASS']); + Site::setPreference('SMTP_ACTIVE', $active); + Site::setPreference('SMTP_DISP_NAME', $disp_name); + Site::setPreference('SMTP_FROM_NAME', $from_name); + Site::setPreference('SMTP_HOST', $host); + Site::setPreference('SMTP_PORT', $port); + Site::setPreference('SMTP_AUTH', $auth); + Site::setPreference('SMTP_AUTH_USER', $auth_user); + Site::setPreference('SMTP_SSL', $ssl); + Site::setPreference('SMTP_HELO', $helo); + Site::setPreference('DKIM_DOMAIN', $dkim_domain); + Site::setPreference('DKIM_SELECTOR', $dkim_selector); + Site::setPreference('DKIM_KEY', $dkim_key); + + if ($auth_pass !== '') { + Site::setPreference('SMTP_AUTH_PASS', $auth_pass); } FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success'); - $test = $params['test'] ?? ''; - - if ($test === 'on') { + if ($test) { $success = $this->email_service->send(new SiteUser(), $user, $user, 'test', 'test', 'test'); if ($success) { diff --git a/app/Http/RequestHandlers/ExportGedcomServer.php b/app/Http/RequestHandlers/ExportGedcomServer.php index cbc8c36082..dd4092d8da 100644 --- a/app/Http/RequestHandlers/ExportGedcomServer.php +++ b/app/Http/RequestHandlers/ExportGedcomServer.php @@ -70,9 +70,7 @@ class ExportGedcomServer implements RequestHandlerInterface $data_filesystem = Registry::filesystem()->data(); - $params = (array) $request->getParsedBody(); - - $filename = $params['filename'] ?? $tree->name(); + $filename = Validator::parsedBody($request)->string('filename'); // Force a ".ged" suffix if (strtolower(pathinfo($filename, PATHINFO_EXTENSION)) !== 'ged') { diff --git a/app/Http/RequestHandlers/FixLevel0MediaAction.php b/app/Http/RequestHandlers/FixLevel0MediaAction.php index 1138ee94c4..459fb1b428 100644 --- a/app/Http/RequestHandlers/FixLevel0MediaAction.php +++ b/app/Http/RequestHandlers/FixLevel0MediaAction.php @@ -19,8 +19,11 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; +use Fisharebest\Webtrees\Individual; +use Fisharebest\Webtrees\Media; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\TreeService; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -53,21 +56,20 @@ class FixLevel0MediaAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $params = (array) $request->getParsedBody(); - - $fact_id = $params['fact_id']; - $indi_xref = $params['indi_xref']; - $obje_xref = $params['obje_xref']; - $tree_id = (int) $params['tree_id']; + $fact_id = Validator::parsedBody($request)->string('fact_id'); + $indi_xref = Validator::parsedBody($request)->isXref()->string('indi_xref'); + $obje_xref = Validator::parsedBody($request)->isXref()->string('obje_xref'); + $tree_id = Validator::parsedBody($request)->integer('tree_id'); $tree = $this->tree_service->find($tree_id); $individual = Registry::individualFactory()->make($indi_xref, $tree); $media = Registry::mediaFactory()->make($obje_xref, $tree); - if ($individual !== null && $media !== null) { + if ($individual instanceof Individual && $media instanceof Media) { foreach ($individual->facts() as $fact1) { if ($fact1->id() === $fact_id) { $individual->updateFact($fact_id, $fact1->gedcom() . "\n2 OBJE @" . $obje_xref . '@', false); + foreach ($individual->facts(['OBJE']) as $fact2) { if ($fact2->target() === $media) { $individual->deleteFact($fact2->id(), false); diff --git a/app/Http/RequestHandlers/FixLevel0MediaData.php b/app/Http/RequestHandlers/FixLevel0MediaData.php index ffb649e79b..5c98e56b62 100644 --- a/app/Http/RequestHandlers/FixLevel0MediaData.php +++ b/app/Http/RequestHandlers/FixLevel0MediaData.php @@ -24,6 +24,7 @@ use Fisharebest\Webtrees\Gedcom; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\DatatablesService; use Fisharebest\Webtrees\Services\TreeService; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Query\Expression; use Illuminate\Database\Query\JoinClause; @@ -81,6 +82,8 @@ class FixLevel0MediaData implements RequestHandlerInterface $prefix = DB::connection()->getTablePrefix(); + $search = Validator::queryParams($request)->array('search')['value'] ?? ''; + $query = DB::table('media') ->join('media_file', static function (JoinClause $join): void { $join @@ -102,7 +105,7 @@ class FixLevel0MediaData implements RequestHandlerInterface ->orderBy('individuals.i_file') ->orderBy('individuals.i_id') ->orderBy('media.m_id') - ->where('descriptive_title', 'LIKE', '%' . addcslashes($request->getQueryParams()['search']['value'] ?? '', '\\%_') . '%') + ->where('descriptive_title', 'LIKE', '%' . addcslashes($search, '\\%_') . '%') ->select(['media.m_file', 'media.m_id', 'media.m_gedcom', 'individuals.i_id', 'individuals.i_gedcom']); return $this->datatables_service->handleQuery($request, $query, [], [], function (object $datum) use ($ignore_facts): array { diff --git a/app/Http/RequestHandlers/ImportThumbnailsAction.php b/app/Http/RequestHandlers/ImportThumbnailsAction.php index 86f7d2c118..091e9d4e54 100644 --- a/app/Http/RequestHandlers/ImportThumbnailsAction.php +++ b/app/Http/RequestHandlers/ImportThumbnailsAction.php @@ -23,6 +23,7 @@ use Fisharebest\Webtrees\Mime; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\PendingChangesService; use Fisharebest\Webtrees\Services\TreeService; +use Fisharebest\Webtrees\Validator; use League\Flysystem\FilesystemException; use League\Flysystem\UnableToDeleteFile; use League\Flysystem\UnableToMoveFile; @@ -72,12 +73,10 @@ class ImportThumbnailsAction implements RequestHandlerInterface { $data_filesystem = Registry::filesystem()->data(); - $params = (array) $request->getParsedBody(); - - $thumbnail = $params['thumbnail']; - $action = $params['action']; - $xrefs = $params['xref']; - $geds = $params['ged']; + $thumbnail = Validator::parsedBody($request)->string('thumbnail'); + $action = Validator::parsedBody($request)->string('action'); + $xrefs = Validator::parsedBody($request)->array('xref'); + $geds = Validator::parsedBody($request)->array('ged'); try { $file_exists = $data_filesystem->fileExists($thumbnail); diff --git a/app/Http/RequestHandlers/ImportThumbnailsData.php b/app/Http/RequestHandlers/ImportThumbnailsData.php index 3671bf71cb..58aad35122 100644 --- a/app/Http/RequestHandlers/ImportThumbnailsData.php +++ b/app/Http/RequestHandlers/ImportThumbnailsData.php @@ -24,6 +24,7 @@ use Fisharebest\Webtrees\Media; use Fisharebest\Webtrees\Mime; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\SearchService; +use Fisharebest\Webtrees\Validator; use Illuminate\Support\Collection; use Intervention\Image\ImageManager; use League\Flysystem\FilesystemException; @@ -85,9 +86,10 @@ class ImportThumbnailsData implements RequestHandlerInterface { $data_filesystem = Registry::filesystem()->data(); - $start = (int) $request->getQueryParams()['start']; - $length = (int) $request->getQueryParams()['length']; - $search = $request->getQueryParams()['search']['value']; + $start = Validator::queryParams($request)->integer('start'); + $length = Validator::queryParams($request)->integer('length'); + $draw = Validator::queryParams($request)->integer('draw'); + $search = Validator::queryParams($request)->array('search')['value']; // Fetch all thumbnails try { @@ -147,7 +149,7 @@ class ImportThumbnailsData implements RequestHandlerInterface }); return response([ - 'draw' => (int) $request->getQueryParams()['draw'], + 'draw' => $draw, 'recordsTotal' => $recordsTotal, 'recordsFiltered' => $recordsFiltered, 'data' => $data->values()->all(), diff --git a/app/Http/RequestHandlers/LinkChildToFamilyAction.php b/app/Http/RequestHandlers/LinkChildToFamilyAction.php index 4cf677eb31..3c8d1edbeb 100644 --- a/app/Http/RequestHandlers/LinkChildToFamilyAction.php +++ b/app/Http/RequestHandlers/LinkChildToFamilyAction.php @@ -45,16 +45,12 @@ class LinkChildToFamilyAction implements RequestHandlerInterface $xref = Validator::attributes($request)->isXref()->string('xref'); $individual = Registry::individualFactory()->make($xref, $tree); $individual = Auth::checkIndividualAccess($individual, true); - - $params = (array) $request->getParsedBody(); - - $famid = $params['famid']; + $famid = Validator::parsedBody($request)->isXref()->string('famid'); + $PEDI = Validator::parsedBody($request)->string('PEDI'); $family = Registry::familyFactory()->make($famid, $tree); $family = Auth::checkFamilyAccess($family, true); - $PEDI = $params['PEDI']; - // Replace any existing child->family link (we may be changing the PEDI); $fact_id = ''; foreach ($individual->facts(['FAMC']) as $fact) { diff --git a/app/Http/RequestHandlers/LinkMediaToRecordAction.php b/app/Http/RequestHandlers/LinkMediaToRecordAction.php index 397d95acb0..c116f7ea0f 100644 --- a/app/Http/RequestHandlers/LinkMediaToRecordAction.php +++ b/app/Http/RequestHandlers/LinkMediaToRecordAction.php @@ -38,10 +38,9 @@ class LinkMediaToRecordAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - $xref = Validator::attributes($request)->isXref()->string('xref'); - $params = (array) $request->getParsedBody(); - $link = $params['link'] ?? ''; + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $link = Validator::parsedBody($request)->isXref()->string('link'); $media = Registry::mediaFactory()->make($xref, $tree); $media = Auth::checkMediaAccess($media); diff --git a/app/Http/RequestHandlers/ManageMediaAction.php b/app/Http/RequestHandlers/ManageMediaAction.php index 4d6dfd4e99..ca0b3cd6b0 100644 --- a/app/Http/RequestHandlers/ManageMediaAction.php +++ b/app/Http/RequestHandlers/ManageMediaAction.php @@ -19,6 +19,7 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -38,12 +39,10 @@ class ManageMediaAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $params = (array) $request->getParsedBody(); - return redirect(route(ManageMediaPage::class, [ - 'files' => $params['files'], - 'media_folder' => $params['media_folder'] ?? '', - 'subfolders' => $params['subfolders'] ?? 'include', + 'files' => Validator::parsedBody($request)->string('files'), + 'media_folder' => Validator::parsedBody($request)->string('media_folder'), + 'subfolders' => Validator::parsedBody($request)->string('subfolders'), ])); } } diff --git a/app/Http/RequestHandlers/ManageMediaData.php b/app/Http/RequestHandlers/ManageMediaData.php index 42b5216b2d..8cff8ff6aa 100644 --- a/app/Http/RequestHandlers/ManageMediaData.php +++ b/app/Http/RequestHandlers/ManageMediaData.php @@ -28,6 +28,7 @@ use Fisharebest\Webtrees\Services\DatatablesService; use Fisharebest\Webtrees\Services\LinkedRecordService; use Fisharebest\Webtrees\Services\MediaFileService; use Fisharebest\Webtrees\Services\TreeService; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Query\Builder; use Illuminate\Database\Query\Expression; @@ -94,13 +95,13 @@ class ManageMediaData implements RequestHandlerInterface { $data_filesystem = Registry::filesystem()->data(); - $files = $request->getQueryParams()['files']; // local|external|unused + $files = Validator::queryParams($request)->isInArray(['local', 'external', 'unused'])->string('files'); // Files within this folder - $media_folder = $request->getQueryParams()['media_folder']; + $media_folder = Validator::queryParams($request)->string('media_folder'); // Show sub-folders within $media_folder - $subfolders = $request->getQueryParams()['subfolders']; // include|exclude + $subfolders = Validator::queryParams($request)->isInArray(['include', 'exclude'])->string('subfolders'); $search_columns = ['multimedia_file_refn', 'descriptive_title']; diff --git a/app/Http/RequestHandlers/ManageMediaPage.php b/app/Http/RequestHandlers/ManageMediaPage.php index a920146649..cc0bc5a173 100644 --- a/app/Http/RequestHandlers/ManageMediaPage.php +++ b/app/Http/RequestHandlers/ManageMediaPage.php @@ -23,6 +23,7 @@ use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\MediaFileService; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -58,10 +59,10 @@ class ManageMediaPage implements RequestHandlerInterface $data_filesystem = Registry::filesystem()->data(); $data_filesystem_name = Registry::filesystem()->dataName(); - $files = $request->getQueryParams()['files'] ?? 'local'; // local|unused|external - $subfolders = $request->getQueryParams()['subfolders'] ?? 'include'; // include|exclude + $files = Validator::queryParams($request)->isInArray(['local', 'external', 'unused'])->string('files', 'local'); + $subfolders = Validator::queryParams($request)->isInArray(['include', 'exclude'])->string('subfolders', 'exclude'); $media_folders = $this->media_file_service->allMediaFolders($data_filesystem); - $media_folder = $request->getQueryParams()['media_folder'] ?? $media_folders->first() ?? ''; + $media_folder = Validator::queryParams($request)->string('media_folder', $media_folders->first() ?? ''); $media_types = Registry::elementFactory()->make('OBJE:FILE:FORM:TYPE')->values(); $title = I18N::translate('Manage media'); diff --git a/app/Http/RequestHandlers/MapDataSave.php b/app/Http/RequestHandlers/MapDataSave.php index 7a65ed2eb7..d6756dbb75 100644 --- a/app/Http/RequestHandlers/MapDataSave.php +++ b/app/Http/RequestHandlers/MapDataSave.php @@ -21,6 +21,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\I18N; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -43,14 +44,13 @@ class MapDataSave implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $params = (array) $request->getParsedBody(); - - $parent_id = $params['parent_id'] ?? ''; - $place_id = $params['place_id'] ?? ''; - $latitude = $params['new_place_lati'] ?? ''; - $longitude = $params['new_place_long'] ?? ''; - $name = mb_substr($params['new_place_name'] ?? '', 0, 120); + $parent_id = Validator::parsedBody($request)->string('parent_id'); + $place_id = Validator::parsedBody($request)->string('place_id'); + $latitude = Validator::parsedBody($request)->string('new_place_lati'); + $longitude = Validator::parsedBody($request)->string('new_place_long'); + $name = Validator::parsedBody($request)->string('new_place_name'); + $name = mb_substr($name, 0, 120); $place_id = $place_id === '' ? null : $place_id; $parent_id = $parent_id === '' ? null : $parent_id; diff --git a/app/Http/RequestHandlers/MediaFileDownload.php b/app/Http/RequestHandlers/MediaFileDownload.php index 4dc5bd1c95..71f1236dbf 100644 --- a/app/Http/RequestHandlers/MediaFileDownload.php +++ b/app/Http/RequestHandlers/MediaFileDownload.php @@ -49,14 +49,11 @@ class MediaFileDownload implements RequestHandlerInterface $image_factory = Registry::imageFactory(); - $disposition = $request->getQueryParams()['disposition'] ?? 'inline'; - assert($disposition === 'inline' || $disposition === 'attachment'); - - $params = $request->getQueryParams(); - $xref = $params['xref'] ?? ''; - $fact_id = $params['fact_id'] ?? ''; - $media = Registry::mediaFactory()->make($xref, $tree); - $media = Auth::checkMediaAccess($media); + $disposition = Validator::queryParams($request)->isInArray(['inline', 'attachment'])->string('disposition'); + $xref = Validator::queryParams($request)->isXref()->string('xref'); + $fact_id = Validator::queryParams($request)->string('fact_id'); + $media = Registry::mediaFactory()->make($xref, $tree); + $media = Auth::checkMediaAccess($media); foreach ($media->mediaFiles() as $media_file) { if ($media_file->factId() === $fact_id) { diff --git a/app/Http/RequestHandlers/MediaFileThumbnail.php b/app/Http/RequestHandlers/MediaFileThumbnail.php index 55a5ef1631..412863dec2 100644 --- a/app/Http/RequestHandlers/MediaFileThumbnail.php +++ b/app/Http/RequestHandlers/MediaFileThumbnail.php @@ -46,8 +46,8 @@ class MediaFileThumbnail implements RequestHandlerInterface $user = Validator::attributes($request)->user(); $params = $request->getQueryParams(); - $xref = $params['xref'] ?? ''; - $fact_id = $params['fact_id'] ?? ''; + $xref = Validator::queryParams($request)->isXref()->string('xref'); + $fact_id = Validator::queryParams($request)->string('fact_id'); $media = Registry::mediaFactory()->make($xref, $tree); if ($media === null) { diff --git a/app/Http/RequestHandlers/MergeFactsAction.php b/app/Http/RequestHandlers/MergeFactsAction.php index 60f518c233..f3fec67cb7 100644 --- a/app/Http/RequestHandlers/MergeFactsAction.php +++ b/app/Http/RequestHandlers/MergeFactsAction.php @@ -61,15 +61,11 @@ class MergeFactsAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - - $params = (array) $request->getParsedBody(); - - $xref1 = $params['xref1'] ?? ''; - $xref2 = $params['xref2'] ?? ''; - - $keep1 = $params['keep1'] ?? []; - $keep2 = $params['keep2'] ?? []; + $tree = Validator::attributes($request)->tree(); + $xref1 = Validator::parsedBody($request)->isXref()->string('xref1'); + $xref2 = Validator::parsedBody($request)->isXref()->string('xref2'); + $keep1 = Validator::parsedBody($request)->array('keep1'); + $keep2 = Validator::parsedBody($request)->array('keep2'); // Merge record2 into record1 $record1 = Registry::gedcomRecordFactory()->make($xref1, $tree); diff --git a/app/Http/RequestHandlers/MergeFactsPage.php b/app/Http/RequestHandlers/MergeFactsPage.php index a7dbe82d51..7963154354 100644 --- a/app/Http/RequestHandlers/MergeFactsPage.php +++ b/app/Http/RequestHandlers/MergeFactsPage.php @@ -47,11 +47,9 @@ class MergeFactsPage implements RequestHandlerInterface { $this->layout = 'layouts/administration'; - $tree = Validator::attributes($request)->tree(); - - $xref1 = $request->getQueryParams()['xref1'] ?? ''; - $xref2 = $request->getQueryParams()['xref2'] ?? ''; - + $tree = Validator::attributes($request)->tree(); + $xref1 = Validator::queryParams($request)->isXref()->string('xref1'); + $xref2 = Validator::queryParams($request)->isXref()->string('xref2'); $title = I18N::translate('Merge records') . ' — ' . e($tree->title()); $record1 = Registry::gedcomRecordFactory()->make($xref1, $tree); diff --git a/app/Http/RequestHandlers/MergeRecordsAction.php b/app/Http/RequestHandlers/MergeRecordsAction.php index 9fbf74d3e0..7fbb3d4c17 100644 --- a/app/Http/RequestHandlers/MergeRecordsAction.php +++ b/app/Http/RequestHandlers/MergeRecordsAction.php @@ -41,11 +41,8 @@ class MergeRecordsAction implements RequestHandlerInterface public function handle(ServerRequestInterface $request): ResponseInterface { $tree = Validator::attributes($request)->tree(); - - $params = (array) $request->getParsedBody(); - - $xref1 = $params['xref1'] ?? ''; - $xref2 = $params['xref2'] ?? ''; + $xref1 = Validator::parsedBody($request)->isXref()->string('xref1'); + $xref2 = Validator::parsedBody($request)->isXref()->string('xref2'); // Merge record2 into record1 $record1 = Registry::gedcomRecordFactory()->make($xref1, $tree); diff --git a/app/Http/RequestHandlers/MergeRecordsPage.php b/app/Http/RequestHandlers/MergeRecordsPage.php index 3d60c9456b..2d54cfe4aa 100644 --- a/app/Http/RequestHandlers/MergeRecordsPage.php +++ b/app/Http/RequestHandlers/MergeRecordsPage.php @@ -56,8 +56,8 @@ class MergeRecordsPage implements RequestHandlerInterface $this->layout = 'layouts/administration'; $tree = Validator::attributes($request)->tree(); - $xref1 = $request->getQueryParams()['xref1'] ?? ''; - $xref2 = $request->getQueryParams()['xref2'] ?? ''; + $xref1 = Validator::queryParams($request)->isXref()->string('xref1', ''); + $xref2 = Validator::queryParams($request)->isXref()->string('xref2', ''); $record1 = Registry::gedcomRecordFactory()->make($xref1, $tree); $record2 = Registry::gedcomRecordFactory()->make($xref2, $tree); diff --git a/app/Http/RequestHandlers/MergeTreesAction.php b/app/Http/RequestHandlers/MergeTreesAction.php index 5e3748b266..8a84ab1b19 100644 --- a/app/Http/RequestHandlers/MergeTreesAction.php +++ b/app/Http/RequestHandlers/MergeTreesAction.php @@ -25,6 +25,7 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\AdminService; 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\Database\Query\Expression; @@ -63,9 +64,8 @@ class MergeTreesAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $params = (array) $request->getParsedBody(); - $tree1_name = $params['tree1_name'] ?? ''; - $tree2_name = $params['tree2_name'] ?? ''; + $tree1_name = Validator::parsedBody($request)->string('tree1_name'); + $tree2_name = Validator::parsedBody($request)->string('tree2_name'); $tree1 = $this->tree_service->all()->get($tree1_name); $tree2 = $this->tree_service->all()->get($tree2_name); diff --git a/app/Http/RequestHandlers/MergeTreesPage.php b/app/Http/RequestHandlers/MergeTreesPage.php index 7ceb6a52fe..22c4da6ec7 100644 --- a/app/Http/RequestHandlers/MergeTreesPage.php +++ b/app/Http/RequestHandlers/MergeTreesPage.php @@ -23,6 +23,7 @@ use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\AdminService; use Fisharebest\Webtrees\Services\TreeService; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -59,9 +60,8 @@ class MergeTreesPage implements RequestHandlerInterface { $this->layout = 'layouts/administration'; - $params = $request->getQueryParams(); - $tree1_name = $params['tree1_name'] ?? ''; - $tree2_name = $params['tree2_name'] ?? ''; + $tree1_name = Validator::queryParams($request)->string('tree1_name', ''); + $tree2_name = Validator::queryParams($request)->string('tree2_name', ''); $tree1 = $this->tree_service->all()->get($tree1_name); $tree2 = $this->tree_service->all()->get($tree2_name); diff --git a/app/Http/RequestHandlers/ModuleDeleteSettings.php b/app/Http/RequestHandlers/ModuleDeleteSettings.php index 1b3d208674..7854aff7ec 100644 --- a/app/Http/RequestHandlers/ModuleDeleteSettings.php +++ b/app/Http/RequestHandlers/ModuleDeleteSettings.php @@ -21,6 +21,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\I18N; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -43,9 +44,7 @@ class ModuleDeleteSettings implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $params = (array) $request->getParsedBody(); - - $module_name = $params['module_name'] ?? ''; + $module_name = Validator::parsedBody($request)->string('module_name'); DB::table('block_setting') ->join('block', 'block_setting.block_id', '=', 'block.block_id') diff --git a/app/Http/RequestHandlers/ModulesAllAction.php b/app/Http/RequestHandlers/ModulesAllAction.php index aa16bcc381..c5acb16484 100644 --- a/app/Http/RequestHandlers/ModulesAllAction.php +++ b/app/Http/RequestHandlers/ModulesAllAction.php @@ -22,6 +22,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\ModuleService; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -52,12 +53,10 @@ class ModulesAllAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $params = (array) $request->getParsedBody(); - $modules = $this->module_service->all(true); foreach ($modules as $module) { - $new_status = (bool) ($params['status-' . $module->name()] ?? false); + $new_status = Validator::parsedBody($request)->boolean('status-' . $module->name(), false); $old_status = $module->isEnabled(); if ($new_status !== $old_status) { @@ -66,10 +65,12 @@ class ModulesAllAction implements RequestHandlerInterface ->update(['status' => $new_status ? 'enabled' : 'disabled']); if ($new_status) { - FlashMessages::addMessage(I18N::translate('The module “%s” has been enabled.', $module->title()), 'success'); + $message = I18N::translate('The module “%s” has been enabled.', $module->title()); } else { - FlashMessages::addMessage(I18N::translate('The module “%s” has been disabled.', $module->title()), 'success'); + $message = I18N::translate('The module “%s” has been disabled.', $module->title()); } + + FlashMessages::addMessage($message, 'success'); } } diff --git a/app/Http/RequestHandlers/ModulesThemesAction.php b/app/Http/RequestHandlers/ModulesThemesAction.php index 11f8854be6..45e5c233b3 100644 --- a/app/Http/RequestHandlers/ModulesThemesAction.php +++ b/app/Http/RequestHandlers/ModulesThemesAction.php @@ -44,8 +44,6 @@ class ModulesThemesAction extends AbstractModuleComponentAction FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success'); - - return redirect(route(ModulesThemesPage::class)); } } diff --git a/app/Http/RequestHandlers/PasswordRequestAction.php b/app/Http/RequestHandlers/PasswordRequestAction.php index 58758a1c2a..16423369f8 100644 --- a/app/Http/RequestHandlers/PasswordRequestAction.php +++ b/app/Http/RequestHandlers/PasswordRequestAction.php @@ -84,11 +84,8 @@ class PasswordRequestAction implements RequestHandlerInterface, StatusCodeInterf */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->treeOptional(); - - $params = (array) $request->getParsedBody(); - - $email = $params['email'] ?? ''; + $tree = Validator::attributes($request)->treeOptional(); + $email = Validator::parsedBody($request)->string('email'); $user = $this->user_service->findByEmail($email); if ($user instanceof User) { diff --git a/app/Http/RequestHandlers/PasswordResetAction.php b/app/Http/RequestHandlers/PasswordResetAction.php index a955f593a5..04b6293fd6 100644 --- a/app/Http/RequestHandlers/PasswordResetAction.php +++ b/app/Http/RequestHandlers/PasswordResetAction.php @@ -58,13 +58,10 @@ class PasswordResetAction implements RequestHandlerInterface, StatusCodeInterfac { $tree = Validator::attributes($request)->treeOptional(); $token = $request->getAttribute('token'); - - $user = $this->user_service->findByToken($token); + $user = $this->user_service->findByToken($token); if ($user instanceof User) { - $params = (array) $request->getParsedBody(); - - $password = $params['password'] ?? ''; + $password = Validator::parsedBody($request)->string('password'); $user->setPreference('password-token', ''); $user->setPreference('password-token-expire', ''); diff --git a/app/Http/RequestHandlers/PasteFact.php b/app/Http/RequestHandlers/PasteFact.php index 5d18710da2..187085098f 100644 --- a/app/Http/RequestHandlers/PasteFact.php +++ b/app/Http/RequestHandlers/PasteFact.php @@ -57,8 +57,7 @@ class PasteFact implements RequestHandlerInterface { $tree = Validator::attributes($request)->tree(); $xref = Validator::attributes($request)->isXref()->string('xref'); - $params = (array) $request->getParsedBody(); - $fact_id = $params['fact_id']; + $fact_id = Validator::parsedBody($request)->string('fact_id'); $record = Registry::gedcomRecordFactory()->make($xref, $tree); $record = Auth::checkRecordAccess($record, true); diff --git a/app/Http/RequestHandlers/PendingChangesAcceptTree.php b/app/Http/RequestHandlers/PendingChangesAcceptTree.php index e5eb77da12..8755db18d9 100644 --- a/app/Http/RequestHandlers/PendingChangesAcceptTree.php +++ b/app/Http/RequestHandlers/PendingChangesAcceptTree.php @@ -30,8 +30,6 @@ use Psr\Http\Server\RequestHandlerInterface; use function e; use function response; -use const PHP_INT_MAX; - /** * Accept pending changes for a tree. */ @@ -55,12 +53,12 @@ class PendingChangesAcceptTree implements RequestHandlerInterface public function handle(ServerRequestInterface $request): ResponseInterface { $tree = Validator::attributes($request)->tree(); - - $n = (int) ($request->getQueryParams()['n'] ?? PHP_INT_MAX); + $n = Validator::queryParams($request)->integer('n'); $this->pending_changes_service->acceptTree($tree, $n); FlashMessages::addMessage(I18N::translate('The changes to “%s” have been accepted.', e($tree->title()))); + return response(); } } diff --git a/app/Http/RequestHandlers/PendingChangesLogAction.php b/app/Http/RequestHandlers/PendingChangesLogAction.php index 61f5e6556e..5791ff2deb 100644 --- a/app/Http/RequestHandlers/PendingChangesLogAction.php +++ b/app/Http/RequestHandlers/PendingChangesLogAction.php @@ -19,6 +19,7 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -35,17 +36,15 @@ class PendingChangesLogAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $params = (array) $request->getParsedBody(); - return redirect(route(PendingChangesLogPage::class, [ - 'tree' => $params['tree'], - 'from' => $params['from'] ?? '', - 'to' => $params['to'] ?? '', - 'type' => $params['type'] ?? '', - 'oldged' => $params['oldged'] ?? '', - 'newged' => $params['newged'] ?? '', - 'xref' => $params['xref'] ?? '', - 'username' => $params['username'] ?? '', + 'tree' => Validator::parsedBody($request)->string('tree'), + 'from' => Validator::parsedBody($request)->string('from'), + 'to' => Validator::parsedBody($request)->string('to'), + 'type' => Validator::parsedBody($request)->string('type'), + 'oldged' => Validator::parsedBody($request)->string('oldged'), + 'newged' => Validator::parsedBody($request)->string('newged'), + 'xref' => Validator::parsedBody($request)->string('xref'), + 'username' => Validator::parsedBody($request)->string('username'), ])); } } diff --git a/app/Http/RequestHandlers/PendingChangesLogPage.php b/app/Http/RequestHandlers/PendingChangesLogPage.php index 683bcd0c24..cfa3d4ac84 100644 --- a/app/Http/RequestHandlers/PendingChangesLogPage.php +++ b/app/Http/RequestHandlers/PendingChangesLogPage.php @@ -73,19 +73,16 @@ class PendingChangesLogPage implements RequestHandlerInterface $earliest = DB::table('change')->min('change_time'); $latest = DB::table('change')->max('change_time'); - $earliest = Registry::timestampFactory()->fromString($earliest); - $latest = Registry::timestampFactory()->fromString($latest); + $earliest = Registry::timestampFactory()->fromString($earliest)->toDateString(); + $latest = Registry::timestampFactory()->fromString($latest)->toDateString(); - $earliest = $earliest->toDateString(); - $latest = $latest->toDateString(); - - $from = $request->getQueryParams()['from'] ?? $earliest; - $to = $request->getQueryParams()['to'] ?? $latest; - $type = $request->getQueryParams()['type'] ?? ''; - $oldged = $request->getQueryParams()['oldged'] ?? ''; - $newged = $request->getQueryParams()['newged'] ?? ''; - $xref = $request->getQueryParams()['xref'] ?? ''; - $username = $request->getQueryParams()['username'] ?? ''; + $from = Validator::queryParams($request)->string('from', $earliest); + $to = Validator::queryParams($request)->string('to', $latest); + $type = Validator::queryParams($request)->string('type', ''); + $oldged = Validator::queryParams($request)->string('oldged', ''); + $newged = Validator::queryParams($request)->string('newged', ''); + $xref = Validator::queryParams($request)->string('xref', ''); + $username = Validator::queryParams($request)->string('username', ''); return $this->viewResponse('admin/changes-log', [ 'earliest' => $earliest, diff --git a/app/Http/RequestHandlers/RedirectPlaceListPhp.php b/app/Http/RequestHandlers/RedirectPlaceListPhp.php index 99f4c94c37..d2ff64a42e 100644 --- a/app/Http/RequestHandlers/RedirectPlaceListPhp.php +++ b/app/Http/RequestHandlers/RedirectPlaceListPhp.php @@ -65,7 +65,7 @@ class RedirectPlaceListPhp implements RequestHandlerInterface $module = $this->module_service->findByInterface(PlaceHierarchyListModule::class)->first(); if ($tree instanceof Tree && $module instanceof PlaceHierarchyListModule) { - $url = $module->listUrl($tree, ['action2' => $action2, 'place-id' => $place_id]); + $url = $module->listUrl($tree, ['action2' => $action2, 'place_id' => $place_id]); return Registry::responseFactory()->redirectUrl($url, StatusCodeInterface::STATUS_MOVED_PERMANENTLY); } diff --git a/app/Http/RequestHandlers/RedirectReportEnginePhp.php b/app/Http/RequestHandlers/RedirectReportEnginePhp.php index 6da16958df..785e961ab7 100644 --- a/app/Http/RequestHandlers/RedirectReportEnginePhp.php +++ b/app/Http/RequestHandlers/RedirectReportEnginePhp.php @@ -57,14 +57,18 @@ class RedirectReportEnginePhp implements RequestHandlerInterface { $ged = Validator::queryParams($request)->string('ged', Site::getPreference('DEFAULT_GEDCOM')); $action = Validator::queryParams($request)->string('action', ''); + $report = Validator::queryParams($request)->string('report'); $tree = $this->tree_service->all()->get($ged); if ($tree instanceof Tree && $action === 'run') { - $query = $request->getQueryParams(); - $query['report'] = basename(dirname($query['report'] ?? '')); - $query['tree'] = $tree->name(); + $params = [ + 'report' => basename(dirname($report)), + 'tree' => $tree->name(), + 'varnames' => Validator::queryParams($request)->array('varnames'), + 'vars' => Validator::queryParams($request)->array('vars'), + ]; - $url = route(ReportGenerate::class, $query); + $url = route(ReportGenerate::class, $params); return Registry::responseFactory()->redirectUrl($url, StatusCodeInterface::STATUS_MOVED_PERMANENTLY); } diff --git a/app/Http/RequestHandlers/RegisterAction.php b/app/Http/RequestHandlers/RegisterAction.php index b7755aa957..b72ab4a71a 100644 --- a/app/Http/RequestHandlers/RegisterAction.php +++ b/app/Http/RequestHandlers/RegisterAction.php @@ -90,17 +90,14 @@ class RegisterAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->treeOptional(); - $this->checkRegistrationAllowed(); - $params = (array) $request->getParsedBody(); - - $comments = $params['comments'] ?? ''; - $email = $params['email'] ?? ''; - $password = $params['password'] ?? ''; - $realname = $params['realname'] ?? ''; - $username = $params['username'] ?? ''; + $tree = Validator::attributes($request)->treeOptional(); + $comments = Validator::parsedBody($request)->string('comments'); + $email = Validator::parsedBody($request)->string('email'); + $password = Validator::parsedBody($request)->string('password'); + $realname = Validator::parsedBody($request)->string('realname'); + $username = Validator::parsedBody($request)->string('username'); try { if ($this->captcha_service->isRobot($request)) { diff --git a/app/Http/RequestHandlers/ReorderChildrenAction.php b/app/Http/RequestHandlers/ReorderChildrenAction.php index 1bf43813f9..6f2d3d64ed 100644 --- a/app/Http/RequestHandlers/ReorderChildrenAction.php +++ b/app/Http/RequestHandlers/ReorderChildrenAction.php @@ -28,9 +28,7 @@ use Psr\Http\Server\RequestHandlerInterface; use function array_merge; use function array_search; -use function assert; use function implode; -use function is_array; use function redirect; use function uksort; @@ -46,15 +44,14 @@ class ReorderChildrenAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - $xref = Validator::attributes($request)->isXref()->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); - $url = Validator::parsedBody($request)->isLocalUrl()->string('url', $family->url()); - $params = (array) $request->getParsedBody(); - $order = $params['order']; - assert(is_array($order)); + $order = Validator::parsedBody($request)->array('order'); + $url = Validator::parsedBody($request)->isLocalUrl()->string('url', $family->url()); $fake_facts = ['0 @' . $family->xref() . '@ FAM']; $sort_facts = []; diff --git a/app/Http/RequestHandlers/ReorderFamiliesAction.php b/app/Http/RequestHandlers/ReorderFamiliesAction.php index 7ae22bbcbf..cf6503399b 100644 --- a/app/Http/RequestHandlers/ReorderFamiliesAction.php +++ b/app/Http/RequestHandlers/ReorderFamiliesAction.php @@ -46,16 +46,13 @@ class ReorderFamiliesAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - $xref = Validator::attributes($request)->isXref()->string('xref'); + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $order = Validator::parsedBody($request)->array('order'); + $individual = Registry::individualFactory()->make($xref, $tree); $individual = Auth::checkIndividualAccess($individual, true); - $params = (array) $request->getParsedBody(); - - $order = $params['order']; - assert(is_array($order)); - $fake_facts = ['0 @' . $individual->xref() . '@ INDI']; $sort_facts = []; $keep_facts = []; diff --git a/app/Http/RequestHandlers/ReorderMediaAction.php b/app/Http/RequestHandlers/ReorderMediaAction.php index 03c1e99ba2..da84d80a5b 100644 --- a/app/Http/RequestHandlers/ReorderMediaAction.php +++ b/app/Http/RequestHandlers/ReorderMediaAction.php @@ -28,9 +28,7 @@ use Psr\Http\Server\RequestHandlerInterface; use function array_merge; use function array_search; -use function assert; use function implode; -use function is_array; use function redirect; use function uksort; @@ -46,14 +44,12 @@ class ReorderMediaAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - $xref = Validator::attributes($request)->isXref()->string('xref'); + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $order = Validator::parsedBody($request)->array('order'); + $individual = Registry::individualFactory()->make($xref, $tree); $individual = Auth::checkIndividualAccess($individual, true); - $params = (array) $request->getParsedBody(); - - $order = $params['order']; - assert(is_array($order)); $fake_facts = ['0 @' . $individual->xref() . '@ INDI']; $sort_facts = []; diff --git a/app/Http/RequestHandlers/ReorderMediaFilesAction.php b/app/Http/RequestHandlers/ReorderMediaFilesAction.php index 57e0bdbb61..0c97c02cfa 100644 --- a/app/Http/RequestHandlers/ReorderMediaFilesAction.php +++ b/app/Http/RequestHandlers/ReorderMediaFilesAction.php @@ -28,9 +28,7 @@ use Psr\Http\Server\RequestHandlerInterface; use function array_merge; use function array_search; -use function assert; use function implode; -use function is_array; use function redirect; use function uksort; @@ -48,12 +46,10 @@ class ReorderMediaFilesAction implements RequestHandlerInterface { $tree = Validator::attributes($request)->tree(); $xref = Validator::attributes($request)->isXref()->string('xref'); + $order = Validator::parsedBody($request)->array('order'); + $media = Registry::mediaFactory()->make($xref, $tree); $media = Auth::checkMediaAccess($media, true); - $params = (array) $request->getParsedBody(); - - $order = $params['order']; - assert(is_array($order)); $fake_facts = ['0 @' . $media->xref() . '@ OBJE']; $sort_facts = []; diff --git a/app/Http/RequestHandlers/ReorderNamesAction.php b/app/Http/RequestHandlers/ReorderNamesAction.php index 3ab55a3dff..d24dc5bc7c 100644 --- a/app/Http/RequestHandlers/ReorderNamesAction.php +++ b/app/Http/RequestHandlers/ReorderNamesAction.php @@ -28,9 +28,7 @@ use Psr\Http\Server\RequestHandlerInterface; use function array_merge; use function array_search; -use function assert; use function implode; -use function is_array; use function redirect; use function uksort; @@ -46,15 +44,13 @@ class ReorderNamesAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - $xref = Validator::attributes($request)->isXref()->string('xref'); + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $order = Validator::parsedBody($request)->array('order'); + $individual = Registry::individualFactory()->make($xref, $tree); $individual = Auth::checkIndividualAccess($individual, true); - $params = (array) $request->getParsedBody(); - $order = $params['order']; - assert(is_array($order)); - $fake_facts = ['0 @' . $individual->xref() . '@ INDI']; $sort_facts = []; $keep_facts = []; diff --git a/app/Http/RequestHandlers/ReportGenerate.php b/app/Http/RequestHandlers/ReportGenerate.php index 6506ec56cd..1f60c6de38 100644 --- a/app/Http/RequestHandlers/ReportGenerate.php +++ b/app/Http/RequestHandlers/ReportGenerate.php @@ -83,8 +83,8 @@ class ReportGenerate implements RequestHandlerInterface Auth::checkComponentAccess($module, ModuleReportInterface::class, $tree, $user); - $varnames = $request->getQueryParams()['varnames'] ?? []; - $vars = $request->getQueryParams()['vars'] ?? []; + $varnames = Validator::queryParams($request)->array('varnames'); + $vars = Validator::queryParams($request)->array('vars'); $variables = []; foreach ($varnames as $name) { @@ -92,9 +92,8 @@ class ReportGenerate implements RequestHandlerInterface } $xml_filename = $module->resourcesFolder() . $module->xmlFilename(); - - $format = $request->getQueryParams()['format'] ?? ''; - $destination = $request->getQueryParams()['destination'] ?? ''; + $format = Validator::queryParams($request)->string('format'); + $destination = Validator::queryParams($request)->string('destination'); $user->setPreference('default-report-destination', $destination); $user->setPreference('default-report-format', $format); diff --git a/app/Http/RequestHandlers/ReportListAction.php b/app/Http/RequestHandlers/ReportListAction.php index 2d10de1a5f..3abc90bb20 100644 --- a/app/Http/RequestHandlers/ReportListAction.php +++ b/app/Http/RequestHandlers/ReportListAction.php @@ -56,12 +56,9 @@ class ReportListAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - $user = Validator::attributes($request)->user(); - - $params = (array) $request->getParsedBody(); - - $report = $params['report'] ?? ''; + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); + $report = Validator::parsedBody($request)->string('report'); $module = $this->module_service->findByName($report); if ($module instanceof ModuleReportInterface) { diff --git a/app/Http/RequestHandlers/ReportSetupAction.php b/app/Http/RequestHandlers/ReportSetupAction.php index 648707dd11..bfb69fe9aa 100644 --- a/app/Http/RequestHandlers/ReportSetupAction.php +++ b/app/Http/RequestHandlers/ReportSetupAction.php @@ -57,9 +57,8 @@ class ReportSetupAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - $user = Validator::attributes($request)->user(); - + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); $report = Validator::attributes($request)->string('report'); $module = $this->module_service->findByName($report); @@ -69,11 +68,13 @@ class ReportSetupAction implements RequestHandlerInterface Auth::checkComponentAccess($module, ModuleReportInterface::class, $tree, $user); - $params = (array) $request->getParsedBody(); - - $params['tree'] = $tree->name(); - $params['report'] = $report; - - return redirect(route(ReportGenerate::class, $params)); + return redirect(route(ReportGenerate::class, [ + 'tree' => $tree->name(), + 'report' => $report, + 'destination' => Validator::parsedBody($request)->string('destination'), + 'format' => Validator::parsedBody($request)->string('format'), + 'varnames' => Validator::parsedBody($request)->array('varnames'), + 'vars' => Validator::parsedBody($request)->array('vars'), + ])); } } diff --git a/app/Http/RequestHandlers/ReportSetupPage.php b/app/Http/RequestHandlers/ReportSetupPage.php index e4a7a4d7dd..d0dc68497a 100644 --- a/app/Http/RequestHandlers/ReportSetupPage.php +++ b/app/Http/RequestHandlers/ReportSetupPage.php @@ -73,7 +73,7 @@ class ReportSetupPage implements RequestHandlerInterface Auth::checkComponentAccess($module, ModuleReportInterface::class, $tree, $user); - $xref = $request->getQueryParams()['xref'] ?? ''; + $xref = Validator::queryParams($request)->isXref()->string('xref', ''); $xml_filename = $module->resourcesFolder() . $module->xmlFilename(); diff --git a/app/Http/RequestHandlers/SearchAdvancedAction.php b/app/Http/RequestHandlers/SearchAdvancedAction.php index 0bcb808197..edda110852 100644 --- a/app/Http/RequestHandlers/SearchAdvancedAction.php +++ b/app/Http/RequestHandlers/SearchAdvancedAction.php @@ -30,8 +30,6 @@ use Psr\Http\Server\RequestHandlerInterface; class SearchAdvancedAction implements RequestHandlerInterface { /** - * The standard search. - * * @param ServerRequestInterface $request * * @return ResponseInterface @@ -39,11 +37,10 @@ class SearchAdvancedAction implements RequestHandlerInterface public function handle(ServerRequestInterface $request): ResponseInterface { $tree = Validator::attributes($request)->tree(); - $params = (array) $request->getParsedBody(); - $fields = $params['fields'] ?? []; - $modifiers = $params['modifiers'] ?? []; - $other_field = $params['other_field'] ?? ''; - $other_value = $params['other_value'] ?? ''; + $fields = Validator::parsedBody($request)->array('fields'); + $modifiers = Validator::parsedBody($request)->array('modifiers'); + $other_field = Validator::parsedBody($request)->string('other_field'); + $other_value = Validator::parsedBody($request)->string('other_value'); if ($other_field !== '' && $other_value !== '') { $fields[$other_field] = $other_value; diff --git a/app/Http/RequestHandlers/SearchAdvancedPage.php b/app/Http/RequestHandlers/SearchAdvancedPage.php index 3d321b00c1..8d3cf7fee1 100644 --- a/app/Http/RequestHandlers/SearchAdvancedPage.php +++ b/app/Http/RequestHandlers/SearchAdvancedPage.php @@ -123,8 +123,6 @@ class SearchAdvancedPage implements RequestHandlerInterface private SearchService $search_service; /** - * SearchController constructor. - * * @param SearchService $search_service */ public function __construct(SearchService $search_service) @@ -133,26 +131,19 @@ class SearchAdvancedPage implements RequestHandlerInterface } /** - * A structured search. - * * @param ServerRequestInterface $request * * @return ResponseInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - + $tree = Validator::attributes($request)->tree(); $default_fields = array_fill_keys(self::DEFAULT_ADVANCED_FIELDS, ''); - - $params = $request->getQueryParams(); - - $fields = $params['fields'] ?? $default_fields; - $modifiers = $params['modifiers'] ?? []; - - $other_fields = $this->otherFields($fields); - $date_options = $this->dateOptions(); - $name_options = $this->nameOptions(); + $fields = Validator::queryParams($request)->array('fields') ?: $default_fields; + $modifiers = Validator::queryParams($request)->array('modifiers'); + $other_fields = $this->otherFields($fields); + $date_options = $this->dateOptions(); + $name_options = $this->nameOptions(); if (array_filter($fields) !== []) { $individuals = $this->search_service->searchIndividualsAdvanced([$tree], $fields, $modifiers); diff --git a/app/Http/RequestHandlers/SearchGeneralAction.php b/app/Http/RequestHandlers/SearchGeneralAction.php index 1f4513d1e9..7ac5ba739c 100644 --- a/app/Http/RequestHandlers/SearchGeneralAction.php +++ b/app/Http/RequestHandlers/SearchGeneralAction.php @@ -30,28 +30,22 @@ use Psr\Http\Server\RequestHandlerInterface; class SearchGeneralAction implements RequestHandlerInterface { /** - * The standard search. - * * @param ServerRequestInterface $request * * @return ResponseInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - - $params = (array) $request->getParsedBody(); - return redirect(route(SearchGeneralPage::class, [ - 'query' => $params['query'] ?? '', - 'search_families' => (bool) ($params['search_families'] ?? false), - 'search_individuals' => (bool) ($params['search_individuals'] ?? false), - 'search_locations' => (bool) ($params['search_locations'] ?? false), - 'search_notes' => (bool) ($params['search_notes'] ?? false), - 'search_repositories' => (bool) ($params['search_repositories'] ?? false), - 'search_sources' => (bool) ($params['search_sources'] ?? false), - 'search_trees' => $params['search_trees'] ?? [], - 'tree' => $tree->name(), + 'query' => Validator::parsedBody($request)->string('query'), + 'search_families' => Validator::parsedBody($request)->boolean('search_families', false), + 'search_individuals' => Validator::parsedBody($request)->boolean('search_individuals', false), + 'search_locations' => Validator::parsedBody($request)->boolean('search_locations', false), + 'search_notes' => Validator::parsedBody($request)->boolean('search_notes', false), + 'search_repositories' => Validator::parsedBody($request)->boolean('search_repositories', false), + 'search_sources' => Validator::parsedBody($request)->boolean('search_sources', false), + 'search_trees' => Validator::parsedBody($request)->array('search_trees'), + 'tree' => Validator::attributes($request)->tree()->name(), ])); } } diff --git a/app/Http/RequestHandlers/SearchGeneralPage.php b/app/Http/RequestHandlers/SearchGeneralPage.php index 016af18fc9..46ba10db1e 100644 --- a/app/Http/RequestHandlers/SearchGeneralPage.php +++ b/app/Http/RequestHandlers/SearchGeneralPage.php @@ -36,6 +36,7 @@ use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; +use function in_array; use function preg_replace; use function redirect; use function trim; @@ -76,16 +77,18 @@ class SearchGeneralPage implements RequestHandlerInterface { $tree = Validator::attributes($request)->tree(); - $params = $request->getQueryParams(); - $query = $params['query'] ?? ''; + $query = Validator::queryParams($request)->string('query', ''); // What type of records to search? - $search_individuals = (bool) ($params['search_individuals'] ?? false); - $search_families = (bool) ($params['search_families'] ?? false); - $search_locations = (bool) ($params['search_locations'] ?? false); - $search_repositories = (bool) ($params['search_repositories'] ?? false); - $search_sources = (bool) ($params['search_sources'] ?? false); - $search_notes = (bool) ($params['search_notes'] ?? false); + $search_individuals = Validator::queryParams($request)->boolean('search_individuals', false); + $search_families = Validator::queryParams($request)->boolean('search_families', false); + $search_locations = Validator::queryParams($request)->boolean('search_locations', false); + $search_repositories = Validator::queryParams($request)->boolean('search_repositories', false); + $search_sources = Validator::queryParams($request)->boolean('search_sources', false); + $search_notes = Validator::queryParams($request)->boolean('search_notes', false); + + // Where to search + $search_tree_names = Validator::queryParams($request)->array('search_trees'); $exist_notes = DB::table('other') ->where('o_file', '=', $tree->id()) @@ -122,12 +125,8 @@ class SearchGeneralPage implements RequestHandlerInterface $all_trees = new Collection([$tree]); } - $search_tree_names = new Collection($params['search_trees'] ?? []); - $search_trees = $all_trees - ->filter(static function (Tree $tree) use ($search_tree_names): bool { - return $search_tree_names->containsStrict($tree->name()); - }); + ->filter(static fn (Tree $tree): bool => in_array($tree->name(), $search_tree_names, true)); if ($search_trees->isEmpty()) { $search_trees->add($tree); diff --git a/app/Http/RequestHandlers/SearchPhoneticAction.php b/app/Http/RequestHandlers/SearchPhoneticAction.php index c65dcc7dfd..fe750843f1 100644 --- a/app/Http/RequestHandlers/SearchPhoneticAction.php +++ b/app/Http/RequestHandlers/SearchPhoneticAction.php @@ -38,17 +38,13 @@ class SearchPhoneticAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - - $params = (array) $request->getParsedBody(); - return redirect(route(SearchPhoneticPage::class, [ - 'firstname' => $params['firstname'] ?? '', - 'lastname' => $params['lastname'] ?? '', - 'place' => $params['place'] ?? '', - 'search_trees' => $params['search_trees'] ?? [], - 'soundex' => $params['soundex'] ?? 'Russell', - 'tree' => $tree->name(), + 'firstname' => Validator::parsedBody($request)->string('firstname'), + 'lastname' => Validator::parsedBody($request)->string('lastname'), + 'place' => Validator::parsedBody($request)->string('place'), + 'search_trees' => Validator::parsedBody($request)->array('search_trees'), + 'soundex' => Validator::parsedBody($request)->string('soundex'), + 'tree' => Validator::attributes($request)->tree()->name(), ])); } } diff --git a/app/Http/RequestHandlers/SearchPhoneticPage.php b/app/Http/RequestHandlers/SearchPhoneticPage.php index bc05bbabe3..6da4060ce7 100644 --- a/app/Http/RequestHandlers/SearchPhoneticPage.php +++ b/app/Http/RequestHandlers/SearchPhoneticPage.php @@ -31,6 +31,8 @@ use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; +use function in_array; + /** * Search for (and optionally replace) genealogy data */ @@ -63,13 +65,14 @@ class SearchPhoneticPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); + $tree = Validator::attributes($request)->tree(); + $firstname = Validator::queryParams($request)->string('firstname', ''); + $lastname = Validator::queryParams($request)->string('lastname', ''); + $place = Validator::queryParams($request)->string('place', ''); + $soundex = Validator::queryParams($request)->isInArray(['DaitchM', 'Russell'])->string('soundex', 'Russell'); - $params = $request->getQueryParams(); - $firstname = $params['firstname'] ?? ''; - $lastname = $params['lastname'] ?? ''; - $place = $params['place'] ?? ''; - $soundex = $params['soundex'] ?? 'Russell'; + // Where to search + $search_tree_names = Validator::queryParams($request)->array('search_trees'); // What trees to search? if (Site::getPreference('ALLOW_CHANGE_GEDCOM') === '1') { @@ -78,12 +81,8 @@ class SearchPhoneticPage implements RequestHandlerInterface $all_trees = new Collection([$tree]); } - $search_tree_names = new Collection($params['search_trees'] ?? []); - $search_trees = $all_trees - ->filter(static function (Tree $tree) use ($search_tree_names): bool { - return $search_tree_names->containsStrict($tree->name()); - }); + ->filter(static fn (Tree $tree): bool => in_array($tree->name(), $search_tree_names, true)); if ($search_trees->isEmpty()) { $search_trees->add($tree); diff --git a/app/Http/RequestHandlers/SearchQuickAction.php b/app/Http/RequestHandlers/SearchQuickAction.php index e8c748d5d2..1f48476587 100644 --- a/app/Http/RequestHandlers/SearchQuickAction.php +++ b/app/Http/RequestHandlers/SearchQuickAction.php @@ -43,11 +43,8 @@ class SearchQuickAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - - $params = (array) $request->getParsedBody(); - - $query = $params['query'] ?? ''; + $tree = Validator::attributes($request)->tree(); + $query = Validator::parsedBody($request)->string('query'); // Was the search query an XREF in the current tree? // If so, go straight to it. diff --git a/app/Http/RequestHandlers/SearchReplaceAction.php b/app/Http/RequestHandlers/SearchReplaceAction.php index da43bb2245..23d9f6db3c 100644 --- a/app/Http/RequestHandlers/SearchReplaceAction.php +++ b/app/Http/RequestHandlers/SearchReplaceAction.php @@ -60,10 +60,9 @@ class SearchReplaceAction implements RequestHandlerInterface public function handle(ServerRequestInterface $request): ResponseInterface { $tree = Validator::attributes($request)->tree(); - $params = (array) $request->getParsedBody(); - $search = $params['search'] ?? ''; - $replace = $params['replace'] ?? ''; - $context = $params['context'] ?? 'all'; + $search = Validator::parsedBody($request)->string('search'); + $replace = Validator::parsedBody($request)->string('replace'); + $context = Validator::parsedBody($request)->string('context'); switch ($context) { case 'all': diff --git a/app/Http/RequestHandlers/SearchReplacePage.php b/app/Http/RequestHandlers/SearchReplacePage.php index f2d42344f0..9d6c4599be 100644 --- a/app/Http/RequestHandlers/SearchReplacePage.php +++ b/app/Http/RequestHandlers/SearchReplacePage.php @@ -42,14 +42,16 @@ class SearchReplacePage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - $params = $request->getQueryParams(); - $title = I18N::translate('Search and replace'); + $tree = Validator::attributes($request)->tree(); + $context = Validator::queryParams($request)->string('context', 'all'); + $replace = Validator::queryParams($request)->string('replace', ''); + $search = Validator::queryParams($request)->string('search', ''); + $title = I18N::translate('Search and replace'); return $this->viewResponse('search-replace-page', [ - 'context' => $params['context'] ?? 'all', - 'replace' => $params['replace'] ?? '', - 'search' => $params['search'] ?? '', + 'context' => $context, + 'replace' => $replace, + 'search' => $search, 'title' => $title, 'tree' => $tree, ]); diff --git a/app/Http/RequestHandlers/SelectNewFact.php b/app/Http/RequestHandlers/SelectNewFact.php index 304c31866e..7128df01f6 100644 --- a/app/Http/RequestHandlers/SelectNewFact.php +++ b/app/Http/RequestHandlers/SelectNewFact.php @@ -38,15 +38,10 @@ class SelectNewFact implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - $xref = Validator::attributes($request)->isXref()->string('xref'); - $params = (array) $request->getParsedBody(); - $fact = $params['fact']; - return redirect(route(AddNewFact::class, [ - 'tree' => $tree->name(), - 'xref' => $xref, - 'fact' => $fact, + 'tree' => Validator::attributes($request)->tree()->name(), + 'xref' => Validator::attributes($request)->isXref()->string('xref'), + 'fact' => Validator::parsedBody($request)->string('fact'), ])); } } diff --git a/app/Http/RequestHandlers/SetupWizard.php b/app/Http/RequestHandlers/SetupWizard.php index 52601cfff2..eac6ef673e 100644 --- a/app/Http/RequestHandlers/SetupWizard.php +++ b/app/Http/RequestHandlers/SetupWizard.php @@ -201,12 +201,10 @@ class SetupWizard implements RequestHandlerInterface */ private function userData(ServerRequestInterface $request): array { - $params = (array) $request->getParsedBody(); - $data = []; foreach (self::DEFAULT_DATA as $key => $default) { - $data[$key] = $params[$key] ?? $default; + $data[$key] = Validator::parsedBody($request)->string($key, $default); } return $data; diff --git a/app/Http/RequestHandlers/SiteLogsAction.php b/app/Http/RequestHandlers/SiteLogsAction.php index bf9a34ca2b..2b6469e9dc 100644 --- a/app/Http/RequestHandlers/SiteLogsAction.php +++ b/app/Http/RequestHandlers/SiteLogsAction.php @@ -19,6 +19,7 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -35,16 +36,14 @@ class SiteLogsAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $params = (array) $request->getParsedBody(); - return redirect(route(SiteLogsPage::class, [ - 'tree' => $params['tree'], - 'from' => $params['from'] ?? '', - 'to' => $params['to'] ?? '', - 'type' => $params['type'] ?? '', - 'text' => $params['text'] ?? '', - 'ip' => $params['ip'] ?? '', - 'username' => $params['username'] ?? '', + 'tree' => Validator::parsedBody($request)->string('tree'), + 'from' => Validator::parsedBody($request)->string('from'), + 'to' => Validator::parsedBody($request)->string('to'), + 'type' => Validator::parsedBody($request)->string('type'), + 'text' => Validator::parsedBody($request)->string('text'), + 'ip' => Validator::parsedBody($request)->string('ip'), + 'username' => Validator::parsedBody($request)->string('username'), ])); } } diff --git a/app/Http/RequestHandlers/SitePreferencesAction.php b/app/Http/RequestHandlers/SitePreferencesAction.php index d664275d98..d60776fcda 100644 --- a/app/Http/RequestHandlers/SitePreferencesAction.php +++ b/app/Http/RequestHandlers/SitePreferencesAction.php @@ -22,6 +22,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Site; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -41,24 +42,26 @@ class SitePreferencesAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $params = (array) $request->getParsedBody(); + $index_directory = Validator::parsedBody($request)->string('INDEX_DIRECTORY'); + $allow_change_gedcom = Validator::parsedBody($request)->boolean('ALLOW_CHANGE_GEDCOM'); + $language = Validator::parsedBody($request)->string('LANGUAGE'); + $theme_dir = Validator::parsedBody($request)->string('THEME_DIR'); + $timezone = Validator::parsedBody($request)->string('TIMEZONE'); - $INDEX_DIRECTORY = $params['INDEX_DIRECTORY']; - - if (!str_ends_with($INDEX_DIRECTORY, '/')) { - $INDEX_DIRECTORY .= '/'; + if (!str_ends_with($index_directory, '/')) { + $index_directory .= '/'; } - if (is_dir($INDEX_DIRECTORY)) { - Site::setPreference('INDEX_DIRECTORY', $INDEX_DIRECTORY); + if (is_dir($index_directory)) { + Site::setPreference('INDEX_DIRECTORY', $index_directory); } else { - FlashMessages::addMessage(I18N::translate('The folder “%s” does not exist.', e($INDEX_DIRECTORY)), 'danger'); + FlashMessages::addMessage(I18N::translate('The folder “%s” does not exist.', e($index_directory)), 'danger'); } - Site::setPreference('ALLOW_CHANGE_GEDCOM', $params['ALLOW_CHANGE_GEDCOM']); - Site::setPreference('LANGUAGE', $params['LANGUAGE']); - Site::setPreference('THEME_DIR', $params['THEME_DIR']); - Site::setPreference('TIMEZONE', $params['TIMEZONE']); + Site::setPreference('ALLOW_CHANGE_GEDCOM', (string) $allow_change_gedcom); + Site::setPreference('LANGUAGE', $language); + Site::setPreference('THEME_DIR', $theme_dir); + Site::setPreference('TIMEZONE', $timezone); FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success'); $url = route(ControlPanel::class); diff --git a/app/Http/RequestHandlers/SiteRegistrationAction.php b/app/Http/RequestHandlers/SiteRegistrationAction.php index 91f1dd41ba..d18c24f518 100644 --- a/app/Http/RequestHandlers/SiteRegistrationAction.php +++ b/app/Http/RequestHandlers/SiteRegistrationAction.php @@ -22,6 +22,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Site; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -41,16 +42,18 @@ class SiteRegistrationAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $params = (array) $request->getParsedBody(); + $mode = Validator::parsedBody($request)->string('WELCOME_TEXT_AUTH_MODE'); + $text = Validator::parsedBody($request)->string('WELCOME_TEXT_AUTH_MODE_4'); + $allow_registration = Validator::parsedBody($request)->boolean('USE_REGISTRATION_MODULE'); + $show_caution = Validator::parsedBody($request)->boolean('SHOW_REGISTER_CAUTION'); - Site::setPreference('WELCOME_TEXT_AUTH_MODE', $params['WELCOME_TEXT_AUTH_MODE']); - Site::setPreference('WELCOME_TEXT_AUTH_MODE_' . I18N::languageTag(), $params['WELCOME_TEXT_AUTH_MODE_4']); - Site::setPreference('USE_REGISTRATION_MODULE', $params['USE_REGISTRATION_MODULE']); - Site::setPreference('SHOW_REGISTER_CAUTION', $params['SHOW_REGISTER_CAUTION']); + Site::setPreference('WELCOME_TEXT_AUTH_MODE', $mode); + Site::setPreference('WELCOME_TEXT_AUTH_MODE_' . I18N::languageTag(), $text); + Site::setPreference('USE_REGISTRATION_MODULE', (string) $allow_registration); + Site::setPreference('SHOW_REGISTER_CAUTION', (string) $show_caution); FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success'); - $url = route(ControlPanel::class); - return redirect($url); + return redirect(route(ControlPanel::class)); } } diff --git a/app/Http/RequestHandlers/TreePageBlock.php b/app/Http/RequestHandlers/TreePageBlock.php index aa4bc48a35..9a056e7a20 100644 --- a/app/Http/RequestHandlers/TreePageBlock.php +++ b/app/Http/RequestHandlers/TreePageBlock.php @@ -53,7 +53,7 @@ class TreePageBlock implements RequestHandlerInterface public function handle(ServerRequestInterface $request): ResponseInterface { $tree = Validator::attributes($request)->tree(); - $block_id = $request->getQueryParams()['block_id']; + $block_id = Validator::queryParams($request)->integer('block_id'); $block_id = (int) DB::table('block') ->where('block_id', '=', $block_id) diff --git a/app/Http/RequestHandlers/TreePageDefaultUpdate.php b/app/Http/RequestHandlers/TreePageDefaultUpdate.php index e08804db52..e21044e756 100644 --- a/app/Http/RequestHandlers/TreePageDefaultUpdate.php +++ b/app/Http/RequestHandlers/TreePageDefaultUpdate.php @@ -21,6 +21,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Module\ModuleBlockInterface; use Fisharebest\Webtrees\Services\HomePageService; +use Fisharebest\Webtrees\Validator; use Illuminate\Support\Collection; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -51,10 +52,8 @@ class TreePageDefaultUpdate implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $params = (array) $request->getParsedBody(); - - $main_blocks = new Collection($params[ModuleBlockInterface::MAIN_BLOCKS] ?? []); - $side_blocks = new Collection($params[ModuleBlockInterface::SIDE_BLOCKS] ?? []); + $main_blocks = new Collection(Validator::parsedBody($request)->array(ModuleBlockInterface::MAIN_BLOCKS)); + $side_blocks = new Collection(Validator::parsedBody($request)->array(ModuleBlockInterface::SIDE_BLOCKS)); $this->home_page_service->updateTreeBlocks(-1, $main_blocks, $side_blocks); diff --git a/app/Http/RequestHandlers/TreePageUpdate.php b/app/Http/RequestHandlers/TreePageUpdate.php index aa09ba1dcd..8b8dfcaea3 100644 --- a/app/Http/RequestHandlers/TreePageUpdate.php +++ b/app/Http/RequestHandlers/TreePageUpdate.php @@ -53,12 +53,9 @@ class TreePageUpdate implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - $user = Validator::attributes($request)->user(); - - $params = (array) $request->getParsedBody(); - - $defaults = (bool) ($params['defaults'] ?? false); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); + $defaults = Validator::parsedBody($request)->boolean('defaults', false); if ($defaults) { $default_tree = new Tree(-1, 'DEFAULT', 'DEFAULT'); @@ -72,8 +69,8 @@ class TreePageUpdate implements RequestHandlerInterface return $block->name(); }); } else { - $main_blocks = new Collection($params[ModuleBlockInterface::MAIN_BLOCKS] ?? []); - $side_blocks = new Collection($params[ModuleBlockInterface::SIDE_BLOCKS] ?? []); + $main_blocks = new Collection(Validator::parsedBody($request)->array(ModuleBlockInterface::MAIN_BLOCKS)); + $side_blocks = new Collection(Validator::parsedBody($request)->array(ModuleBlockInterface::SIDE_BLOCKS)); } $this->home_page_service->updateTreeBlocks($tree->id(), $main_blocks, $side_blocks); diff --git a/app/Http/RequestHandlers/TreePreferencesAction.php b/app/Http/RequestHandlers/TreePreferencesAction.php index c2b845d26a..34d291e2f8 100644 --- a/app/Http/RequestHandlers/TreePreferencesAction.php +++ b/app/Http/RequestHandlers/TreePreferencesAction.php @@ -49,60 +49,94 @@ class TreePreferencesAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - $params = (array) $request->getParsedBody(); + $tree = Validator::attributes($request)->tree(); // For backwards compatibility with webtrees 1.x we store the two calendar formats in one variable // e.g. "gregorian_and_jewish" - $tree->setPreference('CALENDAR_FORMAT', implode('_and_', array_unique([ - $params['CALENDAR_FORMAT0'] ?? 'none', - $params['CALENDAR_FORMAT1'] ?? 'none', - ]))); - $tree->setPreference('CHART_BOX_TAGS', implode(',', $params['CHART_BOX_TAGS'] ?? [])); - $tree->setPreference('CONTACT_USER_ID', $params['CONTACT_USER_ID'] ?? ''); - $tree->setPreference('EXPAND_NOTES', $params['EXPAND_NOTES'] ?? ''); - $tree->setPreference('EXPAND_SOURCES', $params['EXPAND_SOURCES'] ?? ''); - $tree->setPreference('FAM_FACTS_QUICK', implode(',', $params['FAM_FACTS_QUICK'] ?? [])); - $tree->setPreference('FORMAT_TEXT', $params['FORMAT_TEXT'] ?? ''); - $tree->setPreference('GENERATE_UIDS', $params['GENERATE_UIDS'] ?? ''); - $tree->setPreference('HIDE_GEDCOM_ERRORS', $params['HIDE_GEDCOM_ERRORS'] ?? ''); - $tree->setPreference('INDI_FACTS_QUICK', implode(',', $params['INDI_FACTS_QUICK'] ?? [])); - $tree->setPreference('MEDIA_UPLOAD', $params['MEDIA_UPLOAD'] ?? ''); - $tree->setPreference('META_DESCRIPTION', $params['META_DESCRIPTION'] ?? ''); - $tree->setPreference('META_TITLE', $params['META_TITLE'] ?? ''); - $tree->setPreference('NO_UPDATE_CHAN', $params['NO_UPDATE_CHAN'] ?? ''); - $tree->setPreference('PEDIGREE_ROOT_ID', $params['PEDIGREE_ROOT_ID'] ?? ''); - $tree->setPreference('QUICK_REQUIRED_FACTS', implode(',', $params['QUICK_REQUIRED_FACTS'] ?? [])); - $tree->setPreference('QUICK_REQUIRED_FAMFACTS', implode(',', $params['QUICK_REQUIRED_FAMFACTS'] ?? [])); - $tree->setPreference('SHOW_COUNTER', $params['SHOW_COUNTER'] ?? ''); - $tree->setPreference('SHOW_EST_LIST_DATES', $params['SHOW_EST_LIST_DATES'] ?? ''); - $tree->setPreference('SHOW_FACT_ICONS', $params['SHOW_FACT_ICONS'] ?? ''); - $tree->setPreference('SHOW_GEDCOM_RECORD', $params['SHOW_GEDCOM_RECORD'] ?? ''); - $tree->setPreference('SHOW_HIGHLIGHT_IMAGES', $params['SHOW_HIGHLIGHT_IMAGES'] ?? ''); - $tree->setPreference('SHOW_LAST_CHANGE', $params['SHOW_LAST_CHANGE'] ?? ''); - $tree->setPreference('SHOW_MEDIA_DOWNLOAD', $params['SHOW_MEDIA_DOWNLOAD'] ?? ''); - $tree->setPreference('SHOW_NO_WATERMARK', $params['SHOW_NO_WATERMARK'] ?? ''); - $tree->setPreference('SHOW_PARENTS_AGE', $params['SHOW_PARENTS_AGE'] ?? ''); - $tree->setPreference('SHOW_PEDIGREE_PLACES', $params['SHOW_PEDIGREE_PLACES'] ?? ''); - $tree->setPreference('SHOW_PEDIGREE_PLACES_SUFFIX', $params['SHOW_PEDIGREE_PLACES_SUFFIX'] ?? ''); - $tree->setPreference('SHOW_RELATIVES_EVENTS', implode(',', $params['SHOW_RELATIVES_EVENTS'] ?? [])); - $tree->setPreference('SUBLIST_TRIGGER_I', $params['SUBLIST_TRIGGER_I'] ?? '200'); - $tree->setPreference('SURNAME_LIST_STYLE', $params['SURNAME_LIST_STYLE'] ?? ''); - $tree->setPreference('SURNAME_TRADITION', $params['SURNAME_TRADITION'] ?? ''); - $tree->setPreference('USE_SILHOUETTE', $params['USE_SILHOUETTE'] ?? ''); - $tree->setPreference('WEBMASTER_USER_ID', $params['WEBMASTER_USER_ID'] ?? ''); - $tree->setPreference('title', $params['title'] ?? ''); + $calendar_format_0 = Validator::parsedBody($request)->string('CALENDAR_FORMAT0'); + $calendar_format_1 = Validator::parsedBody($request)->string('CALENDAR_FORMAT1'); + $calendar_format = implode('_and_', array_unique([$calendar_format_0, $calendar_format_1])); + $chart_box_tags = Validator::parsedBody($request)->array('CHART_BOX_TAGS'); + $contact_user_id = Validator::parsedBody($request)->string('CONTACT_USER_ID'); + $expand_notes = Validator::parsedBody($request)->boolean('EXPAND_NOTES'); + $expand_sources = Validator::parsedBody($request)->boolean('EXPAND_SOURCES'); + $fam_facts_quick = Validator::parsedBody($request)->array('FAM_FACTS_QUICK'); + $format_text = Validator::parsedBody($request)->string('FORMAT_TEXT'); + $generate_uuids = Validator::parsedBody($request)->boolean('GENERATE_UIDS'); + $hide_gedcom_errors = Validator::parsedBody($request)->boolean('HIDE_GEDCOM_ERRORS'); + $indi_facts_quick = Validator::parsedBody($request)->array('INDI_FACTS_QUICK'); + $media_upload = Validator::parsedBody($request)->integer('MEDIA_UPLOAD'); + $meta_description = Validator::parsedBody($request)->string('META_DESCRIPTION'); + $meta_title = Validator::parsedBody($request)->string('META_TITLE'); + $no_update_chan = Validator::parsedBody($request)->boolean('NO_UPDATE_CHAN'); + $pedigree_root_id = Validator::parsedBody($request)->string('PEDIGREE_ROOT_ID'); + $quick_required_facts = Validator::parsedBody($request)->array('QUICK_REQUIRED_FACTS'); + $quick_required_famfacts = Validator::parsedBody($request)->array('QUICK_REQUIRED_FAMFACTS'); + $show_counter = Validator::parsedBody($request)->boolean('SHOW_COUNTER'); + $show_est_list_dates = Validator::parsedBody($request)->boolean('SHOW_EST_LIST_DATES'); + $show_fact_icons = Validator::parsedBody($request)->boolean('SHOW_FACT_ICONS'); + $show_gedcom_record = Validator::parsedBody($request)->boolean('SHOW_GEDCOM_RECORD'); + $show_highlight_images = Validator::parsedBody($request)->boolean('SHOW_HIGHLIGHT_IMAGES'); + $show_last_change = Validator::parsedBody($request)->boolean('SHOW_LAST_CHANGE'); + $show_media_download = Validator::parsedBody($request)->integer('SHOW_MEDIA_DOWNLOAD'); + $show_no_watermark = Validator::parsedBody($request)->integer('SHOW_NO_WATERMARK'); + $show_parents_age = Validator::parsedBody($request)->boolean('SHOW_PARENTS_AGE'); + $show_pedigree_places = Validator::parsedBody($request)->integer('SHOW_PEDIGREE_PLACES'); + $show_pedigree_places_suffix = Validator::parsedBody($request)->integer('SHOW_PEDIGREE_PLACES_SUFFIX'); + $show_relatives_events = Validator::parsedBody($request)->array('SHOW_RELATIVES_EVENTS'); + $sublist_trigger_i = Validator::parsedBody($request)->integer('SUBLIST_TRIGGER_I'); + $surname_list_style = Validator::parsedBody($request)->string('SURNAME_LIST_STYLE'); + $surname_tradition = Validator::parsedBody($request)->string('SURNAME_TRADITION'); + $use_silhouette = Validator::parsedBody($request)->boolean('USE_SILHOUETTE'); + $webmaster_user_id = Validator::parsedBody($request)->integer('WEBMASTER_USER_ID'); + $title = Validator::parsedBody($request)->string('title'); + + $tree->setPreference('CALENDAR_FORMAT', $calendar_format); + $tree->setPreference('CHART_BOX_TAGS', implode(',', $chart_box_tags)); + $tree->setPreference('CONTACT_USER_ID', $contact_user_id); + $tree->setPreference('EXPAND_NOTES', (string) $expand_notes); + $tree->setPreference('EXPAND_SOURCES', (string) $expand_sources); + $tree->setPreference('FAM_FACTS_QUICK', implode(',', $fam_facts_quick)); + $tree->setPreference('FORMAT_TEXT', $format_text); + $tree->setPreference('GENERATE_UIDS', (string) $generate_uuids); + $tree->setPreference('HIDE_GEDCOM_ERRORS', (string) $hide_gedcom_errors); + $tree->setPreference('INDI_FACTS_QUICK', implode(',', $indi_facts_quick)); + $tree->setPreference('MEDIA_UPLOAD', (string) $media_upload); + $tree->setPreference('META_DESCRIPTION', $meta_description); + $tree->setPreference('META_TITLE', $meta_title); + $tree->setPreference('NO_UPDATE_CHAN', (string) $no_update_chan); + $tree->setPreference('PEDIGREE_ROOT_ID', $pedigree_root_id); + $tree->setPreference('QUICK_REQUIRED_FACTS', implode(',', $quick_required_facts)); + $tree->setPreference('QUICK_REQUIRED_FAMFACTS', implode(',', $quick_required_famfacts)); + $tree->setPreference('SHOW_COUNTER', (string) $show_counter); + $tree->setPreference('SHOW_EST_LIST_DATES', (string) $show_est_list_dates); + $tree->setPreference('SHOW_FACT_ICONS', (string) $show_fact_icons); + $tree->setPreference('SHOW_GEDCOM_RECORD', (string) $show_gedcom_record); + $tree->setPreference('SHOW_HIGHLIGHT_IMAGES', (string) $show_highlight_images); + $tree->setPreference('SHOW_LAST_CHANGE', (string) $show_last_change); + $tree->setPreference('SHOW_MEDIA_DOWNLOAD', (string) $show_media_download); + $tree->setPreference('SHOW_NO_WATERMARK', (string) $show_no_watermark); + $tree->setPreference('SHOW_PARENTS_AGE', (string) $show_parents_age); + $tree->setPreference('SHOW_PEDIGREE_PLACES', (string) $show_pedigree_places); + $tree->setPreference('SHOW_PEDIGREE_PLACES_SUFFIX', (string) $show_pedigree_places_suffix); + $tree->setPreference('SHOW_RELATIVES_EVENTS', implode(',', $show_relatives_events)); + $tree->setPreference('SUBLIST_TRIGGER_I', (string) $sublist_trigger_i); + $tree->setPreference('SURNAME_LIST_STYLE', $surname_list_style); + $tree->setPreference('SURNAME_TRADITION', $surname_tradition); + $tree->setPreference('USE_SILHOUETTE', (string) $use_silhouette); + $tree->setPreference('WEBMASTER_USER_ID', (string) $webmaster_user_id); + $tree->setPreference('title', $title); if (Auth::isAdmin()) { // Only accept valid folders for MEDIA_DIRECTORY - $MEDIA_DIRECTORY = $params['MEDIA_DIRECTORY'] ?? ''; + $MEDIA_DIRECTORY = Validator::parsedBody($request)->string('MEDIA_DIRECTORY'); $MEDIA_DIRECTORY = preg_replace('/[:\/\\\\]+/', '/', $MEDIA_DIRECTORY); $MEDIA_DIRECTORY = trim($MEDIA_DIRECTORY, '/') . '/'; $tree->setPreference('MEDIA_DIRECTORY', $MEDIA_DIRECTORY); } - $gedcom = $params['gedcom'] ?? ''; + $gedcom = Validator::parsedBody($request)->string('gedcom'); $url = route(ManageTrees::class, ['tree' => $tree->name()]); if (Auth::isAdmin() && $gedcom !== '' && $gedcom !== $tree->name()) { @@ -126,14 +160,14 @@ class TreePreferencesAction implements RequestHandlerInterface FlashMessages::addMessage(I18N::translate('The preferences for the family tree “%s” have been updated.', e($tree->title())), 'success'); // Coming soon... - $all_trees = $params['all_trees'] ?? ''; - $new_trees = $params['new_trees'] ?? ''; + $all_trees = Validator::parsedBody($request)->boolean('all_trees', false); + $new_trees = Validator::parsedBody($request)->boolean('new_trees', false); - if ($all_trees === 'on') { + if ($all_trees) { FlashMessages::addMessage(I18N::translate('The preferences for all family trees have been updated.'), 'success'); } - if ($new_trees === 'on') { + if ($new_trees) { FlashMessages::addMessage(I18N::translate('The preferences for new family trees have been updated.'), 'success'); } diff --git a/app/Http/RequestHandlers/TreePrivacyAction.php b/app/Http/RequestHandlers/TreePrivacyAction.php index b4cc92f835..793da19f0f 100644 --- a/app/Http/RequestHandlers/TreePrivacyAction.php +++ b/app/Http/RequestHandlers/TreePrivacyAction.php @@ -20,6 +20,7 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\FlashMessages; +use Fisharebest\Webtrees\Http\Exceptions\HttpBadRequestException; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; @@ -44,17 +45,25 @@ class TreePrivacyAction implements RequestHandlerInterface public function handle(ServerRequestInterface $request): ResponseInterface { $tree = Validator::attributes($request)->tree(); - $params = (array) $request->getParsedBody(); - $delete_default_resn_id = $params['delete'] ?? []; + $delete_default_resn_id = Validator::parsedBody($request)->array('delete'); DB::table('default_resn') ->whereIn('default_resn_id', $delete_default_resn_id) ->delete(); - $xrefs = $params['xref'] ?? []; - $tag_types = $params['tag_type'] ?? []; - $resns = $params['resn'] ?? []; + $xrefs = Validator::parsedBody($request)->array('xref'); + $tag_types = Validator::parsedBody($request)->array('tag_type'); + $resns = Validator::parsedBody($request)->array('resn'); + + $count_xrefs = count($xrefs); + $count_tag_types = count($tag_types); + $count_resns = count($resns); + + if ($count_xrefs !== $count_tag_types || $count_xrefs !== $count_resns) { + $message = 'Bad parameter count: ' . $count_xrefs . '/' . $count_tag_types . '/' . $count_resns; + throw new HttpBadRequestException($message); + } foreach ($xrefs as $n => $xref) { $tag_type = $tag_types[$n]; @@ -96,25 +105,34 @@ class TreePrivacyAction implements RequestHandlerInterface } } - $tree->setPreference('HIDE_LIVE_PEOPLE', $params['HIDE_LIVE_PEOPLE']); - $tree->setPreference('KEEP_ALIVE_YEARS_BIRTH', $params['KEEP_ALIVE_YEARS_BIRTH']); - $tree->setPreference('KEEP_ALIVE_YEARS_DEATH', $params['KEEP_ALIVE_YEARS_DEATH']); - $tree->setPreference('MAX_ALIVE_AGE', $params['MAX_ALIVE_AGE']); - $tree->setPreference('REQUIRE_AUTHENTICATION', $params['REQUIRE_AUTHENTICATION']); - $tree->setPreference('SHOW_DEAD_PEOPLE', $params['SHOW_DEAD_PEOPLE']); - $tree->setPreference('SHOW_LIVING_NAMES', $params['SHOW_LIVING_NAMES']); - $tree->setPreference('SHOW_PRIVATE_RELATIONSHIPS', $params['SHOW_PRIVATE_RELATIONSHIPS']); + $hide_live_people = Validator::parsedBody($request)->string('HIDE_LIVE_PEOPLE'); + $keep_alive_years_birth = Validator::parsedBody($request)->integer('KEEP_ALIVE_YEARS_BIRTH', 0); + $keep_alive_years_death = Validator::parsedBody($request)->integer('KEEP_ALIVE_YEARS_DEATH', 0); + $max_alive_age = Validator::parsedBody($request)->integer('MAX_ALIVE_AGE'); + $require_authentication = Validator::parsedBody($request)->string('REQUIRE_AUTHENTICATION'); + $show_dead_people = Validator::parsedBody($request)->string('SHOW_DEAD_PEOPLE'); + $show_living_names = Validator::parsedBody($request)->string('SHOW_LIVING_NAMES'); + $show_private_relationships = Validator::parsedBody($request)->string('SHOW_PRIVATE_RELATIONSHIPS'); + + $tree->setPreference('HIDE_LIVE_PEOPLE', $hide_live_people); + $tree->setPreference('KEEP_ALIVE_YEARS_BIRTH', (string) $keep_alive_years_birth); + $tree->setPreference('KEEP_ALIVE_YEARS_DEATH', (string) $keep_alive_years_death); + $tree->setPreference('MAX_ALIVE_AGE', (string) $max_alive_age); + $tree->setPreference('REQUIRE_AUTHENTICATION', $require_authentication); + $tree->setPreference('SHOW_DEAD_PEOPLE', $show_dead_people); + $tree->setPreference('SHOW_LIVING_NAMES', $show_living_names); + $tree->setPreference('SHOW_PRIVATE_RELATIONSHIPS', $show_private_relationships); FlashMessages::addMessage(I18N::translate('The preferences for the family tree “%s” have been updated.', e($tree->title())), 'success'); // Coming soon... - $all_trees = $params['all_trees'] ?? ''; - $new_trees = $params['new_trees'] ?? ''; + $all_trees = Validator::parsedBody($request)->boolean('all_trees', false); + $new_trees = Validator::parsedBody($request)->boolean('new_trees', false); - if ($all_trees === 'on') { + if ($all_trees) { FlashMessages::addMessage(I18N::translate('The preferences for all family trees have been updated.', e($tree->title())), 'success'); } - if ($new_trees === 'on') { + if ($new_trees) { FlashMessages::addMessage(I18N::translate('The preferences for new family trees have been updated.', e($tree->title())), 'success'); } diff --git a/app/Http/RequestHandlers/UnconnectedAction.php b/app/Http/RequestHandlers/UnconnectedAction.php index 3674d8651f..ed1de694b4 100644 --- a/app/Http/RequestHandlers/UnconnectedAction.php +++ b/app/Http/RequestHandlers/UnconnectedAction.php @@ -38,17 +38,10 @@ class UnconnectedAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - - $params = (array) $request->getParsedBody(); - - $aliases = $params['aliases'] ?? ''; - $associates = $params['associates'] ?? ''; - return redirect(route(UnconnectedPage::class, [ - 'aliases' => $aliases, - 'associates' => $associates, - 'tree' => $tree->name(), + 'aliases' => Validator::parsedBody($request)->boolean('aliases', false), + 'associates' => Validator::parsedBody($request)->boolean('associates', false), + 'tree' => Validator::attributes($request)->tree()->name(), ])); } } diff --git a/app/Http/RequestHandlers/UnconnectedPage.php b/app/Http/RequestHandlers/UnconnectedPage.php index f07001fb73..362fcdb7ae 100644 --- a/app/Http/RequestHandlers/UnconnectedPage.php +++ b/app/Http/RequestHandlers/UnconnectedPage.php @@ -51,8 +51,8 @@ class UnconnectedPage implements RequestHandlerInterface { $tree = Validator::attributes($request)->tree(); $user = Validator::attributes($request)->user(); - $aliases = (bool) ($request->getQueryParams()['aliases'] ?? false); - $associates = (bool) ($request->getQueryParams()['associates'] ?? false); + $aliases = Validator::queryParams($request)->boolean('aliases', false); + $associates = Validator::queryParams($request)->boolean('associates', false); // Connect individuals using these links. $links = ['FAMS', 'FAMC']; diff --git a/app/Http/RequestHandlers/UpgradeWizardPage.php b/app/Http/RequestHandlers/UpgradeWizardPage.php index 7fbd1534da..0017da8dad 100644 --- a/app/Http/RequestHandlers/UpgradeWizardPage.php +++ b/app/Http/RequestHandlers/UpgradeWizardPage.php @@ -23,6 +23,7 @@ use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\TreeService; use Fisharebest\Webtrees\Services\UpgradeService; +use Fisharebest\Webtrees\Validator; use Fisharebest\Webtrees\Webtrees; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -74,7 +75,7 @@ class UpgradeWizardPage implements RequestHandlerInterface { $this->layout = 'layouts/administration'; - $continue = $request->getQueryParams()['continue'] ?? ''; + $continue = Validator::queryParams($request)->string('continue', ''); $title = I18N::translate('Upgrade wizard'); diff --git a/app/Http/RequestHandlers/UpgradeWizardStep.php b/app/Http/RequestHandlers/UpgradeWizardStep.php index 67e748cebe..811992be8c 100644 --- a/app/Http/RequestHandlers/UpgradeWizardStep.php +++ b/app/Http/RequestHandlers/UpgradeWizardStep.php @@ -28,6 +28,7 @@ use Fisharebest\Webtrees\Services\GedcomExportService; use Fisharebest\Webtrees\Services\TreeService; use Fisharebest\Webtrees\Services\UpgradeService; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Fisharebest\Webtrees\Webtrees; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Support\Collection; @@ -119,8 +120,7 @@ class UpgradeWizardStep implements RequestHandlerInterface $zip_file = Webtrees::ROOT_DIR . self::ZIP_FILENAME; $zip_folder = Webtrees::ROOT_DIR . self::UPGRADE_FOLDER; - - $step = $request->getQueryParams()['step'] ?? self::STEP_CHECK; + $step = Validator::queryParams($request)->string('step', self::STEP_CHECK); switch ($step) { case self::STEP_CHECK: @@ -133,7 +133,7 @@ class UpgradeWizardStep implements RequestHandlerInterface return $this->wizardStepPending(); case self::STEP_EXPORT: - $tree_name = $request->getQueryParams()['tree'] ?? ''; + $tree_name = Validator::queryParams($request)->string('tree_name'); $tree = $this->tree_service->all()[$tree_name]; assert($tree instanceof Tree); diff --git a/app/Http/RequestHandlers/UploadMediaAction.php b/app/Http/RequestHandlers/UploadMediaAction.php index 84aadd398a..5275edf65e 100644 --- a/app/Http/RequestHandlers/UploadMediaAction.php +++ b/app/Http/RequestHandlers/UploadMediaAction.php @@ -26,6 +26,7 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Log; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\MediaFileService; +use Fisharebest\Webtrees\Validator; use League\Flysystem\FilesystemException; use League\Flysystem\UnableToCheckFileExistence; use League\Flysystem\UnableToWriteFile; @@ -69,10 +70,7 @@ class UploadMediaAction implements RequestHandlerInterface public function handle(ServerRequestInterface $request): ResponseInterface { $data_filesystem = Registry::filesystem()->data(); - - $params = (array) $request->getParsedBody(); - - $all_folders = $this->media_file_service->allMediaFolders($data_filesystem); + $all_folders = $this->media_file_service->allMediaFolders($data_filesystem); foreach ($request->getUploadedFiles() as $key => $uploaded_file) { if ($uploaded_file->getError() === UPLOAD_ERR_NO_FILE) { @@ -83,10 +81,9 @@ class UploadMediaAction implements RequestHandlerInterface throw new FileUploadException($uploaded_file); } - $key = substr($key, 9); - - $folder = $params['folder' . $key]; - $filename = $params['filename' . $key]; + $key = substr($key, 9); + $folder = Validator::parsedBody($request)->string('folder' . $key); + $filename = Validator::parsedBody($request)->string('filename' . $key); // If no filename specified, use the original filename. if ($filename === '') { diff --git a/app/Http/RequestHandlers/UserAddAction.php b/app/Http/RequestHandlers/UserAddAction.php index 5e0f5fd826..fc1bcfb2ca 100644 --- a/app/Http/RequestHandlers/UserAddAction.php +++ b/app/Http/RequestHandlers/UserAddAction.php @@ -25,6 +25,7 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Log; use Fisharebest\Webtrees\Services\UserService; use Fisharebest\Webtrees\Site; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -55,12 +56,10 @@ class UserAddAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $params = (array) $request->getParsedBody(); - - $username = $params['username'] ?? ''; - $real_name = $params['real_name'] ?? ''; - $email = $params['email'] ?? ''; - $password = $params['password'] ?? ''; + $username = Validator::parsedBody($request)->string('username'); + $real_name = Validator::parsedBody($request)->string('real_name'); + $email = Validator::parsedBody($request)->string('email'); + $password = Validator::parsedBody($request)->string('password'); $errors = false; if ($this->user_service->findByUserName($username)) { diff --git a/app/Http/RequestHandlers/UserAddPage.php b/app/Http/RequestHandlers/UserAddPage.php index 4e0e3b5fa5..bf60fee8f5 100644 --- a/app/Http/RequestHandlers/UserAddPage.php +++ b/app/Http/RequestHandlers/UserAddPage.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,10 +42,9 @@ class UserAddPage implements RequestHandlerInterface { $this->layout = 'layouts/administration'; - $params = $request->getQueryParams(); - $email = $params['email'] ?? ''; - $real_name = $params['real_name'] ?? ''; - $username = $params['username'] ?? ''; + $email = Validator::queryParams($request)->string('email', ''); + $real_name = Validator::queryParams($request)->string('real_name', ''); + $username = Validator::queryParams($request)->string('username', ''); $title = I18N::translate('Add a user'); return $this->viewResponse('admin/users-create', [ diff --git a/app/Http/RequestHandlers/UserEditAction.php b/app/Http/RequestHandlers/UserEditAction.php index 0e9589a7ab..5b8e786c0b 100644 --- a/app/Http/RequestHandlers/UserEditAction.php +++ b/app/Http/RequestHandlers/UserEditAction.php @@ -71,25 +71,22 @@ class UserEditAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $user = Validator::attributes($request)->user(); - - $params = (array) $request->getParsedBody(); - - $user_id = (int) $params['user_id']; - $username = $params['username'] ?? ''; - $real_name = $params['real_name'] ?? ''; - $email = $params['email'] ?? ''; - $password = $params['password'] ?? ''; - $theme = $params['theme'] ?? ''; - $language = $params['language'] ?? ''; - $timezone = $params['timezone'] ?? ''; - $contact_method = $params['contact-method'] ?? ''; - $comment = $params['comment'] ?? ''; - $auto_accept = (bool) ($params[UserInterface::PREF_AUTO_ACCEPT_EDITS] ?? ''); - $canadmin = (bool) ($params[UserInterface::PREF_IS_ADMINISTRATOR] ?? ''); - $visible_online = (bool) ($params['visible-online'] ?? ''); - $verified = (bool) ($params[UserInterface::PREF_IS_EMAIL_VERIFIED] ?? ''); - $approved = (bool) ($params['approved'] ?? ''); + $user = Validator::attributes($request)->user(); + $user_id = Validator::parsedBody($request)->integer('user_id'); + $username = Validator::parsedBody($request)->string('username'); + $real_name = Validator::parsedBody($request)->string('real_name'); + $email = Validator::parsedBody($request)->string('email'); + $password = Validator::parsedBody($request)->string('password'); + $theme = Validator::parsedBody($request)->string('theme'); + $language = Validator::parsedBody($request)->string('language'); + $timezone = Validator::parsedBody($request)->string('timezone'); + $contact_method = Validator::parsedBody($request)->string('contact-method'); + $comment = Validator::parsedBody($request)->string('comment'); + $auto_accept = Validator::parsedBody($request)->boolean('auto_accept', false); + $canadmin = Validator::parsedBody($request)->boolean('canadmin', false); + $visible_online = Validator::parsedBody($request)->boolean('visible-online', false); + $verified = Validator::parsedBody($request)->boolean('verified', false); + $approved = Validator::parsedBody($request)->boolean('approved', false); $edit_user = $this->user_service->find($user_id); @@ -135,9 +132,9 @@ class UserEditAction implements RequestHandlerInterface } foreach ($this->tree_service->all() as $tree) { - $path_length = (int) $params['RELATIONSHIP_PATH_LENGTH' . $tree->id()]; - $gedcom_id = $params['gedcomid' . $tree->id()] ?? ''; - $can_edit = $params['canedit' . $tree->id()] ?? ''; + $path_length = Validator::parsedBody($request)->integer('RELATIONSHIP_PATH_LENGTH' . $tree->id(), 0); + $gedcom_id = Validator::parsedBody($request)->string('gedcomid' . $tree->id(), ''); + $can_edit = Validator::parsedBody($request)->string('canedit' . $tree->id(), ''); // Do not allow a path length to be set if the individual ID is not if ($gedcom_id === '') { diff --git a/app/Http/RequestHandlers/UserEditPage.php b/app/Http/RequestHandlers/UserEditPage.php index ae20348f82..477540491d 100644 --- a/app/Http/RequestHandlers/UserEditPage.php +++ b/app/Http/RequestHandlers/UserEditPage.php @@ -29,6 +29,7 @@ use Fisharebest\Webtrees\Services\MessageService; use Fisharebest\Webtrees\Services\ModuleService; use Fisharebest\Webtrees\Services\TreeService; use Fisharebest\Webtrees\Services\UserService; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -77,7 +78,7 @@ class UserEditPage implements RequestHandlerInterface { $this->layout = 'layouts/administration'; - $user_id = (int) $request->getQueryParams()['user_id']; + $user_id = Validator::queryParams($request)->integer('user_id'); $user = $this->user_service->find($user_id); if ($user === null) { diff --git a/app/Http/RequestHandlers/UserListPage.php b/app/Http/RequestHandlers/UserListPage.php index 46d63234a7..3df31fba16 100644 --- a/app/Http/RequestHandlers/UserListPage.php +++ b/app/Http/RequestHandlers/UserListPage.php @@ -42,10 +42,8 @@ class UserListPage implements RequestHandlerInterface { $this->layout = 'layouts/administration'; - $user = Validator::attributes($request)->user(); - - $params = $request->getQueryParams(); - $filter = $params['filter'] ?? ''; + $user = Validator::attributes($request)->user(); + $filter = Validator::queryParams($request)->string('filter', ''); $page_size = (int) $user->getPreference(' admin_users_page_size', '10'); diff --git a/app/Http/RequestHandlers/UserPageBlock.php b/app/Http/RequestHandlers/UserPageBlock.php index 45937c4e6b..6350c6716b 100644 --- a/app/Http/RequestHandlers/UserPageBlock.php +++ b/app/Http/RequestHandlers/UserPageBlock.php @@ -55,7 +55,7 @@ class UserPageBlock implements RequestHandlerInterface { $tree = Validator::attributes($request)->tree(); $user = Validator::attributes($request)->user(); - $block_id = $request->getQueryParams()['block_id']; + $block_id = Validator::queryParams($request)->integer('block_id'); $block_id = (int) DB::table('block') ->where('block_id', '=', $block_id) diff --git a/app/Http/RequestHandlers/UserPageDefaultUpdate.php b/app/Http/RequestHandlers/UserPageDefaultUpdate.php index d25fc51b20..ef0c5965f1 100644 --- a/app/Http/RequestHandlers/UserPageDefaultUpdate.php +++ b/app/Http/RequestHandlers/UserPageDefaultUpdate.php @@ -21,6 +21,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Module\ModuleBlockInterface; use Fisharebest\Webtrees\Services\HomePageService; +use Fisharebest\Webtrees\Validator; use Illuminate\Support\Collection; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -51,10 +52,8 @@ class UserPageDefaultUpdate implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $params = (array) $request->getParsedBody(); - - $main_blocks = new Collection($params[ModuleBlockInterface::MAIN_BLOCKS] ?? []); - $side_blocks = new Collection($params[ModuleBlockInterface::SIDE_BLOCKS] ?? []); + $main_blocks = new Collection(Validator::parsedBody($request)->array(ModuleBlockInterface::MAIN_BLOCKS)); + $side_blocks = new Collection(Validator::parsedBody($request)->array(ModuleBlockInterface::SIDE_BLOCKS)); $this->home_page_service->updateUserBlocks(-1, $main_blocks, $side_blocks); diff --git a/app/Http/RequestHandlers/UserPageUpdate.php b/app/Http/RequestHandlers/UserPageUpdate.php index 73360c1713..3a1c1dec5c 100644 --- a/app/Http/RequestHandlers/UserPageUpdate.php +++ b/app/Http/RequestHandlers/UserPageUpdate.php @@ -53,26 +53,26 @@ class UserPageUpdate implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - $user = Validator::attributes($request)->user(); - - $params = (array) $request->getParsedBody(); - $defaults = (bool) ($params['defaults'] ?? false); + $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); + $defaults = Validator::parsedBody($request)->boolean('defaults', false); if ($defaults) { $default_tree = new Tree(-1, 'DEFAULT', 'DEFAULT'); - $main_blocks = $this->home_page_service->userBlocks($default_tree, $user, ModuleBlockInterface::MAIN_BLOCKS) + $main_blocks = $this->home_page_service + ->userBlocks($default_tree, $user, ModuleBlockInterface::MAIN_BLOCKS) ->map(static function (ModuleBlockInterface $block) { return $block->name(); }); - $side_blocks = $this->home_page_service->userBlocks($default_tree, $user, ModuleBlockInterface::SIDE_BLOCKS) + $side_blocks = $this->home_page_service + ->userBlocks($default_tree, $user, ModuleBlockInterface::SIDE_BLOCKS) ->map(static function (ModuleBlockInterface $block) { return $block->name(); }); } else { - $main_blocks = new Collection($params[ModuleBlockInterface::MAIN_BLOCKS] ?? []); - $side_blocks = new Collection($params[ModuleBlockInterface::SIDE_BLOCKS] ?? []); + $main_blocks = new Collection(Validator::parsedBody($request)->array(ModuleBlockInterface::MAIN_BLOCKS)); + $side_blocks = new Collection(Validator::parsedBody($request)->array(ModuleBlockInterface::SIDE_BLOCKS)); } $this->home_page_service->updateUserBlocks($user->id(), $main_blocks, $side_blocks); diff --git a/app/Http/RequestHandlers/UsersCleanupAction.php b/app/Http/RequestHandlers/UsersCleanupAction.php index f9d443633a..ab9329a67a 100644 --- a/app/Http/RequestHandlers/UsersCleanupAction.php +++ b/app/Http/RequestHandlers/UsersCleanupAction.php @@ -24,6 +24,7 @@ use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Log; use Fisharebest\Webtrees\Services\UserService; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -54,9 +55,7 @@ class UsersCleanupAction implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $params = (array) $request->getParsedBody(); - - $delete = $params['delete'] ?? []; + $delete = Validator::parsedBody($request)->array('delete'); foreach ($delete as $user_id) { $user = $this->user_service->find((int) $user_id); diff --git a/app/Module/BingMaps.php b/app/Module/BingMaps.php index a78f15be27..e2af96bd40 100644 --- a/app/Module/BingMaps.php +++ b/app/Module/BingMaps.php @@ -21,6 +21,7 @@ namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\I18N; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -89,9 +90,9 @@ class BingMaps extends AbstractModule implements ModuleConfigInterface, ModuleMa */ public function postAdminAction(ServerRequestInterface $request): ResponseInterface { - $params = (array) $request->getParsedBody(); + $api_key = Validator::parsedBody($request)->string('api_key'); - $this->setPreference('api_key', $params['api_key'] ?? ''); + $this->setPreference('api_key', $api_key); FlashMessages::addMessage(I18N::translate('The preferences for the module “%s” have been updated.', $this->title()), 'success'); diff --git a/app/Module/BranchesListModule.php b/app/Module/BranchesListModule.php index 807e7e23d8..df1b43fcc2 100644 --- a/app/Module/BranchesListModule.php +++ b/app/Module/BranchesListModule.php @@ -166,8 +166,15 @@ class BranchesListModule extends AbstractModule implements ModuleListInterface, public function getPageAction(ServerRequestInterface $request): ResponseInterface { $tree = Validator::attributes($request)->tree(); + $user = Validator::attributes($request)->user(); + + Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user); - return redirect($this->listUrl($tree, $request->getQueryParams())); + return redirect($this->listUrl($tree, [ + 'soundex_dm' => Validator::queryParams($request)->boolean('soundex_dm'), + 'soundex_std' => Validator::queryParams($request)->boolean('soundex_std'), + 'surname' => 'x' . Validator::queryParams($request)->string('surname'), + ])); } /** @@ -184,15 +191,17 @@ class BranchesListModule extends AbstractModule implements ModuleListInterface, // Convert POST requests into GET requests for pretty URLs. if ($request->getMethod() === RequestMethodInterface::METHOD_POST) { - return redirect($this->listUrl($tree, (array) $request->getParsedBody())); + return redirect($this->listUrl($tree, [ + 'soundex_dm' => Validator::parsedBody($request)->boolean('soundex_dm', false), + 'soundex_std' => Validator::parsedBody($request)->boolean('soundex_std', false), + 'surname' => Validator::parsedBody($request)->string('surname'), + ])); } - $surname = (string) $request->getAttribute('surname'); - - $params = $request->getQueryParams(); + $surname = Validator::attributes($request)->string('surname', ''); + $soundex_std = Validator::queryParams($request)->boolean('soundex_std', false); + $soundex_dm = Validator::queryParams($request)->boolean('soundex_dm', false); $ajax = Validator::queryParams($request)->boolean('ajax', false); - $soundex_std = (bool) ($params['soundex_std'] ?? false); - $soundex_dm = (bool) ($params['soundex_dm'] ?? false); if ($ajax) { $this->layout = 'layouts/ajax'; @@ -222,7 +231,12 @@ class BranchesListModule extends AbstractModule implements ModuleListInterface, /* I18N: %s is a surname */ $title = I18N::translate('Branches of the %s family', e($surname)); - $ajax_url = $this->listUrl($tree, $params + ['ajax' => true, 'surname' => $surname]); + $ajax_url = $this->listUrl($tree, [ + 'ajax' => true, + 'soundex_dm' => $soundex_dm, + 'soundex_std' => $soundex_std, + 'surname' => $surname, + ]); } else { /* I18N: Branches of a family tree */ $title = I18N::translate('Branches'); diff --git a/app/Module/CensusAssistantModule.php b/app/Module/CensusAssistantModule.php index 64acbcdbfb..02d6b17467 100644 --- a/app/Module/CensusAssistantModule.php +++ b/app/Module/CensusAssistantModule.php @@ -69,11 +69,9 @@ class CensusAssistantModule extends AbstractModule */ public function postCensusHeaderAction(ServerRequestInterface $request): ResponseInterface { - $params = (array) $request->getParsedBody(); + $census_class = Validator::parsedBody($request)->string('census'); - $census = $params['census']; - - $html = $this->censusTableHeader(new $census()); + $html = $this->censusTableHeader(new $census_class()); return response($html); } @@ -85,12 +83,12 @@ class CensusAssistantModule extends AbstractModule */ public function postCensusIndividualAction(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - - $params = (array) $request->getParsedBody(); - $individual = Registry::individualFactory()->make($params['xref'], $tree); - $head = Registry::individualFactory()->make($params['head'], $tree); - $census_class = $params['census']; + $tree = Validator::attributes($request)->tree(); + $indi_xref = Validator::parsedBody($request)->isXref()->string('xref'); + $head_xref = Validator::parsedBody($request)->isXref()->string('head'); + $individual = Registry::individualFactory()->make($indi_xref, $tree); + $head = Registry::individualFactory()->make($head_xref, $tree); + $census_class = Validator::parsedBody($request)->string('census'); $census = new $census_class(); // No head of household? Create a fake one. @@ -131,14 +129,12 @@ class CensusAssistantModule extends AbstractModule */ public function updateCensusAssistant(ServerRequestInterface $request, Individual $individual, string $fact_id, string $newged, bool $keep_chan): string { - $params = (array) $request->getParsedBody(); - - $ca_title = $params['ca_title'] ?? ''; - $ca_place = $params['ca_place'] ?? ''; - $ca_citation = $params['ca_citation'] ?? ''; - $ca_individuals = $params['ca_individuals'] ?? []; - $ca_notes = $params['ca_notes'] ?? ''; - $ca_census = $params['ca_census'] ?? ''; + $ca_title = Validator::parsedBody($request)->string('ca_title'); + $ca_place = Validator::parsedBody($request)->string('ca_place'); + $ca_citation = Validator::parsedBody($request)->string('ca_citation'); + $ca_individuals = Validator::parsedBody($request)->array('ca_individuals'); + $ca_notes = Validator::parsedBody($request)->string('ca_notes'); + $ca_census = Validator::parsedBody($request)->string('ca_census'); if ($ca_census !== '' && $ca_individuals !== []) { $census = new $ca_census(); diff --git a/app/Module/ChartsBlockModule.php b/app/Module/ChartsBlockModule.php index 9296dd9623..50003728fd 100644 --- a/app/Module/ChartsBlockModule.php +++ b/app/Module/ChartsBlockModule.php @@ -27,6 +27,7 @@ use Fisharebest\Webtrees\Module\InteractiveTree\TreeView; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\ModuleService; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Support\Str; use Psr\Http\Message\ServerRequestInterface; @@ -228,10 +229,11 @@ class ChartsBlockModule extends AbstractModule implements ModuleBlockInterface */ public function saveBlockConfiguration(ServerRequestInterface $request, int $block_id): void { - $params = (array) $request->getParsedBody(); + $type = Validator::parsedBody($request)->string('type'); + $xref = Validator::parsedBody($request)->isXref()->string('xref'); - $this->setBlockSetting($block_id, 'type', $params['type'] ?? 'pedigree'); - $this->setBlockSetting($block_id, 'pid', $params['xref'] ?? ''); + $this->setBlockSetting($block_id, 'type', $type); + $this->setBlockSetting($block_id, 'pid', $xref); } /** diff --git a/app/Module/ClippingsCartModule.php b/app/Module/ClippingsCartModule.php index a1b2155fe5..a08ad39ad9 100644 --- a/app/Module/ClippingsCartModule.php +++ b/app/Module/ClippingsCartModule.php @@ -369,9 +369,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface public function postRemoveAction(ServerRequestInterface $request): ResponseInterface { $tree = Validator::attributes($request)->tree(); - - $xref = $request->getQueryParams()['xref'] ?? ''; - + $xref = Validator::queryParams($request)->isXref()->string('xref'); $cart = Session::get('cart'); $cart = is_array($cart) ? $cart : []; @@ -442,10 +440,8 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function getAddFamilyAction(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - - $xref = $request->getQueryParams()['xref'] ?? ''; - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::queryParams($request)->isXref()->string('xref'); $family = Registry::familyFactory()->make($xref, $tree); $family = Auth::checkFamilyAccess($family); $name = $family->fullName(); @@ -475,12 +471,9 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function postAddFamilyAction(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - - $params = (array) $request->getParsedBody(); - - $xref = $params['xref'] ?? ''; - $option = $params['option'] ?? ''; + $tree = Validator::attributes($request)->tree(); + $xref = Validator::parsedBody($request)->isXref()->string('xref'); + $option = Validator::parsedBody($request)->string('option'); $family = Registry::familyFactory()->make($xref, $tree); $family = Auth::checkFamilyAccess($family); @@ -540,10 +533,8 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function getAddIndividualAction(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - - $xref = $request->getQueryParams()['xref'] ?? ''; - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::queryParams($request)->isXref()->string('xref'); $individual = Registry::individualFactory()->make($xref, $tree); $individual = Auth::checkIndividualAccess($individual); $name = $individual->fullName(); @@ -585,12 +576,9 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function postAddIndividualAction(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - - $params = (array) $request->getParsedBody(); - - $xref = $params['xref'] ?? ''; - $option = $params['option'] ?? ''; + $tree = Validator::attributes($request)->tree(); + $xref = Validator::parsedBody($request)->isXref()->string('xref'); + $option = Validator::parsedBody($request)->string('option'); $individual = Registry::individualFactory()->make($xref, $tree); $individual = Auth::checkIndividualAccess($individual); @@ -671,10 +659,8 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function getAddLocationAction(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - - $xref = $request->getQueryParams()['xref'] ?? ''; - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::queryParams($request)->isXref()->string('xref'); $location = Registry::locationFactory()->make($xref, $tree); $location = Auth::checkLocationAccess($location); $name = $location->fullName(); @@ -700,10 +686,8 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function postAddLocationAction(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - - $xref = $request->getQueryParams()['xref'] ?? ''; - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::queryParams($request)->isXref()->string('xref'); $location = Registry::locationFactory()->make($xref, $tree); $location = Auth::checkLocationAccess($location); @@ -719,10 +703,8 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function getAddMediaAction(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - - $xref = $request->getQueryParams()['xref'] ?? ''; - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::queryParams($request)->isXref()->string('xref'); $media = Registry::mediaFactory()->make($xref, $tree); $media = Auth::checkMediaAccess($media); $name = $media->fullName(); @@ -748,10 +730,8 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function postAddMediaAction(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - - $xref = $request->getQueryParams()['xref'] ?? ''; - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::queryParams($request)->isXref()->string('xref'); $media = Registry::mediaFactory()->make($xref, $tree); $media = Auth::checkMediaAccess($media); @@ -768,9 +748,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface public function getAddNoteAction(ServerRequestInterface $request): ResponseInterface { $tree = Validator::attributes($request)->tree(); - - $xref = $request->getQueryParams()['xref'] ?? ''; - + $xref = Validator::queryParams($request)->isXref()->string('xref'); $note = Registry::noteFactory()->make($xref, $tree); $note = Auth::checkNoteAccess($note); $name = $note->fullName(); @@ -797,9 +775,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface public function postAddNoteAction(ServerRequestInterface $request): ResponseInterface { $tree = Validator::attributes($request)->tree(); - - $xref = $request->getQueryParams()['xref'] ?? ''; - + $xref = Validator::queryParams($request)->isXref()->string('xref'); $note = Registry::noteFactory()->make($xref, $tree); $note = Auth::checkNoteAccess($note); @@ -815,10 +791,8 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function getAddRepositoryAction(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - - $xref = $request->getQueryParams()['xref'] ?? ''; - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::queryParams($request)->isXref()->string('xref'); $repository = Registry::repositoryFactory()->make($xref, $tree); $repository = Auth::checkRepositoryAccess($repository); $name = $repository->fullName(); @@ -844,10 +818,8 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function postAddRepositoryAction(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - - $xref = $request->getQueryParams()['xref'] ?? ''; - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::queryParams($request)->isXref()->string('xref'); $repository = Registry::repositoryFactory()->make($xref, $tree); $repository = Auth::checkRepositoryAccess($repository); @@ -867,10 +839,8 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function getAddSourceAction(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - - $xref = $request->getQueryParams()['xref'] ?? ''; - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::queryParams($request)->isXref()->string('xref'); $source = Registry::sourceFactory()->make($xref, $tree); $source = Auth::checkSourceAccess($source); $name = $source->fullName(); @@ -897,12 +867,9 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function postAddSourceAction(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - - $params = (array) $request->getParsedBody(); - - $xref = $params['xref'] ?? ''; - $option = $params['option'] ?? ''; + $tree = Validator::attributes($request)->tree(); + $xref = Validator::parsedBody($request)->isXref()->string('xref'); + $option = Validator::parsedBody($request)->string('option'); $source = Registry::sourceFactory()->make($xref, $tree); $source = Auth::checkSourceAccess($source); @@ -928,10 +895,8 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function getAddSubmitterAction(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - - $xref = $request->getQueryParams()['xref'] ?? ''; - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::queryParams($request)->isXref()->string('xref'); $submitter = Registry::submitterFactory()->make($xref, $tree); $submitter = Auth::checkSubmitterAccess($submitter); $name = $submitter->fullName(); @@ -957,10 +922,8 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface */ public function postAddSubmitterAction(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - - $xref = $request->getQueryParams()['xref'] ?? ''; - + $tree = Validator::attributes($request)->tree(); + $xref = Validator::queryParams($request)->isXref()->string('xref'); $submitter = Registry::submitterFactory()->make($xref, $tree); $submitter = Auth::checkSubmitterAccess($submitter); diff --git a/app/Module/ColorsTheme.php b/app/Module/ColorsTheme.php index 61a9fca2c6..310147adc6 100644 --- a/app/Module/ColorsTheme.php +++ b/app/Module/ColorsTheme.php @@ -29,8 +29,6 @@ use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; -use function array_key_exists; -use function assert; use function asset; use function is_string; use function response; @@ -84,10 +82,8 @@ class ColorsTheme extends CloudsTheme */ public function postPaletteAction(ServerRequestInterface $request): ResponseInterface { - $user = Validator::attributes($request)->user(); - - $palette = $request->getQueryParams()['palette']; - assert(array_key_exists($palette, $this->palettes())); + $user = Validator::attributes($request)->user(); + $palette = Validator::queryParams($request)->isInArrayKeys($this->palettes())->string('palette'); $user->setPreference('themecolor', $palette); diff --git a/app/Module/CustomCssJsModule.php b/app/Module/CustomCssJsModule.php index 9249d6136c..4387977ac5 100644 --- a/app/Module/CustomCssJsModule.php +++ b/app/Module/CustomCssJsModule.php @@ -21,6 +21,7 @@ namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\I18N; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -91,10 +92,11 @@ class CustomCssJsModule extends AbstractModule implements ModuleConfigInterface, */ public function postAdminAction(ServerRequestInterface $request): ResponseInterface { - $params = (array) $request->getParsedBody(); + $body = Validator::parsedBody($request)->string('body'); + $head = Validator::parsedBody($request)->string('head'); - $this->setPreference('body', $params['body']); - $this->setPreference('head', $params['head']); + $this->setPreference('body', $body); + $this->setPreference('head', $head); $message = I18N::translate('The preferences for the module “%s” have been updated.', $this->title()); FlashMessages::addMessage($message, 'success'); diff --git a/app/Module/DescendancyModule.php b/app/Module/DescendancyModule.php index 6b50ead8f3..230455ddcc 100644 --- a/app/Module/DescendancyModule.php +++ b/app/Module/DescendancyModule.php @@ -90,7 +90,7 @@ class DescendancyModule extends AbstractModule implements ModuleSidebarInterface public function getSearchAction(ServerRequestInterface $request): ResponseInterface { $tree = Validator::attributes($request)->tree(); - $search = $request->getQueryParams()['search']; + $search = Validator::queryParams($request)->string('search'); $html = ''; @@ -118,7 +118,7 @@ class DescendancyModule extends AbstractModule implements ModuleSidebarInterface public function getDescendantsAction(ServerRequestInterface $request): ResponseInterface { $tree = Validator::attributes($request)->tree(); - $xref = $request->getQueryParams()['xref'] ?? ''; + $xref = Validator::queryParams($request)->isXref()->string('xref'); $individual = Registry::individualFactory()->make($xref, $tree); diff --git a/app/Module/FamilyListModule.php b/app/Module/FamilyListModule.php index 01eebc1713..1191c004a3 100644 --- a/app/Module/FamilyListModule.php +++ b/app/Module/FamilyListModule.php @@ -76,6 +76,16 @@ class FamilyListModule extends IndividualListModule Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user); - return $this->createResponse($tree, $user, $request->getQueryParams(), true); + $params = [ + 'alpha' => Validator::queryParams($request)->string('alpha', ''), + 'falpha' => Validator::queryParams($request)->string('falpha', ''), + 'show' => Validator::queryParams($request)->string('show', 'surn'), + 'show_all' => Validator::queryParams($request)->string('show_all', 'no'), + 'show_all_firstnames' => Validator::queryParams($request)->string('show_all_firstnames', 'no'), + 'show_marnm' => Validator::queryParams($request)->string('show_marnm', ''), + 'surname' => Validator::queryParams($request)->string('surname', ''), + ]; + + return $this->createResponse($tree, $user, $params, true); } } diff --git a/app/Module/FamilyTreeFavoritesModule.php b/app/Module/FamilyTreeFavoritesModule.php index 9cf4f603c4..940b52bb1e 100644 --- a/app/Module/FamilyTreeFavoritesModule.php +++ b/app/Module/FamilyTreeFavoritesModule.php @@ -194,7 +194,7 @@ class FamilyTreeFavoritesModule extends AbstractModule implements ModuleBlockInt { $tree = Validator::attributes($request)->tree(); $user = Validator::attributes($request)->user(); - $favorite_id = $request->getQueryParams()['favorite_id']; + $favorite_id = Validator::queryParams($request)->integer('favorite_id'); if (Auth::isManager($tree, $user)) { DB::table('favorite') diff --git a/app/Module/FamilyTreeNewsModule.php b/app/Module/FamilyTreeNewsModule.php index 8f8b46b611..ed3483d678 100644 --- a/app/Module/FamilyTreeNewsModule.php +++ b/app/Module/FamilyTreeNewsModule.php @@ -162,9 +162,9 @@ class FamilyTreeNewsModule extends AbstractModule implements ModuleBlockInterfac throw new HttpAccessDeniedException(); } - $news_id = $request->getQueryParams()['news_id'] ?? ''; + $news_id = Validator::queryParams($request)->integer('news_id', 0); - if ($news_id !== '') { + if ($news_id !== 0) { $row = DB::table('news') ->where('news_id', '=', $news_id) ->where('gedcom_id', '=', $tree->id()) @@ -205,17 +205,14 @@ class FamilyTreeNewsModule extends AbstractModule implements ModuleBlockInterfac throw new HttpAccessDeniedException(); } - $news_id = $request->getQueryParams()['news_id'] ?? ''; - - $params = (array) $request->getParsedBody(); - - $subject = $params['subject']; - $body = $params['body']; + $news_id = Validator::queryParams($request)->integer('news_id', 0); + $subject = Validator::parsedBody($request)->string('subject'); + $body = Validator::parsedBody($request)->string('body'); $subject = $this->html_service->sanitize($subject); $body = $this->html_service->sanitize($body); - if ($news_id > 0) { + if ($news_id !== 0) { DB::table('news') ->where('news_id', '=', $news_id) ->where('gedcom_id', '=', $tree->id()) @@ -244,9 +241,8 @@ class FamilyTreeNewsModule extends AbstractModule implements ModuleBlockInterfac */ public function postDeleteNewsAction(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - - $news_id = $request->getQueryParams()['news_id']; + $tree = Validator::attributes($request)->tree(); + $news_id = Validator::queryParams($request)->integer('news_id'); if (!Auth::isManager($tree)) { throw new HttpAccessDeniedException(); diff --git a/app/Module/FamilyTreeStatisticsModule.php b/app/Module/FamilyTreeStatisticsModule.php index c2e27e355f..1106c6e0fb 100644 --- a/app/Module/FamilyTreeStatisticsModule.php +++ b/app/Module/FamilyTreeStatisticsModule.php @@ -25,6 +25,7 @@ use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Services\ModuleService; use Fisharebest\Webtrees\Statistics; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Query\Expression; use Illuminate\Support\Str; @@ -237,28 +238,47 @@ class FamilyTreeStatisticsModule extends AbstractModule implements ModuleBlockIn */ public function saveBlockConfiguration(ServerRequestInterface $request, int $block_id): void { - $params = (array) $request->getParsedBody(); + $show_last_update = Validator::parsedBody($request)->boolean('show_last_update', false); + $show_common_surnames = Validator::parsedBody($request)->boolean('show_common_surnames', false); + $number_of_surnames = Validator::parsedBody($request)->integer('number_of_surnames'); + $stat_indi = Validator::parsedBody($request)->boolean('stat_indi', false); + $stat_fam = Validator::parsedBody($request)->boolean('stat_fam', false); + $stat_sour = Validator::parsedBody($request)->boolean('stat_sour', false); + $stat_other = Validator::parsedBody($request)->boolean('stat_other', false); + $stat_media = Validator::parsedBody($request)->boolean('stat_media', false); + $stat_repo = Validator::parsedBody($request)->boolean('stat_repo', false); + $stat_surname = Validator::parsedBody($request)->boolean('stat_surname', false); + $stat_events = Validator::parsedBody($request)->boolean('stat_events', false); + $stat_users = Validator::parsedBody($request)->boolean('stat_users', false); + $stat_first_birth = Validator::parsedBody($request)->boolean('stat_first_birth', false); + $stat_last_birth = Validator::parsedBody($request)->boolean('stat_last_birth', false); + $stat_first_death = Validator::parsedBody($request)->boolean('stat_first_death', false); + $stat_last_death = Validator::parsedBody($request)->boolean('stat_last_death', false); + $stat_long_life = Validator::parsedBody($request)->boolean('stat_long_life', false); + $stat_avg_life = Validator::parsedBody($request)->boolean('stat_avg_life', false); + $stat_most_chil = Validator::parsedBody($request)->boolean('stat_most_chil', false); + $stat_avg_chil = Validator::parsedBody($request)->boolean('stat_avg_chil', false); - $this->setBlockSetting($block_id, 'show_last_update', $params['show_last_update'] ?? ''); - $this->setBlockSetting($block_id, 'show_common_surnames', $params['show_common_surnames'] ?? ''); - $this->setBlockSetting($block_id, 'number_of_surnames', $params['number_of_surnames']); - $this->setBlockSetting($block_id, 'stat_indi', $params['stat_indi'] ?? ''); - $this->setBlockSetting($block_id, 'stat_fam', $params['stat_fam'] ?? ''); - $this->setBlockSetting($block_id, 'stat_sour', $params['stat_sour'] ?? ''); - $this->setBlockSetting($block_id, 'stat_other', $params['stat_other'] ?? ''); - $this->setBlockSetting($block_id, 'stat_media', $params['stat_media'] ?? ''); - $this->setBlockSetting($block_id, 'stat_repo', $params['stat_repo'] ?? ''); - $this->setBlockSetting($block_id, 'stat_surname', $params['stat_surname'] ?? ''); - $this->setBlockSetting($block_id, 'stat_events', $params['stat_events'] ?? ''); - $this->setBlockSetting($block_id, 'stat_users', $params['stat_users'] ?? ''); - $this->setBlockSetting($block_id, 'stat_first_birth', $params['stat_first_birth'] ?? ''); - $this->setBlockSetting($block_id, 'stat_last_birth', $params['stat_last_birth'] ?? ''); - $this->setBlockSetting($block_id, 'stat_first_death', $params['stat_first_death'] ?? ''); - $this->setBlockSetting($block_id, 'stat_last_death', $params['stat_last_death'] ?? ''); - $this->setBlockSetting($block_id, 'stat_long_life', $params['stat_long_life'] ?? ''); - $this->setBlockSetting($block_id, 'stat_avg_life', $params['stat_avg_life'] ?? ''); - $this->setBlockSetting($block_id, 'stat_most_chil', $params['stat_most_chil'] ?? ''); - $this->setBlockSetting($block_id, 'stat_avg_chil', $params['stat_avg_chil'] ?? ''); + $this->setBlockSetting($block_id, 'show_last_update', (string) $show_last_update); + $this->setBlockSetting($block_id, 'show_common_surnames', (string) $show_common_surnames); + $this->setBlockSetting($block_id, 'number_of_surnames', (string) $number_of_surnames); + $this->setBlockSetting($block_id, 'stat_indi', (string) $stat_indi); + $this->setBlockSetting($block_id, 'stat_fam', (string) $stat_fam); + $this->setBlockSetting($block_id, 'stat_sour', (string) $stat_sour); + $this->setBlockSetting($block_id, 'stat_other', (string) $stat_other); + $this->setBlockSetting($block_id, 'stat_media', (string) $stat_media); + $this->setBlockSetting($block_id, 'stat_repo', (string) $stat_repo); + $this->setBlockSetting($block_id, 'stat_surname', (string) $stat_surname); + $this->setBlockSetting($block_id, 'stat_events', (string) $stat_events); + $this->setBlockSetting($block_id, 'stat_users', (string) $stat_users); + $this->setBlockSetting($block_id, 'stat_first_birth', (string) $stat_first_birth); + $this->setBlockSetting($block_id, 'stat_last_birth', (string) $stat_last_birth); + $this->setBlockSetting($block_id, 'stat_first_death', (string) $stat_first_death); + $this->setBlockSetting($block_id, 'stat_last_death', (string) $stat_last_death); + $this->setBlockSetting($block_id, 'stat_long_life', (string) $stat_long_life); + $this->setBlockSetting($block_id, 'stat_avg_life', (string) $stat_avg_life); + $this->setBlockSetting($block_id, 'stat_most_chil', (string) $stat_most_chil); + $this->setBlockSetting($block_id, 'stat_avg_chil', (string) $stat_avg_chil); } /** diff --git a/app/Module/FixPlaceNames.php b/app/Module/FixPlaceNames.php index 7decac58fc..2037fe1085 100644 --- a/app/Module/FixPlaceNames.php +++ b/app/Module/FixPlaceNames.php @@ -95,11 +95,11 @@ class FixPlaceNames extends AbstractModule implements ModuleDataFixInterface */ protected function familiesToFix(Tree $tree, array $params): ?Collection { - if ($params['search'] === '' || $params['replace'] === '') { + if ($params['search-for'] === '' || $params['replace-with'] === '') { return null; } - $search = '%' . addcslashes($params['search'], '\\%_') . '%'; + $search = '%' . addcslashes($params['search-for'], '\\%_') . '%'; return $this->familiesToFixQuery($tree, $params) ->where('f_gedcom', 'LIKE', $search) @@ -117,11 +117,11 @@ class FixPlaceNames extends AbstractModule implements ModuleDataFixInterface */ protected function individualsToFix(Tree $tree, array $params): ?Collection { - if ($params['search'] === '' || $params['replace'] === '') { + if ($params['search-for'] === '' || $params['replace-with'] === '') { return null; } - $search = '%' . addcslashes($params['search'], '\\%_') . '%'; + $search = '%' . addcslashes($params['search-for'], '\\%_') . '%'; return $this->individualsToFixQuery($tree, $params) ->where('i_file', '=', $tree->id()) @@ -139,7 +139,7 @@ class FixPlaceNames extends AbstractModule implements ModuleDataFixInterface */ public function doesRecordNeedUpdate(GedcomRecord $record, array $params): bool { - $search = preg_quote($params['search'], '/'); + $search = preg_quote($params['search-for'], '/'); $regex = '/\n2 PLAC (?:.*, )?' . $search . '(\n|$)/'; return preg_match($regex, $record->gedcom()) === 1; @@ -182,9 +182,9 @@ class FixPlaceNames extends AbstractModule implements ModuleDataFixInterface */ private function updateGedcom(GedcomRecord $record, array $params): string { - $search = preg_quote($params['search'], '/'); + $search = preg_quote($params['search-for'], '/'); $regex = '/(\n2 PLAC (?:.*, )?)' . $search . '(\n|$)/'; - $replace = '$1' . addcslashes($params['replace'], '$\\') . '$2'; + $replace = '$1' . addcslashes($params['replace-with'], '$\\') . '$2'; return preg_replace($regex, $replace, $record->gedcom()); } diff --git a/app/Module/FixSearchAndReplace.php b/app/Module/FixSearchAndReplace.php index bff9bdd412..6e13550093 100644 --- a/app/Module/FixSearchAndReplace.php +++ b/app/Module/FixSearchAndReplace.php @@ -137,7 +137,7 @@ class FixSearchAndReplace extends AbstractModule implements ModuleDataFixInterfa */ protected function familiesToFix(Tree $tree, array $params): ?Collection { - if ($params['type'] !== Family::RECORD_TYPE || $params['search'] === '') { + if ($params['type'] !== Family::RECORD_TYPE || $params['search-for'] === '') { return null; } @@ -158,7 +158,7 @@ class FixSearchAndReplace extends AbstractModule implements ModuleDataFixInterfa */ protected function individualsToFix(Tree $tree, array $params): ?Collection { - if ($params['type'] !== Individual::RECORD_TYPE || $params['search'] === '') { + if ($params['type'] !== Individual::RECORD_TYPE || $params['search-for'] === '') { return null; } @@ -181,7 +181,7 @@ class FixSearchAndReplace extends AbstractModule implements ModuleDataFixInterfa */ protected function locationsToFix(Tree $tree, array $params): ?Collection { - if ($params['type'] !== Location::RECORD_TYPE || $params['search'] === '') { + if ($params['type'] !== Location::RECORD_TYPE || $params['search-for'] === '') { return null; } @@ -205,7 +205,7 @@ class FixSearchAndReplace extends AbstractModule implements ModuleDataFixInterfa */ protected function mediaToFix(Tree $tree, array $params): ?Collection { - if ($params['type'] !== Media::RECORD_TYPE || $params['search'] === '') { + if ($params['type'] !== Media::RECORD_TYPE || $params['search-for'] === '') { return null; } @@ -228,7 +228,7 @@ class FixSearchAndReplace extends AbstractModule implements ModuleDataFixInterfa */ protected function notesToFix(Tree $tree, array $params): ?Collection { - if ($params['type'] !== Note::RECORD_TYPE || $params['search'] === '') { + if ($params['type'] !== Note::RECORD_TYPE || $params['search-for'] === '') { return null; } @@ -252,7 +252,7 @@ class FixSearchAndReplace extends AbstractModule implements ModuleDataFixInterfa */ protected function repositoriesToFix(Tree $tree, array $params): ?Collection { - if ($params['type'] !== Repository::RECORD_TYPE || $params['search'] === '') { + if ($params['type'] !== Repository::RECORD_TYPE || $params['search-for'] === '') { return null; } @@ -276,7 +276,7 @@ class FixSearchAndReplace extends AbstractModule implements ModuleDataFixInterfa */ protected function sourcesToFix(Tree $tree, array $params): ?Collection { - if ($params['type'] !== Source::RECORD_TYPE || $params['search'] === '') { + if ($params['type'] !== Source::RECORD_TYPE || $params['search-for'] === '') { return null; } @@ -298,7 +298,7 @@ class FixSearchAndReplace extends AbstractModule implements ModuleDataFixInterfa */ protected function submittersToFix(Tree $tree, array $params): ?Collection { - if ($params['type'] !== Submitter::RECORD_TYPE || $params['search'] === '') { + if ($params['type'] !== Submitter::RECORD_TYPE || $params['search-for'] === '') { return null; } @@ -361,7 +361,7 @@ class FixSearchAndReplace extends AbstractModule implements ModuleDataFixInterfa { // Allow "\n" to indicate a line-feed in replacement text. // Back-references such as $1, $2 are handled automatically. - $replace = strtr($params['replace'], ['\n' => "\n"]); + $replace = strtr($params['replace-with'], ['\n' => "\n"]); $regex = $this->createRegex($params); @@ -377,7 +377,7 @@ class FixSearchAndReplace extends AbstractModule implements ModuleDataFixInterfa */ private function createRegex(array $params): string { - $search = $params['search']; + $search = $params['search-for']; $method = $params['method']; $case = $params['case']; @@ -419,7 +419,7 @@ class FixSearchAndReplace extends AbstractModule implements ModuleDataFixInterfa */ private function recordQuery(Builder $query, string $column, array $params): void { - $search = $params['search']; + $search = $params['search-for']; $method = $params['method']; $like = '%' . addcslashes($search, '\\%_') . '%'; diff --git a/app/Module/FrequentlyAskedQuestionsModule.php b/app/Module/FrequentlyAskedQuestionsModule.php index 0141ebd91d..c424fc6930 100644 --- a/app/Module/FrequentlyAskedQuestionsModule.php +++ b/app/Module/FrequentlyAskedQuestionsModule.php @@ -135,7 +135,7 @@ class FrequentlyAskedQuestionsModule extends AbstractModule implements ModuleCon $faqs = $this->faqsForTree($tree); - $min_block_order = DB::table('block') + $min_block_order = (int) DB::table('block') ->where('module_name', '=', $this->name()) ->where(static function (Builder $query) use ($tree): void { $query @@ -144,7 +144,7 @@ class FrequentlyAskedQuestionsModule extends AbstractModule implements ModuleCon }) ->min('block_order'); - $max_block_order = DB::table('block') + $max_block_order = (int) DB::table('block') ->where('module_name', '=', $this->name()) ->where(static function (Builder $query) use ($tree): void { $query @@ -174,12 +174,10 @@ class FrequentlyAskedQuestionsModule extends AbstractModule implements ModuleCon */ public function postAdminAction(ServerRequestInterface $request): ResponseInterface { - $params = (array) $request->getParsedBody(); - return redirect(route('module', [ 'module' => $this->name(), 'action' => 'Admin', - 'tree' => $params['tree'] ?? '', + 'tree' => Validator::parsedBody($request)->string('tree'), ])); } @@ -190,7 +188,7 @@ class FrequentlyAskedQuestionsModule extends AbstractModule implements ModuleCon */ public function postAdminDeleteAction(ServerRequestInterface $request): ResponseInterface { - $block_id = (int) $request->getQueryParams()['block_id']; + $block_id = Validator::queryParams($request)->integer('block_id'); DB::table('block_setting')->where('block_id', '=', $block_id)->delete(); @@ -211,7 +209,7 @@ class FrequentlyAskedQuestionsModule extends AbstractModule implements ModuleCon */ public function postAdminMoveDownAction(ServerRequestInterface $request): ResponseInterface { - $block_id = (int) $request->getQueryParams()['block_id']; + $block_id = Validator::queryParams($request)->integer('block_id'); $block_order = DB::table('block') ->where('block_id', '=', $block_id) @@ -247,7 +245,7 @@ class FrequentlyAskedQuestionsModule extends AbstractModule implements ModuleCon */ public function postAdminMoveUpAction(ServerRequestInterface $request): ResponseInterface { - $block_id = (int) $request->getQueryParams()['block_id']; + $block_id = Validator::queryParams($request)->integer('block_id'); $block_order = DB::table('block') ->where('block_id', '=', $block_id) @@ -285,7 +283,7 @@ class FrequentlyAskedQuestionsModule extends AbstractModule implements ModuleCon { $this->layout = 'layouts/administration'; - $block_id = (int) ($request->getQueryParams()['block_id'] ?? 0); + $block_id = Validator::queryParams($request)->integer('block_id', 0); if ($block_id === 0) { // Creating a new faq @@ -336,15 +334,12 @@ class FrequentlyAskedQuestionsModule extends AbstractModule implements ModuleCon */ public function postAdminEditAction(ServerRequestInterface $request): ResponseInterface { - $block_id = (int) ($request->getQueryParams()['block_id'] ?? 0); - - $params = (array) $request->getParsedBody(); - - $body = $params['body']; - $header = $params['header']; - $languages = $params['languages'] ?? []; - $gedcom_id = $params['gedcom_id']; - $block_order = (int) $params['block_order']; + $block_id = Validator::queryParams($request)->integer('block_id', 0); + $body = Validator::parsedBody($request)->string('body'); + $header = Validator::parsedBody($request)->string('header'); + $languages = Validator::parsedBody($request)->array('languages'); + $gedcom_id = Validator::parsedBody($request)->string('gedcom_id'); + $block_order = Validator::parsedBody($request)->integer('block_order'); if ($gedcom_id === '') { $gedcom_id = null; @@ -426,7 +421,14 @@ class FrequentlyAskedQuestionsModule extends AbstractModule implements ModuleCon }) ->orderBy('block_order') ->select(['block.block_id', 'block_order', 'gedcom_id', 'bs1.setting_value AS header', 'bs2.setting_value AS faqbody', 'bs3.setting_value AS languages']) - ->get(); + ->get() + ->map(static function (object $row): object { + $row->block_id = (int) $row->block_id; + $row->block_order = (int) $row->block_order; + $row->gedcom_id = (int) $row->gedcom_id; + + return $row; + }); } /** diff --git a/app/Module/GeonamesAutocomplete.php b/app/Module/GeonamesAutocomplete.php index 62a78236bc..2c8d3f51e3 100644 --- a/app/Module/GeonamesAutocomplete.php +++ b/app/Module/GeonamesAutocomplete.php @@ -24,6 +24,7 @@ use Fisharebest\Webtrees\Gedcom; use Fisharebest\Webtrees\Html; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Site; +use Fisharebest\Webtrees\Validator; use GuzzleHttp\Psr7\Request; use Psr\Http\Message\RequestInterface; use Psr\Http\Message\ResponseInterface; @@ -102,9 +103,9 @@ class GeonamesAutocomplete extends AbstractModule implements ModuleConfigInterfa */ public function postAdminAction(ServerRequestInterface $request): ResponseInterface { - $params = (array) $request->getParsedBody(); + $username = Validator::parsedBody($request)->string('username'); - $this->setPreference('username', $params['username' ?? '']); + $this->setPreference('username', $username); FlashMessages::addMessage(I18N::translate('The preferences for the module “%s” have been updated.', $this->title()), 'success'); diff --git a/app/Module/GoogleMaps.php b/app/Module/GoogleMaps.php index c7e9af4f0c..5f57c05bc0 100644 --- a/app/Module/GoogleMaps.php +++ b/app/Module/GoogleMaps.php @@ -21,6 +21,7 @@ namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\I18N; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -89,9 +90,9 @@ class GoogleMaps extends AbstractModule implements ModuleConfigInterface, Module */ public function postAdminAction(ServerRequestInterface $request): ResponseInterface { - $params = (array) $request->getParsedBody(); + $api_key = Validator::parsedBody($request)->string('api_key'); - $this->setPreference('api_key', $params['api_key'] ?? ''); + $this->setPreference('api_key', $api_key); FlashMessages::addMessage(I18N::translate('The preferences for the module “%s” have been updated.', $this->title()), 'success'); diff --git a/app/Module/HereMaps.php b/app/Module/HereMaps.php index 6c6abaedaa..377308a348 100644 --- a/app/Module/HereMaps.php +++ b/app/Module/HereMaps.php @@ -21,6 +21,7 @@ namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\I18N; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -89,9 +90,9 @@ class HereMaps extends AbstractModule implements ModuleConfigInterface, ModuleMa */ public function postAdminAction(ServerRequestInterface $request): ResponseInterface { - $params = (array) $request->getParsedBody(); + $api_key = Validator::parsedBody($request)->string('api_key'); - $this->setPreference('api_key', $params['api_key'] ?? ''); + $this->setPreference('api_key', $api_key); FlashMessages::addMessage(I18N::translate('The preferences for the module “%s” have been updated.', $this->title()), 'success'); diff --git a/app/Module/IndividualListModule.php b/app/Module/IndividualListModule.php index e756d6bac5..1fd20ca881 100644 --- a/app/Module/IndividualListModule.php +++ b/app/Module/IndividualListModule.php @@ -139,20 +139,6 @@ class IndividualListModule extends AbstractModule implements ModuleListInterface } /** - * Handle URLs generated by older versions of webtrees - * - * @param ServerRequestInterface $request - * - * @return ResponseInterface - */ - public function getListAction(ServerRequestInterface $request): ResponseInterface - { - $tree = Validator::attributes($request)->tree(); - - return redirect($this->listUrl($tree, $request->getQueryParams())); - } - - /** * @param ServerRequestInterface $request * * @return ResponseInterface @@ -164,7 +150,17 @@ class IndividualListModule extends AbstractModule implements ModuleListInterface Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user); - return $this->createResponse($tree, $user, $request->getQueryParams(), false); + $params = [ + 'alpha' => Validator::queryParams($request)->string('alpha', ''), + 'falpha' => Validator::queryParams($request)->string('falpha', ''), + 'show' => Validator::queryParams($request)->string('show', 'surn'), + 'show_all' => Validator::queryParams($request)->string('show_all', 'no'), + 'show_all_firstnames' => Validator::queryParams($request)->string('show_all_firstnames', 'no'), + 'show_marnm' => Validator::queryParams($request)->string('show_marnm', ''), + 'surname' => Validator::queryParams($request)->string('surname', ''), + ]; + + return $this->createResponse($tree, $user, $params, false); } /** @@ -182,24 +178,24 @@ class IndividualListModule extends AbstractModule implements ModuleListInterface // We show three different lists: initials, surnames and individuals // All surnames beginning with this letter where "@"=unknown and ","=none - $alpha = $params['alpha'] ?? ''; + $alpha = $params['alpha']; // All individuals with this surname - $surname = $params['surname'] ?? ''; + $surname = $params['surname']; // All individuals - $show_all = $params['show_all'] ?? 'no'; + $show_all = $params['show_all']; // Long lists can be broken down by given name - $show_all_firstnames = $params['show_all_firstnames'] ?? 'no'; + $show_all_firstnames = $params['show_all_firstnames']; if ($show_all_firstnames === 'yes') { $falpha = ''; } else { // All first names beginning with this letter - $falpha = $params['falpha'] ?? ''; + $falpha = $params['falpha']; } - $show_marnm = $params['show_marnm'] ?? ''; + $show_marnm = $params['show_marnm']; switch ($show_marnm) { case 'no': case 'yes': @@ -231,7 +227,7 @@ class IndividualListModule extends AbstractModule implements ModuleListInterface $show = 'indi'; } else { $legend = I18N::translate('All'); - $show = $params['show'] ?? 'surn'; + $show = $params['show']; $params = [ 'tree' => $tree->name(), 'show_all' => 'yes', @@ -282,7 +278,7 @@ class IndividualListModule extends AbstractModule implements ModuleListInterface } elseif ($alpha !== '') { $show_all = 'no'; $legend = e($alpha) . '…'; - $show = $params['show'] ?? 'surn'; + $show = $params['show']; $params = [ 'alpha' => $alpha, 'tree' => $tree->name(), @@ -443,17 +439,17 @@ class IndividualListModule extends AbstractModule implements ModuleListInterface } } if ($show === 'indi') { - if (!$families) { + if ($families) { + echo view('lists/families-table', [ + 'families' => $this->families($tree, $surname, $alpha, $falpha, $show_marnm === 'yes', I18N::locale()), + 'tree' => $tree, + ]); + } else { echo view('lists/individuals-table', [ 'individuals' => $this->individuals($tree, $surname, $alpha, $falpha, $show_marnm === 'yes', false, I18N::locale()), 'sosa' => false, 'tree' => $tree, ]); - } else { - echo view('lists/families-table', [ - 'families' => $this->families($tree, $surname, $alpha, $falpha, $show_marnm === 'yes', I18N::locale()), - 'tree' => $tree, - ]); } } } diff --git a/app/Module/InteractiveTreeModule.php b/app/Module/InteractiveTreeModule.php index 0c17bffaa3..7383087382 100644 --- a/app/Module/InteractiveTreeModule.php +++ b/app/Module/InteractiveTreeModule.php @@ -215,15 +215,11 @@ class InteractiveTreeModule extends AbstractModule implements ModuleChartInterfa */ public function postChartAction(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - - $params = (array) $request->getParsedBody(); - return redirect(route('module', [ 'module' => $this->name(), 'action' => 'Chart', - 'tree' => $tree->name(), - 'xref' => $params['xref'] ?? '', + 'tree' => Validator::attributes($request)->tree()->name(), + 'xref' => Validator::parsedBody($request)->isXref()->string('xref'), ])); } @@ -234,15 +230,12 @@ class InteractiveTreeModule extends AbstractModule implements ModuleChartInterfa */ public function getDetailsAction(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - - $pid = $request->getQueryParams()['pid']; + $tree = Validator::attributes($request)->tree(); + $pid = Validator::queryParams($request)->string('pid'); $individual = Registry::individualFactory()->make($pid, $tree); - $individual = Auth::checkIndividualAccess($individual); - - $instance = $request->getQueryParams()['instance']; - $treeview = new TreeView($instance); + $instance = Validator::queryParams($request)->string('instance'); + $treeview = new TreeView($instance); return response($treeview->getDetails($individual)); } @@ -254,10 +247,9 @@ class InteractiveTreeModule extends AbstractModule implements ModuleChartInterfa */ public function getIndividualsAction(ServerRequestInterface $request): ResponseInterface { - $tree = Validator::attributes($request)->tree(); - - $q = $request->getQueryParams()['q']; - $instance = $request->getQueryParams()['instance']; + $tree = Validator::attributes($request)->tree(); + $q = Validator::queryParams($request)->string('q'); + $instance = Validator::queryParams($request)->string('instance'); $treeview = new TreeView($instance); return response($treeview->getIndividuals($tree, $q)); diff --git a/app/Module/LocationListModule.php b/app/Module/LocationListModule.php index d8282cf3ab..50af0d1bdd 100644 --- a/app/Module/LocationListModule.php +++ b/app/Module/LocationListModule.php @@ -110,20 +110,6 @@ class LocationListModule extends AbstractModule implements ModuleListInterface, } /** - * Handle URLs generated by older versions of webtrees - * - * @param ServerRequestInterface $request - * - * @return ResponseInterface - */ - public function getListAction(ServerRequestInterface $request): ResponseInterface - { - $tree = Validator::attributes($request)->tree(); - - return redirect($this->listUrl($tree, $request->getQueryParams())); - } - - /** * @param Tree $tree * @param array<bool|int|string|array<string>|null> $parameters * diff --git a/app/Module/MapBox.php b/app/Module/MapBox.php index 14cd55791d..75f56dae37 100644 --- a/app/Module/MapBox.php +++ b/app/Module/MapBox.php @@ -21,6 +21,7 @@ namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\I18N; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -89,9 +90,9 @@ class MapBox extends AbstractModule implements ModuleConfigInterface, ModuleMapP */ public function postAdminAction(ServerRequestInterface $request): ResponseInterface { - $params = (array) $request->getParsedBody(); + $api_key = Validator::parsedBody($request)->string('api_key'); - $this->setPreference('api_key', $params['api_key'] ?? ''); + $this->setPreference('api_key', $api_key); FlashMessages::addMessage(I18N::translate('The preferences for the module “%s” have been updated.', $this->title()), 'success'); diff --git a/app/Module/MapGeoLocationGeonames.php b/app/Module/MapGeoLocationGeonames.php index 8fde961d2a..84c97c0c7a 100644 --- a/app/Module/MapGeoLocationGeonames.php +++ b/app/Module/MapGeoLocationGeonames.php @@ -22,6 +22,7 @@ namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Site; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -79,9 +80,9 @@ class MapGeoLocationGeonames extends AbstractModule implements ModuleConfigInter */ public function postAdminAction(ServerRequestInterface $request): ResponseInterface { - $params = (array) $request->getParsedBody(); + $api_key = Validator::parsedBody($request)->string('username'); - $this->setPreference('username', $params['username' ?? '']); + $this->setPreference('username', $api_key); FlashMessages::addMessage(I18N::translate('The preferences for the module “%s” have been updated.', $this->title()), 'success'); diff --git a/app/Module/MapGeoLocationOpenRouteService.php b/app/Module/MapGeoLocationOpenRouteService.php index 0f9a86e182..2db6ea0fd9 100644 --- a/app/Module/MapGeoLocationOpenRouteService.php +++ b/app/Module/MapGeoLocationOpenRouteService.php @@ -21,6 +21,7 @@ namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\I18N; +use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -74,9 +75,9 @@ class MapGeoLocationOpenRouteService extends AbstractModule implements ModuleCon */ public function postAdminAction(ServerRequestInterface $request): ResponseInterface { - $params = (array) $request->getParsedBody(); + $api_key = Validator::parsedBody($request)->string('api_key'); - $this->setPreference('api_key', $params['api_key' ?? '']); + $this->setPreference('api_key', $api_key); FlashMessages::addMessage(I18N::translate('The preferences for the module “%s” have been updated.', $this->title()), 'success'); diff --git a/app/Module/MediaListModule.php b/app/Module/MediaListModule.php index 457fe1f42e..11ba7d4862 100644 --- a/app/Module/MediaListModule.php +++ b/app/Module/MediaListModule.php @@ -142,20 +142,6 @@ class MediaListModule extends AbstractModule implements ModuleListInterface, Req } /** - * Handle URLs generated by older versions of webtrees - * - * @param ServerRequestInterface $request - * - * @return ResponseInterface - */ - public function getListAction(ServerRequestInterface $request): ResponseInterface - { - $tree = Validator::attributes($request)->tree(); - - return redirect($this->listUrl($tree, $request->getQueryParams())); - } - - /** * @param ServerRequestInterface $request * * @return ResponseInterface @@ -165,13 +151,23 @@ class MediaListModule extends AbstractModule implements ModuleListInterface, Req $tree = Validator::attributes($request)->tree(); $user = Validator::attributes($request)->user(); - $data_filesystem = Registry::filesystem()->data(); - Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user); + $data_filesystem = Registry::filesystem()->data(); + // Convert POST requests into GET requests for pretty URLs. if ($request->getMethod() === RequestMethodInterface::METHOD_POST) { - return redirect($this->listUrl($tree, (array) $request->getParsedBody())); + $params = [ + 'go' => true, + 'page' => Validator::parsedBody($request)->integer('page'), + 'max' => Validator::parsedBody($request)->integer('max'), + 'folder' => Validator::parsedBody($request)->string('folder'), + 'filter' => Validator::parsedBody($request)->string('filter'), + 'subdirs' => Validator::parsedBody($request)->boolean('subdirs', false), + 'format' => Validator::parsedBody($request)->string('format'), + ]; + + return redirect($this->listUrl($tree, $params)); } $params = $request->getQueryParams(); diff --git a/app/Module/ModuleAnalyticsTrait.php b/app/Module/ModuleAnalyticsTrait.php index be9cab36b2..dfefa710ff 100644 --- a/app/Module/ModuleAnalyticsTrait.php +++ b/app/Module/ModuleAnalyticsTrait.php @@ -163,10 +163,8 @@ trait ModuleAnalyticsTrait */ public function postAdminAction(ServerRequestInterface $request): ResponseInterface { - $params = (array) $request->getParsedBody(); - foreach (array_keys($this->analyticsParameters()) as $parameter) { - $new_value = $params[$parameter]; + $new_value = Validator::parsedBody($request)->string($parameter); $this->setPreference($parameter, $new_value); } diff --git a/app/Module/ModuleCustomTrait.php b/app/Module/ModuleCustomTrait.php index da495426ba..8ad41d82a7 100644 --- a/app/Module/ModuleCustomTrait.php +++ b/app/Module/ModuleCustomTrait.php @@ -24,6 +24,7 @@ use Fisharebest\Webtrees\Http\Exceptions\HttpAccessDeniedException; use Fisharebest\Webtrees\Http\Exceptions\HttpNotFoundException; use Fisharebest\Webtrees\Mime; use Fisharebest\Webtrees\Registry; +use Fisharebest\Webtrees\Validator; use GuzzleHttp\Client; use GuzzleHttp\Exception\GuzzleException; use Psr\Http\Message\ResponseInterface; @@ -171,7 +172,7 @@ trait ModuleCustomTrait public function getAssetAction(ServerRequestInterface $request): ResponseInterface { // The file being requested. e.g. "css/theme.css" - $asset = $request->getQueryParams()['asset']; + $asset = Validator::queryParams($request)->string('asset'); // Do not allow requests that try to access parent folders. if (str_contains($asset, '..')) { diff --git a/app/Module/ModuleTabTrait.php b/app/Module/ModuleTabTrait.php index 36ec999937..9a2c69b7d7 100644 --- a/app/Module/ModuleTabTrait.php +++ b/app/Module/ModuleTabTrait.php @@ -130,8 +130,7 @@ trait ModuleTabTrait { $tree = Validator::attributes($request)->tree(); $user = Validator::attributes($request)->user(); - - $xref = $request->getQueryParams()['xref']; + $xref = Validator::queryParams($request)->isXref()->string('xref'); $record = Registry::individualFactory()->make($xref, $tree); $record = Auth::checkIndividualAccess($record); diff --git a/app/Module/NoteListModule.php b/app/Module/NoteListModule.php index e3a4468111..0e9241c396 100644 --- a/app/Module/NoteListModule.php +++ b/app/Module/NoteListModule.php @@ -120,20 +120,6 @@ class NoteListModule extends AbstractModule implements ModuleListInterface, Requ } /** - * Handle URLs generated by older versions of webtrees - * - * @param ServerRequestInterface $request - * - * @return ResponseInterface - */ - public function getListAction(ServerRequestInterface $request): ResponseInterface - { - $tree = Validator::attributes($request)->tree(); - - return redirect($this->listUrl($tree, $request->getQueryParams())); - } - - /** * @param ServerRequestInterface $request * * @return ResponseInterface diff --git a/app/Module/OnThisDayModule.php b/app/Module/OnThisDayModule.php index 47603141d6..554417e324 100644 --- a/app/Module/OnThisDayModule.php +++ b/app/Module/OnThisDayModule.php @@ -25,6 +25,7 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\CalendarService; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Support\Str; use Psr\Http\Message\ServerRequestInterface; @@ -221,18 +222,21 @@ class OnThisDayModule extends AbstractModule implements ModuleBlockInterface * Update the configuration for a block. * * @param ServerRequestInterface $request - * @param int $block_id + * @param int $block_id * * @return void */ public function saveBlockConfiguration(ServerRequestInterface $request, int $block_id): void { - $params = (array) $request->getParsedBody(); + $filter = Validator::parsedBody($request)->string('filter'); + $info_style = Validator::parsedBody($request)->string('infoStyle'); + $sort_style = Validator::parsedBody($request)->string('sortStyle'); + $events = Validator::parsedBody($request)->array('events'); - $this->setBlockSetting($block_id, 'filter', $params['filter']); - $this->setBlockSetting($block_id, 'infoStyle', $params['infoStyle']); - $this->setBlockSetting($block_id, 'sortStyle', $params['sortStyle']); - $this->setBlockSetting($block_id, 'events', implode(',', $params['events'] ?? [])); + $this->setBlockSetting($block_id, 'filter', $filter); + $this->setBlockSetting($block_id, 'infoStyle', $info_style); + $this->setBlockSetting($block_id, 'sortStyle', $sort_style); + $this->setBlockSetting($block_id, 'events', implode(',', $events)); } /** diff --git a/app/Module/OpenRouteServiceAutocomplete.php b/app/Module/OpenRouteServiceAutocomplete.php index 796f641ced..e6d4f3ec7a 100644 --- a/app/Module/OpenRouteServiceAutocomplete.php +++ b/app/Module/OpenRouteServiceAutocomplete.php @@ -23,6 +23,7 @@ use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\Gedcom; use Fisharebest\Webtrees\Html; use Fisharebest\Webtrees\I18N; +use Fisharebest\Webtrees\Validator; use GuzzleHttp\Psr7\Request; use Psr\Http\Message\RequestInterface; use Psr\Http\Message\ResponseInterface; @@ -98,9 +99,9 @@ class OpenRouteServiceAutocomplete extends AbstractModule implements ModuleConfi */ public function postAdminAction(ServerRequestInterface $request): ResponseInterface { - $params = (array) $request->getParsedBody(); + $api_key = Validator::parsedBody($request)->string('api_key'); - $this->setPreference('api_key', $params['api_key'] ?? ''); + $this->setPreference('api_key', $api_key); FlashMessages::addMessage(I18N::translate('The preferences for the module “%s” have been updated.', $this->title()), 'success'); diff --git a/app/Module/PlaceHierarchyListModule.php b/app/Module/PlaceHierarchyListModule.php index c9428fdb92..03e6ba326f 100644 --- a/app/Module/PlaceHierarchyListModule.php +++ b/app/Module/PlaceHierarchyListModule.php @@ -144,20 +144,6 @@ class PlaceHierarchyListModule extends AbstractModule implements ModuleListInter } /** - * Handle URLs generated by older versions of webtrees - * - * @param ServerRequestInterface $request - * - * @return ResponseInterface - */ - public function getListAction(ServerRequestInterface $request): ResponseInterface - { - $tree = Validator::attributes($request)->tree(); - - return redirect($this->listUrl($tree, $request->getQueryParams())); - } - - /** * @param Tree $tree * @param array<bool|int|string|array<string>|null> $parameters * @@ -182,8 +168,8 @@ class PlaceHierarchyListModule extends AbstractModule implements ModuleListInter Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user); - $action2 = $request->getQueryParams()['action2'] ?? 'hierarchy'; - $place_id = (int) ($request->getQueryParams()['place_id'] ?? 0); + $action2 = Validator::queryParams($request)->string('action2', 'hierarchy'); + $place_id = Validator::queryParams($request)->integer('place_id', 0); $place = Place::find($place_id, $tree); // Request for a non-existent place? diff --git a/app/Module/RecentChangesModule.php b/app/Module/RecentChangesModule.php index bedddbb6cf..bba92ebd20 100644 --- a/app/Module/RecentChangesModule.php +++ b/app/Module/RecentChangesModule.php @@ -27,6 +27,7 @@ use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\UserService; use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\User; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Query\Expression; use Illuminate\Database\Query\JoinClause; @@ -223,14 +224,19 @@ class RecentChangesModule extends AbstractModule implements ModuleBlockInterface */ public function saveBlockConfiguration(ServerRequestInterface $request, int $block_id): void { - $params = (array) $request->getParsedBody(); + $days = Validator::parsedBody($request)->integer('days'); + $info_style = Validator::parsedBody($request)->string('infoStyle'); + $sort_style = Validator::parsedBody($request)->string('sortStyle'); + $show_date = Validator::parsedBody($request)->boolean('show_date'); + $show_user = Validator::parsedBody($request)->boolean('show_user'); + $source = Validator::parsedBody($request)->string('source'); - $this->setBlockSetting($block_id, 'days', $params['days']); - $this->setBlockSetting($block_id, 'infoStyle', $params['infoStyle']); - $this->setBlockSetting($block_id, 'sortStyle', $params['sortStyle']); - $this->setBlockSetting($block_id, 'show_date', $params['show_date']); - $this->setBlockSetting($block_id, 'show_user', $params['show_user']); - $this->setBlockSetting($block_id, 'source', $params['source']); + $this->setBlockSetting($block_id, 'days', (string) $days); + $this->setBlockSetting($block_id, 'infoStyle', $info_style); + $this->setBlockSetting($block_id, 'sortStyle', $sort_style); + $this->setBlockSetting($block_id, 'show_date', (string) $show_date); + $this->setBlockSetting($block_id, 'show_user', (string) $show_user); + $this->setBlockSetting($block_id, 'source', $source); } /** diff --git a/app/Module/RelationshipsChartModule.php b/app/Module/RelationshipsChartModule.php index 7803b86a60..e14dc9957a 100644 --- a/app/Module/RelationshipsChartModule.php +++ b/app/Module/RelationshipsChartModule.php @@ -432,13 +432,11 @@ class RelationshipsChartModule extends AbstractModule implements ModuleChartInte */ public function postAdminAction(ServerRequestInterface $request): ResponseInterface { - $params = (array) $request->getParsedBody(); - foreach ($this->tree_service->all() as $tree) { - $recursion = $params['relationship-recursion-' . $tree->id()] ?? ''; - $ancestors = $params['relationship-ancestors-' . $tree->id()] ?? ''; + $recursion = Validator::parsedBody($request)->integer('relationship-recursion-' . $tree->id()); + $ancestors = Validator::parsedBody($request)->string('relationship-ancestors-' . $tree->id()); - $tree->setPreference('RELATIONSHIP_RECURSION', $recursion); + $tree->setPreference('RELATIONSHIP_RECURSION', (string) $recursion); $tree->setPreference('RELATIONSHIP_ANCESTORS', $ancestors); } diff --git a/app/Module/RepositoryListModule.php b/app/Module/RepositoryListModule.php index 97f0b7baf5..436cb0be3d 100644 --- a/app/Module/RepositoryListModule.php +++ b/app/Module/RepositoryListModule.php @@ -123,20 +123,6 @@ class RepositoryListModule extends AbstractModule implements ModuleListInterface } /** - * Handle URLs generated by older versions of webtrees - * - * @param ServerRequestInterface $request - * - * @return ResponseInterface - */ - public function getListAction(ServerRequestInterface $request): ResponseInterface - { - $tree = Validator::attributes($request)->tree(); - - return redirect($this->listUrl($tree, $request->getQueryParams())); - } - - /** * @param ServerRequestInterface $request * * @return ResponseInterface diff --git a/app/Module/ResearchTaskModule.php b/app/Module/ResearchTaskModule.php index 2fbf4c8d32..3044e00506 100644 --- a/app/Module/ResearchTaskModule.php +++ b/app/Module/ResearchTaskModule.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\Database\Capsule\Manager as DB; use Illuminate\Database\Query\JoinClause; use Illuminate\Support\Collection; @@ -249,11 +250,13 @@ class ResearchTaskModule extends AbstractModule implements ModuleBlockInterface */ public function saveBlockConfiguration(ServerRequestInterface $request, int $block_id): void { - $params = (array) $request->getParsedBody(); + $show_other = Validator::parsedBody($request)->boolean('show_other', false); + $show_unassigned = Validator::parsedBody($request)->boolean('show_unassigned', false); + $show_future = Validator::parsedBody($request)->boolean('show_future', false); - $this->setBlockSetting($block_id, 'show_other', $params['show_other']); - $this->setBlockSetting($block_id, 'show_unassigned', $params['show_unassigned']); - $this->setBlockSetting($block_id, 'show_future', $params['show_future']); + $this->setBlockSetting($block_id, 'show_other', (string) $show_other); + $this->setBlockSetting($block_id, 'show_unassigned', (string) $show_unassigned); + $this->setBlockSetting($block_id, 'show_future', (string) $show_future); } /** diff --git a/app/Module/ReviewChangesModule.php b/app/Module/ReviewChangesModule.php index a46bf505f1..5a5199274c 100644 --- a/app/Module/ReviewChangesModule.php +++ b/app/Module/ReviewChangesModule.php @@ -32,6 +32,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\Database\Query\Builder; use Illuminate\Database\Query\Expression; @@ -242,10 +243,11 @@ class ReviewChangesModule extends AbstractModule implements ModuleBlockInterface */ public function saveBlockConfiguration(ServerRequestInterface $request, int $block_id): void { - $params = (array) $request->getParsedBody(); + $days = Validator::parsedBody($request)->integer('days'); + $sendmail = Validator::parsedBody($request)->string('sendmail'); - $this->setBlockSetting($block_id, 'days', $params['days']); - $this->setBlockSetting($block_id, 'sendmail', $params['sendmail']); + $this->setBlockSetting($block_id, 'days', (string) $days); + $this->setBlockSetting($block_id, 'sendmail', $sendmail); } /** diff --git a/app/Module/SiteMapModule.php b/app/Module/SiteMapModule.php index 1b112606fd..e7b1789e22 100644 --- a/app/Module/SiteMapModule.php +++ b/app/Module/SiteMapModule.php @@ -163,10 +163,8 @@ class SiteMapModule extends AbstractModule implements ModuleConfigInterface, Req */ public function postAdminAction(ServerRequestInterface $request): ResponseInterface { - $params = (array) $request->getParsedBody(); - foreach ($this->tree_service->all() as $tree) { - $include_in_sitemap = (bool) ($params['sitemap' . $tree->id()] ?? false); + $include_in_sitemap = Validator::parsedBody($request)->boolean('sitemap' . $tree->id(), false); $tree->setPreference('include_in_sitemap', (string) $include_in_sitemap); } diff --git a/app/Module/SlideShowModule.php b/app/Module/SlideShowModule.php index c5b52d916f..322aee2d7d 100644 --- a/app/Module/SlideShowModule.php +++ b/app/Module/SlideShowModule.php @@ -87,10 +87,10 @@ class SlideShowModule extends AbstractModule implements ModuleBlockInterface public function getBlock(Tree $tree, int $block_id, string $context, array $config = []): string { $request = app(ServerRequestInterface::class); - $default_start = $this->getBlockSetting($block_id, 'start'); + $default_start = (bool) $this->getBlockSetting($block_id, 'start'); $filter_links = $this->getBlockSetting($block_id, 'filter', self::LINK_ALL); $controls = $this->getBlockSetting($block_id, 'controls', '1'); - $start = (bool) ($request->getQueryParams()['start'] ?? $default_start); + $start = Validator::queryParams($request)->boolean('start', $default_start); $filter_types = [ $this->getBlockSetting($block_id, 'filter_audio', '0') ? SourceMediaType::VALUE_AUDIO : null, diff --git a/app/Module/SourceListModule.php b/app/Module/SourceListModule.php index 6d306b6588..eb695329a5 100644 --- a/app/Module/SourceListModule.php +++ b/app/Module/SourceListModule.php @@ -121,20 +121,6 @@ class SourceListModule extends AbstractModule implements ModuleListInterface, Re } /** - * Handle URLs generated by older versions of webtrees - * - * @param ServerRequestInterface $request - * - * @return ResponseInterface - */ - public function getListAction(ServerRequestInterface $request): ResponseInterface - { - $tree = Validator::attributes($request)->tree(); - - return redirect($this->listUrl($tree, $request->getQueryParams())); - } - - /** * @param ServerRequestInterface $request * * @return ResponseInterface diff --git a/app/Module/StatisticsChartModule.php b/app/Module/StatisticsChartModule.php index 798aed3962..e9b9f8a805 100644 --- a/app/Module/StatisticsChartModule.php +++ b/app/Module/StatisticsChartModule.php @@ -240,36 +240,34 @@ class StatisticsChartModule extends AbstractModule implements ModuleChartInterfa $statistics = app(Statistics::class); assert($statistics instanceof Statistics); - $params = (array) $request->getParsedBody(); - - $x_axis_type = (int) $params['x-as']; - $y_axis_type = (int) $params['y-as']; - $z_axis_type = (int) $params['z-as']; + $x_axis_type = Validator::parsedBody($request)->integer('x-as'); + $y_axis_type = Validator::parsedBody($request)->integer('y-as'); + $z_axis_type = Validator::parsedBody($request)->integer('z-as'); $ydata = []; switch ($x_axis_type) { case self::X_AXIS_INDIVIDUAL_MAP: return response($statistics->chartDistribution( - $params['chart_shows'], - $params['chart_type'], - $params['SURN'] + Validator::parsedBody($request)->string('chart_shows'), + Validator::parsedBody($request)->string('chart_type'), + Validator::parsedBody($request)->string('SURN') )); case self::X_AXIS_BIRTH_MAP: return response($statistics->chartDistribution( - $params['chart_shows'], + Validator::parsedBody($request)->string('chart_shows'), 'birth_distribution_chart' )); case self::X_AXIS_DEATH_MAP: return response($statistics->chartDistribution( - $params['chart_shows'], + Validator::parsedBody($request)->string('chart_shows'), 'death_distribution_chart' )); case self::X_AXIS_MARRIAGE_MAP: return response($statistics->chartDistribution( - $params['chart_shows'], + Validator::parsedBody($request)->string('chart_shows'), 'marriage_distribution_chart' )); @@ -305,7 +303,7 @@ class StatisticsChartModule extends AbstractModule implements ModuleChartInterfa } break; case self::Z_AXIS_TIME: - $boundaries_csv = $params['z-axis-boundaries-periods']; + $boundaries_csv = Validator::parsedBody($request)->string('z-axis-boundaries-periods'); $z_axis = $this->axisYears($boundaries_csv); $prev_boundary = 0; foreach (array_keys($z_axis) as $boundary) { @@ -354,7 +352,7 @@ class StatisticsChartModule extends AbstractModule implements ModuleChartInterfa } break; case self::Z_AXIS_TIME: - $boundaries_csv = $params['z-axis-boundaries-periods']; + $boundaries_csv = Validator::parsedBody($request)->string('z-axis-boundaries-periods'); $z_axis = $this->axisYears($boundaries_csv); $prev_boundary = 0; foreach (array_keys($z_axis) as $boundary) { @@ -396,7 +394,7 @@ class StatisticsChartModule extends AbstractModule implements ModuleChartInterfa } break; case self::Z_AXIS_TIME: - $boundaries_csv = $params['z-axis-boundaries-periods']; + $boundaries_csv = Validator::parsedBody($request)->string('z-axis-boundaries-periods'); $z_axis = $this->axisYears($boundaries_csv); $prev_boundary = 0; foreach (array_keys($z_axis) as $boundary) { @@ -445,7 +443,7 @@ class StatisticsChartModule extends AbstractModule implements ModuleChartInterfa } break; case self::Z_AXIS_TIME: - $boundaries_csv = $params['z-axis-boundaries-periods']; + $boundaries_csv = Validator::parsedBody($request)->string('z-axis-boundaries-periods'); $z_axis = $this->axisYears($boundaries_csv); $prev_boundary = 0; foreach (array_keys($z_axis) as $boundary) { @@ -492,7 +490,7 @@ class StatisticsChartModule extends AbstractModule implements ModuleChartInterfa } break; case self::Z_AXIS_TIME: - $boundaries_csv = $params['z-axis-boundaries-periods']; + $boundaries_csv = Validator::parsedBody($request)->string('z-axis-boundaries-periods'); $z_axis = $this->axisYears($boundaries_csv); $prev_boundary = 0; $indi = []; @@ -517,7 +515,7 @@ class StatisticsChartModule extends AbstractModule implements ModuleChartInterfa case self::X_AXIS_AGE_AT_DEATH: $chart_title = I18N::translate('Average age at death'); $x_axis_title = I18N::translate('age'); - $boundaries_csv = $params['x-axis-boundaries-ages']; + $boundaries_csv = Validator::parsedBody($request)->string('x-axis-boundaries-ages'); $x_axis = $this->axisNumbers($boundaries_csv); switch ($y_axis_type) { @@ -555,7 +553,7 @@ class StatisticsChartModule extends AbstractModule implements ModuleChartInterfa } break; case self::Z_AXIS_TIME: - $boundaries_csv = $params['z-axis-boundaries-periods']; + $boundaries_csv = Validator::parsedBody($request)->string('z-axis-boundaries-periods'); $z_axis = $this->axisYears($boundaries_csv); $prev_boundary = 0; foreach (array_keys($z_axis) as $boundary) { @@ -579,7 +577,7 @@ class StatisticsChartModule extends AbstractModule implements ModuleChartInterfa case self::X_AXIS_AGE_AT_MARRIAGE: $chart_title = I18N::translate('Age in year of marriage'); $x_axis_title = I18N::translate('age'); - $boundaries_csv = $params['x-axis-boundaries-ages_m']; + $boundaries_csv = Validator::parsedBody($request)->string('x-axis-boundaries-ages_m'); $x_axis = $this->axisNumbers($boundaries_csv); switch ($y_axis_type) { @@ -616,7 +614,7 @@ class StatisticsChartModule extends AbstractModule implements ModuleChartInterfa } break; case self::Z_AXIS_TIME: - $boundaries_csv = $params['z-axis-boundaries-periods']; + $boundaries_csv = Validator::parsedBody($request)->string('z-axis-boundaries-periods'); $z_axis = $this->axisYears($boundaries_csv); // The stats query doesn't have an "all" function, so query M/F separately foreach (['M', 'F'] as $sex) { @@ -640,7 +638,7 @@ class StatisticsChartModule extends AbstractModule implements ModuleChartInterfa case self::X_AXIS_AGE_AT_FIRST_MARRIAGE: $chart_title = I18N::translate('Age in year of first marriage'); $x_axis_title = I18N::translate('age'); - $boundaries_csv = $params['x-axis-boundaries-ages_m']; + $boundaries_csv = Validator::parsedBody($request)->string('x-axis-boundaries-ages_m'); $x_axis = $this->axisNumbers($boundaries_csv); switch ($y_axis_type) { @@ -685,7 +683,7 @@ class StatisticsChartModule extends AbstractModule implements ModuleChartInterfa } break; case self::Z_AXIS_TIME: - $boundaries_csv = $params['z-axis-boundaries-periods']; + $boundaries_csv = Validator::parsedBody($request)->string('z-axis-boundaries-periods'); $z_axis = $this->axisYears($boundaries_csv); // The stats query doesn't have an "all" function, so query M/F separately foreach (['M', 'F'] as $sex) { @@ -735,7 +733,7 @@ class StatisticsChartModule extends AbstractModule implements ModuleChartInterfa } break; case self::Z_AXIS_TIME: - $boundaries_csv = $params['z-axis-boundaries-periods']; + $boundaries_csv = Validator::parsedBody($request)->string('z-axis-boundaries-periods'); $z_axis = $this->axisYears($boundaries_csv); $prev_boundary = 0; foreach (array_keys($z_axis) as $boundary) { diff --git a/app/Module/StoriesModule.php b/app/Module/StoriesModule.php index 71a0010d53..4a6a8fa449 100644 --- a/app/Module/StoriesModule.php +++ b/app/Module/StoriesModule.php @@ -262,12 +262,10 @@ class StoriesModule extends AbstractModule implements ModuleConfigInterface, Mod */ public function postAdminAction(ServerRequestInterface $request): ResponseInterface { - $params = (array) $request->getParsedBody(); - return redirect(route('module', [ 'module' => $this->name(), 'action' => 'Admin', - 'tree' => $params['tree'] ?? '', + 'tree' => Validator::parsedBody($request)->string('tree'), ])); } @@ -289,7 +287,7 @@ class StoriesModule extends AbstractModule implements ModuleConfigInterface, Mod $story_title = ''; $story_body = ''; $languages = []; - $xref = $request->getQueryParams()['xref'] ?? ''; + $xref = Validator::queryParams($request)->isXref()->string('xref'); $title = I18N::translate('Add a story') . ' — ' . e($tree->title()); } else { // Editing an existing story @@ -367,7 +365,7 @@ class StoriesModule extends AbstractModule implements ModuleConfigInterface, Mod public function postAdminDeleteAction(ServerRequestInterface $request): ResponseInterface { $tree = Validator::attributes($request)->tree(); - $block_id = $request->getQueryParams()['block_id']; + $block_id = Validator::queryParams($request)->integer('block_id'); DB::table('block_setting') ->where('block_id', '=', $block_id) diff --git a/app/Module/SubmitterListModule.php b/app/Module/SubmitterListModule.php index 8d876a3afc..fab6c2038b 100644 --- a/app/Module/SubmitterListModule.php +++ b/app/Module/SubmitterListModule.php @@ -133,20 +133,6 @@ class SubmitterListModule extends AbstractModule implements ModuleListInterface, } /** - * Handle URLs generated by older versions of webtrees - * - * @param ServerRequestInterface $request - * - * @return ResponseInterface - */ - public function getListAction(ServerRequestInterface $request): ResponseInterface - { - $tree = Validator::attributes($request)->tree(); - - return redirect($this->listUrl($tree, $request->getQueryParams())); - } - - /** * @param ServerRequestInterface $request * * @return ResponseInterface diff --git a/app/Module/TopGivenNamesModule.php b/app/Module/TopGivenNamesModule.php index adf6567a14..bfcc2aa073 100644 --- a/app/Module/TopGivenNamesModule.php +++ b/app/Module/TopGivenNamesModule.php @@ -22,6 +22,7 @@ namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Statistics; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Support\Str; use Psr\Http\Message\ServerRequestInterface; @@ -158,10 +159,11 @@ class TopGivenNamesModule extends AbstractModule implements ModuleBlockInterface */ public function saveBlockConfiguration(ServerRequestInterface $request, int $block_id): void { - $params = (array) $request->getParsedBody(); + $num = Validator::parsedBody($request)->integer('num'); + $info_style = Validator::parsedBody($request)->string('infoStyle'); - $this->setBlockSetting($block_id, 'num', $params['num']); - $this->setBlockSetting($block_id, 'infoStyle', $params['infoStyle']); + $this->setBlockSetting($block_id, 'num', (string) $num); + $this->setBlockSetting($block_id, 'infoStyle', $info_style); } /** @@ -174,7 +176,7 @@ class TopGivenNamesModule extends AbstractModule implements ModuleBlockInterface */ public function editBlockConfiguration(Tree $tree, int $block_id): string { - $num = $this->getBlockSetting($block_id, 'num', self::DEFAULT_NUMBER); + $num = (int) $this->getBlockSetting($block_id, 'num', self::DEFAULT_NUMBER); $info_style = $this->getBlockSetting($block_id, 'infoStyle', self::DEFAULT_STYLE); $info_styles = [ diff --git a/app/Module/TopPageViewsModule.php b/app/Module/TopPageViewsModule.php index c8e2907c8f..52a974dc85 100644 --- a/app/Module/TopPageViewsModule.php +++ b/app/Module/TopPageViewsModule.php @@ -23,6 +23,7 @@ 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 Illuminate\Support\Str; use Psr\Http\Message\ServerRequestInterface; @@ -157,9 +158,9 @@ class TopPageViewsModule extends AbstractModule implements ModuleBlockInterface */ public function saveBlockConfiguration(ServerRequestInterface $request, int $block_id): void { - $params = (array) $request->getParsedBody(); + $num = Validator::parsedBody($request)->integer('num'); - $this->setBlockSetting($block_id, 'num', $params['num']); + $this->setBlockSetting($block_id, 'num', (string) $num); } /** diff --git a/app/Module/TopSurnamesModule.php b/app/Module/TopSurnamesModule.php index 47bcb2c63e..eecdf53a75 100644 --- a/app/Module/TopSurnamesModule.php +++ b/app/Module/TopSurnamesModule.php @@ -24,6 +24,7 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Services\ModuleService; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Query\Expression; use Illuminate\Support\Str; @@ -37,6 +38,7 @@ use function uksort; use function view; use const EXTR_OVERWRITE; +use const PHP_INT_MAX; /** * Class TopSurnamesModule @@ -243,10 +245,11 @@ class TopSurnamesModule extends AbstractModule implements ModuleBlockInterface */ public function saveBlockConfiguration(ServerRequestInterface $request, int $block_id): void { - $params = (array) $request->getParsedBody(); + $num = Validator::parsedBody($request)->integer('num'); + $info_style = Validator::parsedBody($request)->string('infoStyle'); - $this->setBlockSetting($block_id, 'num', $params['num']); - $this->setBlockSetting($block_id, 'infoStyle', $params['infoStyle']); + $this->setBlockSetting($block_id, 'num', (string) $num); + $this->setBlockSetting($block_id, 'infoStyle', $info_style); } /** diff --git a/app/Module/UserJournalModule.php b/app/Module/UserJournalModule.php index dba2011d57..c75095fa61 100644 --- a/app/Module/UserJournalModule.php +++ b/app/Module/UserJournalModule.php @@ -164,9 +164,9 @@ class UserJournalModule extends AbstractModule implements ModuleBlockInterface throw new HttpAccessDeniedException(); } - $news_id = $request->getQueryParams()['news_id'] ?? ''; + $news_id = Validator::queryParams($request)->integer('news_id', 0); - if ($news_id !== '') { + if ($news_id !== 0) { $row = DB::table('news') ->where('news_id', '=', $news_id) ->where('user_id', '=', Auth::id()) @@ -204,16 +204,14 @@ class UserJournalModule extends AbstractModule implements ModuleBlockInterface throw new HttpAccessDeniedException(); } - $params = (array) $request->getParsedBody(); - - $news_id = $request->getQueryParams()['news_id'] ?? ''; - $subject = $params['subject']; - $body = $params['body']; + $news_id = Validator::queryParams($request)->integer('news_id', 0); + $subject = Validator::queryParams($request)->string('subject'); + $body = Validator::queryParams($request)->string('body'); $subject = $this->html_service->sanitize($subject); $body = $this->html_service->sanitize($body); - if ($news_id !== '') { + if ($news_id !== 0) { DB::table('news') ->where('news_id', '=', $news_id) ->where('user_id', '=', Auth::id()) @@ -243,7 +241,7 @@ class UserJournalModule extends AbstractModule implements ModuleBlockInterface public function postDeleteJournalAction(ServerRequestInterface $request): ResponseInterface { $tree = Validator::attributes($request)->tree(); - $news_id = $request->getQueryParams()['news_id']; + $news_id = Validator::queryParams($request)->integer('news_id'); DB::table('news') ->where('news_id', '=', $news_id) diff --git a/app/Module/YahrzeitModule.php b/app/Module/YahrzeitModule.php index 0fd0e2b577..e8672ef397 100644 --- a/app/Module/YahrzeitModule.php +++ b/app/Module/YahrzeitModule.php @@ -27,6 +27,7 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\CalendarService; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Support\Collection; use Illuminate\Support\Str; use Psr\Http\Message\ServerRequestInterface; @@ -231,11 +232,13 @@ class YahrzeitModule extends AbstractModule implements ModuleBlockInterface */ public function saveBlockConfiguration(ServerRequestInterface $request, int $block_id): void { - $params = (array) $request->getParsedBody(); + $days = Validator::parsedBody($request)->string('days', self::DEFAULT_DAYS); + $info_style = Validator::parsedBody($request)->string('infoStyle', self::DEFAULT_STYLE); + $calendar = Validator::parsedBody($request)->string('calendar', self::DEFAULT_CALENDAR); - $this->setBlockSetting($block_id, 'days', $params['days'] ?? self::DEFAULT_DAYS); - $this->setBlockSetting($block_id, 'infoStyle', $params['infoStyle'] ?? self::DEFAULT_STYLE); - $this->setBlockSetting($block_id, 'calendar', $params['calendar'] ?? self::DEFAULT_CALENDAR); + $this->setBlockSetting($block_id, 'days', $days); + $this->setBlockSetting($block_id, 'infoStyle', $info_style); + $this->setBlockSetting($block_id, 'calendar', $calendar); } /** diff --git a/app/Services/DatatablesService.php b/app/Services/DatatablesService.php index 515aea4355..5bcc45d523 100644 --- a/app/Services/DatatablesService.php +++ b/app/Services/DatatablesService.php @@ -20,6 +20,7 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Services; use Closure; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Query\Builder; use Illuminate\Database\Query\Expression; use Illuminate\Support\Collection; @@ -49,11 +50,11 @@ class DatatablesService */ public function handleCollection(ServerRequestInterface $request, Collection $collection, array $search_columns, array $sort_columns, Closure $callback): ResponseInterface { - $search = $request->getQueryParams()['search']['value'] ?? ''; - $start = (int) ($request->getQueryParams()['start'] ?? 0); - $length = (int) ($request->getQueryParams()['length'] ?? 0); - $order = $request->getQueryParams()['order'] ?? []; - $draw = (int) ($request->getQueryParams()['draw'] ?? 0); + $search = Validator::queryParams($request)->array('search')['value'] ?? ''; + $start = Validator::queryParams($request)->integer('start', 0); + $length = Validator::queryParams($request)->integer('length', 0); + $order = Validator::queryParams($request)->array('order'); + $draw = Validator::queryParams($request)->integer('draw', 0); // Count unfiltered records $recordsTotal = $collection->count(); @@ -125,11 +126,11 @@ class DatatablesService */ public function handleQuery(ServerRequestInterface $request, Builder $query, array $search_columns, array $sort_columns, Closure $callback): ResponseInterface { - $search = $request->getQueryParams()['search']['value'] ?? ''; - $start = (int) ($request->getQueryParams()['start'] ?? 0); - $length = (int) ($request->getQueryParams()['length'] ?? 0); - $order = $request->getQueryParams()['order'] ?? []; - $draw = (int) ($request->getQueryParams()['draw'] ?? 0); + $search = Validator::queryParams($request)->array('search')['value'] ?? ''; + $start = Validator::queryParams($request)->integer('start', 0); + $length = Validator::queryParams($request)->integer('length', 0); + $order = Validator::queryParams($request)->array('order'); + $draw = Validator::queryParams($request)->integer('draw', 0); // Count unfiltered records $recordsTotal = (clone $query)->count(); diff --git a/app/Services/MediaFileService.php b/app/Services/MediaFileService.php index 61482e68a2..476f455df7 100644 --- a/app/Services/MediaFileService.php +++ b/app/Services/MediaFileService.php @@ -168,13 +168,11 @@ class MediaFileService $tree = Validator::attributes($request)->tree(); $data_filesystem = Registry::filesystem()->data(); - - $params = (array) $request->getParsedBody(); - $file_location = $params['file_location']; + $file_location = Validator::parsedBody($request)->string('file_location'); switch ($file_location) { case 'url': - $remote = $params['remote']; + $remote = Validator::parsedBody($request)->string('remote'); if (str_contains($remote, '://')) { return $remote; @@ -183,7 +181,7 @@ class MediaFileService return ''; case 'unused': - $unused = $params['unused']; + $unused = Validator::parsedBody($request)->string('unused'); if ($tree->mediaFilesystem($data_filesystem)->fileExists($unused)) { return $unused; @@ -192,10 +190,9 @@ class MediaFileService return ''; case 'upload': - default: - $folder = $params['folder']; - $auto = $params['auto']; - $new_file = $params['new_file']; + $folder = Validator::parsedBody($request)->string('folder'); + $auto = Validator::parsedBody($request)->string('auto'); + $new_file = Validator::parsedBody($request)->string('new_file'); $uploaded_file = $request->getUploadedFiles()['file'] ?? null; @@ -235,6 +232,8 @@ class MediaFileService return ''; } } + + return ''; } /** diff --git a/app/Validator.php b/app/Validator.php index ab1a1438b2..2af325ad2b 100644 --- a/app/Validator.php +++ b/app/Validator.php @@ -26,6 +26,7 @@ use Fisharebest\Webtrees\Http\Exceptions\HttpBadRequestException; use Psr\Http\Message\ServerRequestInterface; use function array_reduce; +use function array_walk_recursive; use function ctype_digit; use function in_array; use function is_array; @@ -55,6 +56,18 @@ class Validator */ public function __construct(array $parameters, ServerRequestInterface $request) { + // All keys and values must be valid UTF-8 + $check_utf8 = static function ($value, $key): void { + if (is_string($key) && preg_match('//u', $key) !== 1) { + throw new HttpBadRequestException('Invalid UTF-8 characters in request'); + } + if (is_string($value) && preg_match('//u', $value) !== 1) { + throw new HttpBadRequestException('Invalid UTF-8 characters in request'); + } + }; + + array_walk_recursive($parameters, $check_utf8); + $this->parameters = $parameters; $this->request = $request; } @@ -202,11 +215,15 @@ class Validator */ public function isXref(): self { - $this->rules[] = static function (?string $value): ?string { - if ($value !== null && preg_match('/^' . Gedcom::REGEX_XREF . '$/', $value) === 1) { + $this->rules[] = static function ($value) { + if (is_string($value) && preg_match('/^' . Gedcom::REGEX_XREF . '$/', $value) === 1) { return $value; } + if (is_array($value)) { + return array_filter($value, static fn ($x): bool => is_string($x) && preg_match('/^' . Gedcom::REGEX_XREF . '$/', $x) === 1); + } + return null; }; @@ -253,18 +270,7 @@ class Validator $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) !== 1 || is_string($v) && preg_match('//u', $v) !== 1) { - throw new HttpBadRequestException(I18N::translate('The parameter “%s” is missing.', $parameter)); - } - }; - - array_walk_recursive($value, $check_utf8); - - return $value; + return array_reduce($this->rules, $callback, $value) ?? []; } /** @@ -291,9 +297,7 @@ class Validator $callback = static fn (?int $value, Closure $rule): ?int => $rule($value); - $value = array_reduce($this->rules, $callback, $value); - - $value ??= $default; + $value = array_reduce($this->rules, $callback, $value) ?? $default; if ($value === null) { throw new HttpBadRequestException(I18N::translate('The parameter “%s” is missing.', $parameter)); @@ -334,10 +338,9 @@ class Validator $callback = static fn (?string $value, Closure $rule): ?string => $rule($value); - $value = array_reduce($this->rules, $callback, $value); - $value ??= $default; + $value = array_reduce($this->rules, $callback, $value) ?? $default; - if ($value === null || preg_match('//u', $value) !== 1) { + if ($value === null) { throw new HttpBadRequestException(I18N::translate('The parameter “%s” is missing.', $parameter)); } |
