summaryrefslogtreecommitdiff
path: root/app/Http
diff options
context:
space:
mode:
Diffstat (limited to 'app/Http')
-rw-r--r--app/Http/Middleware/UseSession.php13
-rw-r--r--app/Http/RequestHandlers/LoginAction.php4
-rw-r--r--app/Http/RequestHandlers/PasswordRequestAction.php11
-rw-r--r--app/Http/RequestHandlers/PendingChangesLogData.php3
-rw-r--r--app/Http/RequestHandlers/PendingChangesLogPage.php6
-rw-r--r--app/Http/RequestHandlers/SiteLogsData.php4
-rw-r--r--app/Http/RequestHandlers/SiteLogsPage.php6
-rw-r--r--app/Http/RequestHandlers/UserListData.php6
-rw-r--r--app/Http/RequestHandlers/UsersCleanupPage.php6
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))