summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorGreg Roach <greg@subaqua.co.uk>2022-11-15 13:20:16 +0000
committerGreg Roach <greg@subaqua.co.uk>2022-11-18 11:55:56 +0000
commit748dbe155a6d19d66918ad136947fa23ee8f8469 (patch)
treeed4743592d3b0aea968f9cbae7e5d32c00b546fe /app
parentf783aa1f4cd6d54a90d24a3d6be2996a3951fced (diff)
downloadwebtrees-748dbe155a6d19d66918ad136947fa23ee8f8469.tar.gz
webtrees-748dbe155a6d19d66918ad136947fa23ee8f8469.tar.bz2
webtrees-748dbe155a6d19d66918ad136947fa23ee8f8469.zip
Use Validator
Diffstat (limited to 'app')
-rw-r--r--app/Http/Middleware/Router.php2
-rw-r--r--app/Http/RequestHandlers/AbstractModuleComponentAction.php14
-rw-r--r--app/Http/RequestHandlers/AccountUpdate.php22
-rw-r--r--app/Http/RequestHandlers/AddMediaFileAction.php5
-rw-r--r--app/Http/RequestHandlers/AddNewFact.php2
-rw-r--r--app/Http/RequestHandlers/AdminMediaFileThumbnail.php4
-rw-r--r--app/Http/RequestHandlers/CalendarAction.php20
-rw-r--r--app/Http/RequestHandlers/CalendarEvents.php22
-rw-r--r--app/Http/RequestHandlers/CalendarPage.php14
-rw-r--r--app/Http/RequestHandlers/ChangeFamilyMembersAction.php15
-rw-r--r--app/Http/RequestHandlers/ChangeFamilyMembersPage.php5
-rw-r--r--app/Http/RequestHandlers/CreateLocationAction.php4
-rw-r--r--app/Http/RequestHandlers/CreateMediaObjectAction.php9
-rw-r--r--app/Http/RequestHandlers/CreateMediaObjectFromFile.php11
-rw-r--r--app/Http/RequestHandlers/CreateNoteAction.php5
-rw-r--r--app/Http/RequestHandlers/CreateSourceAction.php20
-rw-r--r--app/Http/RequestHandlers/CreateSubmissionAction.php3
-rw-r--r--app/Http/RequestHandlers/CreateSubmitterAction.php11
-rw-r--r--app/Http/RequestHandlers/CreateTreeAction.php6
-rw-r--r--app/Http/RequestHandlers/CreateTreePage.php5
-rw-r--r--app/Http/RequestHandlers/DataFixSelect.php5
-rw-r--r--app/Http/RequestHandlers/DataFixUpdate.php2
-rw-r--r--app/Http/RequestHandlers/DataFixUpdateAll.php4
-rw-r--r--app/Http/RequestHandlers/DeletePath.php3
-rw-r--r--app/Http/RequestHandlers/EditFactAction.php3
-rw-r--r--app/Http/RequestHandlers/EditMediaFileAction.php21
-rw-r--r--app/Http/RequestHandlers/EditNoteAction.php12
-rw-r--r--app/Http/RequestHandlers/EditRawFactAction.php3
-rw-r--r--app/Http/RequestHandlers/EditRawRecordAction.php16
-rw-r--r--app/Http/RequestHandlers/EditRecordPage.php17
-rw-r--r--app/Http/RequestHandlers/EmailPreferencesAction.php50
-rw-r--r--app/Http/RequestHandlers/ExportGedcomServer.php4
-rw-r--r--app/Http/RequestHandlers/FixLevel0MediaAction.php16
-rw-r--r--app/Http/RequestHandlers/FixLevel0MediaData.php5
-rw-r--r--app/Http/RequestHandlers/ImportThumbnailsAction.php11
-rw-r--r--app/Http/RequestHandlers/ImportThumbnailsData.php10
-rw-r--r--app/Http/RequestHandlers/LinkChildToFamilyAction.php8
-rw-r--r--app/Http/RequestHandlers/LinkMediaToRecordAction.php7
-rw-r--r--app/Http/RequestHandlers/ManageMediaAction.php9
-rw-r--r--app/Http/RequestHandlers/ManageMediaData.php7
-rw-r--r--app/Http/RequestHandlers/ManageMediaPage.php7
-rw-r--r--app/Http/RequestHandlers/MapDataSave.php14
-rw-r--r--app/Http/RequestHandlers/MediaFileDownload.php13
-rw-r--r--app/Http/RequestHandlers/MediaFileThumbnail.php4
-rw-r--r--app/Http/RequestHandlers/MergeFactsAction.php14
-rw-r--r--app/Http/RequestHandlers/MergeFactsPage.php8
-rw-r--r--app/Http/RequestHandlers/MergeRecordsAction.php7
-rw-r--r--app/Http/RequestHandlers/MergeRecordsPage.php4
-rw-r--r--app/Http/RequestHandlers/MergeTreesAction.php6
-rw-r--r--app/Http/RequestHandlers/MergeTreesPage.php6
-rw-r--r--app/Http/RequestHandlers/ModuleDeleteSettings.php5
-rw-r--r--app/Http/RequestHandlers/ModulesAllAction.php11
-rw-r--r--app/Http/RequestHandlers/ModulesThemesAction.php2
-rw-r--r--app/Http/RequestHandlers/PasswordRequestAction.php7
-rw-r--r--app/Http/RequestHandlers/PasswordResetAction.php7
-rw-r--r--app/Http/RequestHandlers/PasteFact.php3
-rw-r--r--app/Http/RequestHandlers/PendingChangesAcceptTree.php6
-rw-r--r--app/Http/RequestHandlers/PendingChangesLogAction.php19
-rw-r--r--app/Http/RequestHandlers/PendingChangesLogPage.php21
-rw-r--r--app/Http/RequestHandlers/RedirectPlaceListPhp.php2
-rw-r--r--app/Http/RequestHandlers/RedirectReportEnginePhp.php12
-rw-r--r--app/Http/RequestHandlers/RegisterAction.php15
-rw-r--r--app/Http/RequestHandlers/ReorderChildrenAction.php13
-rw-r--r--app/Http/RequestHandlers/ReorderFamiliesAction.php11
-rw-r--r--app/Http/RequestHandlers/ReorderMediaAction.php12
-rw-r--r--app/Http/RequestHandlers/ReorderMediaFilesAction.php8
-rw-r--r--app/Http/RequestHandlers/ReorderNamesAction.php12
-rw-r--r--app/Http/RequestHandlers/ReportGenerate.php9
-rw-r--r--app/Http/RequestHandlers/ReportListAction.php9
-rw-r--r--app/Http/RequestHandlers/ReportSetupAction.php19
-rw-r--r--app/Http/RequestHandlers/ReportSetupPage.php2
-rw-r--r--app/Http/RequestHandlers/SearchAdvancedAction.php11
-rw-r--r--app/Http/RequestHandlers/SearchAdvancedPage.php21
-rw-r--r--app/Http/RequestHandlers/SearchGeneralAction.php24
-rw-r--r--app/Http/RequestHandlers/SearchGeneralPage.php25
-rw-r--r--app/Http/RequestHandlers/SearchPhoneticAction.php16
-rw-r--r--app/Http/RequestHandlers/SearchPhoneticPage.php21
-rw-r--r--app/Http/RequestHandlers/SearchQuickAction.php7
-rw-r--r--app/Http/RequestHandlers/SearchReplaceAction.php7
-rw-r--r--app/Http/RequestHandlers/SearchReplacePage.php14
-rw-r--r--app/Http/RequestHandlers/SelectNewFact.php11
-rw-r--r--app/Http/RequestHandlers/SetupWizard.php4
-rw-r--r--app/Http/RequestHandlers/SiteLogsAction.php17
-rw-r--r--app/Http/RequestHandlers/SitePreferencesAction.php27
-rw-r--r--app/Http/RequestHandlers/SiteRegistrationAction.php17
-rw-r--r--app/Http/RequestHandlers/TreePageBlock.php2
-rw-r--r--app/Http/RequestHandlers/TreePageDefaultUpdate.php7
-rw-r--r--app/Http/RequestHandlers/TreePageUpdate.php13
-rw-r--r--app/Http/RequestHandlers/TreePreferencesAction.php126
-rw-r--r--app/Http/RequestHandlers/TreePrivacyAction.php52
-rw-r--r--app/Http/RequestHandlers/UnconnectedAction.php13
-rw-r--r--app/Http/RequestHandlers/UnconnectedPage.php4
-rw-r--r--app/Http/RequestHandlers/UpgradeWizardPage.php3
-rw-r--r--app/Http/RequestHandlers/UpgradeWizardStep.php6
-rw-r--r--app/Http/RequestHandlers/UploadMediaAction.php13
-rw-r--r--app/Http/RequestHandlers/UserAddAction.php11
-rw-r--r--app/Http/RequestHandlers/UserAddPage.php8
-rw-r--r--app/Http/RequestHandlers/UserEditAction.php41
-rw-r--r--app/Http/RequestHandlers/UserEditPage.php3
-rw-r--r--app/Http/RequestHandlers/UserListPage.php6
-rw-r--r--app/Http/RequestHandlers/UserPageBlock.php2
-rw-r--r--app/Http/RequestHandlers/UserPageDefaultUpdate.php7
-rw-r--r--app/Http/RequestHandlers/UserPageUpdate.php18
-rw-r--r--app/Http/RequestHandlers/UsersCleanupAction.php5
-rw-r--r--app/Module/BingMaps.php5
-rw-r--r--app/Module/BranchesListModule.php30
-rw-r--r--app/Module/CensusAssistantModule.php32
-rw-r--r--app/Module/ChartsBlockModule.php8
-rw-r--r--app/Module/ClippingsCartModule.php105
-rw-r--r--app/Module/ColorsTheme.php8
-rw-r--r--app/Module/CustomCssJsModule.php8
-rw-r--r--app/Module/DescendancyModule.php4
-rw-r--r--app/Module/FamilyListModule.php12
-rw-r--r--app/Module/FamilyTreeFavoritesModule.php2
-rw-r--r--app/Module/FamilyTreeNewsModule.php20
-rw-r--r--app/Module/FamilyTreeStatisticsModule.php62
-rw-r--r--app/Module/FixPlaceNames.php14
-rw-r--r--app/Module/FixSearchAndReplace.php22
-rw-r--r--app/Module/FrequentlyAskedQuestionsModule.php40
-rw-r--r--app/Module/GeonamesAutocomplete.php5
-rw-r--r--app/Module/GoogleMaps.php5
-rw-r--r--app/Module/HereMaps.php5
-rw-r--r--app/Module/IndividualListModule.php54
-rw-r--r--app/Module/InteractiveTreeModule.php26
-rw-r--r--app/Module/LocationListModule.php14
-rw-r--r--app/Module/MapBox.php5
-rw-r--r--app/Module/MapGeoLocationGeonames.php5
-rw-r--r--app/Module/MapGeoLocationOpenRouteService.php5
-rw-r--r--app/Module/MediaListModule.php30
-rw-r--r--app/Module/ModuleAnalyticsTrait.php4
-rw-r--r--app/Module/ModuleCustomTrait.php3
-rw-r--r--app/Module/ModuleTabTrait.php3
-rw-r--r--app/Module/NoteListModule.php14
-rw-r--r--app/Module/OnThisDayModule.php16
-rw-r--r--app/Module/OpenRouteServiceAutocomplete.php5
-rw-r--r--app/Module/PlaceHierarchyListModule.php18
-rw-r--r--app/Module/RecentChangesModule.php20
-rw-r--r--app/Module/RelationshipsChartModule.php8
-rw-r--r--app/Module/RepositoryListModule.php14
-rw-r--r--app/Module/ResearchTaskModule.php11
-rw-r--r--app/Module/ReviewChangesModule.php8
-rw-r--r--app/Module/SiteMapModule.php4
-rw-r--r--app/Module/SlideShowModule.php4
-rw-r--r--app/Module/SourceListModule.php14
-rw-r--r--app/Module/StatisticsChartModule.php44
-rw-r--r--app/Module/StoriesModule.php8
-rw-r--r--app/Module/SubmitterListModule.php14
-rw-r--r--app/Module/TopGivenNamesModule.php10
-rw-r--r--app/Module/TopPageViewsModule.php5
-rw-r--r--app/Module/TopSurnamesModule.php9
-rw-r--r--app/Module/UserJournalModule.php16
-rw-r--r--app/Module/YahrzeitModule.php11
-rw-r--r--app/Services/DatatablesService.php21
-rw-r--r--app/Services/MediaFileService.php17
-rw-r--r--app/Validator.php43
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));
}