diff options
Diffstat (limited to 'app/Http')
| -rw-r--r-- | app/Http/Middleware/UseSession.php | 13 | ||||
| -rw-r--r-- | app/Http/RequestHandlers/LoginAction.php | 4 | ||||
| -rw-r--r-- | app/Http/RequestHandlers/PasswordRequestAction.php | 11 | ||||
| -rw-r--r-- | app/Http/RequestHandlers/PendingChangesLogData.php | 3 | ||||
| -rw-r--r-- | app/Http/RequestHandlers/PendingChangesLogPage.php | 6 | ||||
| -rw-r--r-- | app/Http/RequestHandlers/SiteLogsData.php | 4 | ||||
| -rw-r--r-- | app/Http/RequestHandlers/SiteLogsPage.php | 6 | ||||
| -rw-r--r-- | app/Http/RequestHandlers/UserListData.php | 6 | ||||
| -rw-r--r-- | app/Http/RequestHandlers/UsersCleanupPage.php | 6 |
9 files changed, 33 insertions, 26 deletions
diff --git a/app/Http/Middleware/UseSession.php b/app/Http/Middleware/UseSession.php index c60950bccd..d14065fbc7 100644 --- a/app/Http/Middleware/UseSession.php +++ b/app/Http/Middleware/UseSession.php @@ -20,7 +20,6 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\Middleware; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Carbon; use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Session; use Fisharebest\Webtrees\Webtrees; @@ -31,6 +30,7 @@ use Psr\Http\Server\RequestHandlerInterface; use function session_destroy; use function session_status; +use function time; use const PHP_SESSION_ACTIVE; @@ -39,6 +39,9 @@ use const PHP_SESSION_ACTIVE; */ class UseSession implements MiddlewareInterface { + // To avoid read-write contention on the wt_user_setting table, don't update the last-active time on every request. + private const UPDATE_ACTIVITY_INTERVAL = 60; + /** * @param ServerRequestInterface $request * @param RequestHandlerInterface $handler @@ -58,12 +61,12 @@ class UseSession implements MiddlewareInterface $user = Auth::user(); - // Update the last-login time no more than once a minute. + // Update the last-login time. if (Session::get('masquerade') === null) { - $last = Carbon::createFromTimestamp((int) $user->getPreference(UserInterface::PREF_TIMESTAMP_ACTIVE)); + $last = (int) $user->getPreference(UserInterface::PREF_TIMESTAMP_ACTIVE); - if (Carbon::now()->subMinute()->gt($last)) { - $user->setPreference(UserInterface::PREF_TIMESTAMP_ACTIVE, (string) Carbon::now()->unix()); + if (time() - $last >= self::UPDATE_ACTIVITY_INTERVAL) { + $user->setPreference(UserInterface::PREF_TIMESTAMP_ACTIVE, (string) time()); } } diff --git a/app/Http/RequestHandlers/LoginAction.php b/app/Http/RequestHandlers/LoginAction.php index 100d7dd42d..337dc59ff1 100644 --- a/app/Http/RequestHandlers/LoginAction.php +++ b/app/Http/RequestHandlers/LoginAction.php @@ -21,7 +21,6 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Exception; use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Carbon; use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\I18N; @@ -36,6 +35,7 @@ use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; use function route; +use function time; /** * Perform a login. @@ -135,7 +135,7 @@ class LoginAction implements RequestHandlerInterface Auth::login($user); Log::addAuthenticationLog('Login: ' . Auth::user()->userName() . '/' . Auth::user()->realName()); - Auth::user()->setPreference(UserInterface::PREF_TIMESTAMP_ACTIVE, (string) Carbon::now()->unix()); + Auth::user()->setPreference(UserInterface::PREF_TIMESTAMP_ACTIVE, (string) time()); Session::put('language', Auth::user()->getPreference(UserInterface::PREF_LANGUAGE)); Session::put('theme', Auth::user()->getPreference(UserInterface::PREF_THEME)); diff --git a/app/Http/RequestHandlers/PasswordRequestAction.php b/app/Http/RequestHandlers/PasswordRequestAction.php index 290edcf72c..2960362fd3 100644 --- a/app/Http/RequestHandlers/PasswordRequestAction.php +++ b/app/Http/RequestHandlers/PasswordRequestAction.php @@ -20,7 +20,6 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fig\Http\Message\StatusCodeInterface; -use Fisharebest\Webtrees\Carbon; use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Log; @@ -48,6 +47,12 @@ class PasswordRequestAction implements RequestHandlerInterface, StatusCodeInterf { private const TOKEN_LENGTH = 40; + private const TOKEN_VALIDITY_SECONDS = 3600; + + private const RATE_LIMIT_REQUESTS = 5; + + private const RATE_LIMIT_SECONDS = 300; + private EmailService $email_service; private RateLimitService $rate_limit_service; @@ -86,10 +91,10 @@ class PasswordRequestAction implements RequestHandlerInterface, StatusCodeInterf $user = $this->user_service->findByEmail($email); if ($user instanceof User) { - $this->rate_limit_service->limitRateForUser($user, 5, 300, 'rate-limit-pw-reset'); + $this->rate_limit_service->limitRateForUser($user, self::RATE_LIMIT_REQUESTS, self::RATE_LIMIT_SECONDS, 'rate-limit-pw-reset'); $token = Str::random(self::TOKEN_LENGTH); - $expire = (string) Carbon::now()->addHour()->getTimestamp(); + $expire = (string) (time() + self::TOKEN_VALIDITY_SECONDS); $url = route(PasswordResetPage::class, [ 'token' => $token, 'tree' => $tree instanceof Tree ? $tree->name() : null, diff --git a/app/Http/RequestHandlers/PendingChangesLogData.php b/app/Http/RequestHandlers/PendingChangesLogData.php index b2896841f2..4bbbe9566a 100644 --- a/app/Http/RequestHandlers/PendingChangesLogData.php +++ b/app/Http/RequestHandlers/PendingChangesLogData.php @@ -20,7 +20,6 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Algorithm\MyersDiff; -use Fisharebest\Webtrees\Carbon; use Fisharebest\Webtrees\Gedcom; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; @@ -102,7 +101,7 @@ class PendingChangesLogData implements RequestHandlerInterface return [ $row->change_id, - Carbon::make($row->change_time)->local()->format('Y-m-d H:i:s'), + Registry::timestampFactory()->fromString($row->change_time)->toDateTimeString(), I18N::translate($row->status), $record ? '<a href="' . e($record->url()) . '">' . $record->xref() . '</a>' : $row->xref, '<div class="gedcom-data" dir="ltr">' . diff --git a/app/Http/RequestHandlers/PendingChangesLogPage.php b/app/Http/RequestHandlers/PendingChangesLogPage.php index d5156642a6..e852d6b2f4 100644 --- a/app/Http/RequestHandlers/PendingChangesLogPage.php +++ b/app/Http/RequestHandlers/PendingChangesLogPage.php @@ -19,9 +19,9 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; -use Fisharebest\Webtrees\Carbon; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; +use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\TreeService; use Fisharebest\Webtrees\Services\UserService; use Fisharebest\Webtrees\Tree; @@ -75,8 +75,8 @@ class PendingChangesLogPage implements RequestHandlerInterface $earliest = DB::table('change')->min('change_time'); $latest = DB::table('change')->max('change_time'); - $earliest = Carbon::make($earliest) ?? Carbon::now(); - $latest = Carbon::make($latest) ?? Carbon::now(); + $earliest = Registry::timestampFactory()->fromString($earliest); + $latest = Registry::timestampFactory()->fromString($latest); $earliest = $earliest->toDateString(); $latest = $latest->toDateString(); diff --git a/app/Http/RequestHandlers/SiteLogsData.php b/app/Http/RequestHandlers/SiteLogsData.php index 86c3b6ece9..ee5ea7a0fd 100644 --- a/app/Http/RequestHandlers/SiteLogsData.php +++ b/app/Http/RequestHandlers/SiteLogsData.php @@ -19,7 +19,7 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; -use Fisharebest\Webtrees\Carbon; +use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\DatatablesService; use Fisharebest\Webtrees\Services\SiteLogsService; use Psr\Http\Message\ResponseInterface; @@ -61,7 +61,7 @@ class SiteLogsData implements RequestHandlerInterface return $this->datatables_service->handleQuery($request, $query, [], [], static function (object $row): array { return [ $row->log_id, - Carbon::make($row->log_time)->local()->format('Y-m-d H:i:s'), + Registry::timestampFactory()->fromString($row->log_time)->toDateTimeString(), $row->log_type, '<bdi>' . e($row->log_message) . '</bdi>', '<bdi>' . e($row->ip_address) . '</bdi>', diff --git a/app/Http/RequestHandlers/SiteLogsPage.php b/app/Http/RequestHandlers/SiteLogsPage.php index 4f9120242d..0c703414e5 100644 --- a/app/Http/RequestHandlers/SiteLogsPage.php +++ b/app/Http/RequestHandlers/SiteLogsPage.php @@ -19,9 +19,9 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; -use Fisharebest\Webtrees\Carbon; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; +use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\TreeService; use Fisharebest\Webtrees\Services\UserService; use Fisharebest\Webtrees\Tree; @@ -68,8 +68,8 @@ class SiteLogsPage implements RequestHandlerInterface $earliest = DB::table('log')->min('log_time'); $latest = DB::table('log')->max('log_time'); - $earliest = Carbon::make($earliest) ?? Carbon::now(); - $latest = Carbon::make($latest) ?? Carbon::now(); + $earliest = Registry::timestampFactory()->fromString($earliest); + $latest = Registry::timestampFactory()->fromString($latest); $earliest = $earliest->toDateString(); $latest = $latest->toDateString(); diff --git a/app/Http/RequestHandlers/UserListData.php b/app/Http/RequestHandlers/UserListData.php index 2ef8c6a165..a4a3691dc1 100644 --- a/app/Http/RequestHandlers/UserListData.php +++ b/app/Http/RequestHandlers/UserListData.php @@ -19,10 +19,10 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; -use Fisharebest\Webtrees\Carbon; use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Module\ModuleLanguageInterface; +use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\DatatablesService; use Fisharebest\Webtrees\Services\ModuleService; use Fisharebest\Webtrees\Services\UserService; @@ -133,9 +133,9 @@ class UserListData implements RequestHandlerInterface '<a href="mailto:' . e($row->email) . '">' . e($row->email) . '</a>', $languages->get($row->language, $row->language), $row->registered_at, - $row->registered_at ? view('components/datetime-diff', ['timestamp' => Carbon::createFromTimestamp((int) $row->registered_at)]) : '', + $row->registered_at ? view('components/datetime-diff', ['timestamp' => Registry::timestampFactory()->make((int) $row->registered_at)]) : '', $row->active_at, - $row->active_at ? view('components/datetime-diff', ['timestamp' => Carbon::createFromTimestamp((int) $row->active_at)]) : I18N::translate('Never'), + $row->active_at ? view('components/datetime-diff', ['timestamp' => Registry::timestampFactory()->make((int) $row->active_at)]) : I18N::translate('Never'), $row->verified ? I18N::translate('yes') : I18N::translate('no'), $row->verified_by_admin ? I18N::translate('yes') : I18N::translate('no'), ]; diff --git a/app/Http/RequestHandlers/UsersCleanupPage.php b/app/Http/RequestHandlers/UsersCleanupPage.php index 04917a5232..926773e570 100644 --- a/app/Http/RequestHandlers/UsersCleanupPage.php +++ b/app/Http/RequestHandlers/UsersCleanupPage.php @@ -19,9 +19,9 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; -use Fisharebest\Webtrees\Carbon; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; +use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\UserService; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -51,8 +51,8 @@ class UsersCleanupPage implements RequestHandlerInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { - $inactive_threshold = Carbon::now()->subMonths(6)->getTimestamp(); - $unverified_threshold = Carbon::now()->subDays(7)->getTimestamp(); + $inactive_threshold = Registry::timestampFactory()->now()->subtractMonths(6)->timestamp(); + $unverified_threshold = Registry::timestampFactory()->now()->subtractDays(7)->timestamp(); $inactive_users = $this->user_service->all() ->filter($this->user_service->filterInactive($inactive_threshold)) |
