diff --git a/libraries/classes/Controllers/Table/TrackingController.php b/libraries/classes/Controllers/Table/TrackingController.php index 06d574d4b9..db5dbdc2ad 100644 --- a/libraries/classes/Controllers/Table/TrackingController.php +++ b/libraries/classes/Controllers/Table/TrackingController.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace PhpMyAdmin\Controllers\Table; +use DateTimeImmutable; use PhpMyAdmin\Controllers\AbstractController; use PhpMyAdmin\DbTableExists; use PhpMyAdmin\Http\ServerRequest; @@ -14,6 +15,8 @@ use PhpMyAdmin\Tracker; use PhpMyAdmin\Tracking; use PhpMyAdmin\Url; use PhpMyAdmin\Util; +use Throwable; +use Webmozart\Assert\Assert; use function __; use function array_map; @@ -93,8 +96,8 @@ final class TrackingController extends AbstractController $logType = $this->validateLogTypeParam($request->getParsedBodyParam('log_type')); - $dateFrom = ''; - $dateTo = ''; + $dateFrom = null; + $dateTo = null; $users = ''; // Init vars for tracking report @@ -105,16 +108,20 @@ final class TrackingController extends AbstractController $versionParam ); - /** @var string $dateFrom */ - $dateFrom = $request->getParsedBodyParam('date_from', $trackedData['date_from']); - /** @var string $dateTo */ - $dateTo = $request->getParsedBodyParam('date_to', $trackedData['date_to']); + $dateFrom = $this->validateDateTimeParam( + $request->getParsedBodyParam('date_from', $trackedData['date_from']) + ); + $dateTo = $this->validateDateTimeParam($request->getParsedBodyParam('date_to', $trackedData['date_to'])); + /** @var string $users */ $users = $request->getParsedBodyParam('users', '*'); $GLOBALS['filter_users'] = array_map('trim', explode(',', $users)); } + $dateFrom = $dateFrom ?? new DateTimeImmutable(); + $dateTo = $dateTo ?? new DateTimeImmutable(); + // Prepare export if ($reportExport !== null) { $GLOBALS['entries'] = $this->tracking->getEntries( @@ -272,4 +279,18 @@ final class TrackingController extends AbstractController { return in_array($param, ['schema', 'data'], true) ? $param : 'schema_and_data'; } + + /** + * @param mixed $param + */ + private function validateDateTimeParam($param): DateTimeImmutable + { + try { + Assert::stringNotEmpty($param); + + return new DateTimeImmutable($param); + } catch (Throwable $exception) { + return new DateTimeImmutable(); + } + } } diff --git a/libraries/classes/Tracking.php b/libraries/classes/Tracking.php index 9dcbb96669..3507cefa9f 100644 --- a/libraries/classes/Tracking.php +++ b/libraries/classes/Tracking.php @@ -7,6 +7,7 @@ declare(strict_types=1); namespace PhpMyAdmin; +use DateTimeImmutable; use PhpMyAdmin\ConfigStorage\Relation; use PhpMyAdmin\Dbal\ResultInterface; use PhpMyAdmin\Html\Generator; @@ -68,18 +69,20 @@ class Tracking * * @return array filtered entries */ - public function filter(array $data, array $filter_users, string $dateFrom, string $dateTo): array - { - $dateFromTimestamp = strtotime($dateFrom); - $dateToTimestamp = strtotime($dateTo); + public function filter( + array $data, + array $filter_users, + DateTimeImmutable $dateFrom, + DateTimeImmutable $dateTo + ): array { $tmp_entries = []; $id = 0; foreach ($data as $entry) { $timestamp = strtotime($entry['date']); $filtered_user = in_array($entry['username'], $filter_users); if ( - $timestamp >= $dateFromTimestamp - && $timestamp <= $dateToTimestamp + $timestamp >= $dateFrom->getTimestamp() + && $timestamp <= $dateTo->getTimestamp() && (in_array('*', $filter_users) || $filtered_user) ) { $tmp_entries[] = [ @@ -218,8 +221,8 @@ class Tracking string $logType, array $filter_users, string $version, - string $dateFrom, - string $dateTo, + DateTimeImmutable $dateFrom, + DateTimeImmutable $dateTo, string $users ) { $html = '