Skip to content

Commit

Permalink
Refactor $dateFrom and $dateTo to use DateTimeImmutable
Browse files Browse the repository at this point in the history
Uses the DateTimeImmutable object to validate the datetime values of the
$dateFrom and $dateTo variables in the Tracking class.

Signed-off-by: Maurício Meneghini Fauth <mauricio@fauth.dev>
  • Loading branch information
MauricioFauth committed Nov 7, 2022
1 parent d9fcd35 commit a1c8769
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 45 deletions.
33 changes: 27 additions & 6 deletions libraries/classes/Controllers/Table/TrackingController.php
Expand Up @@ -4,6 +4,7 @@

namespace PhpMyAdmin\Controllers\Table;

use DateTimeImmutable;
use PhpMyAdmin\Controllers\AbstractController;
use PhpMyAdmin\DbTableExists;
use PhpMyAdmin\Http\ServerRequest;
Expand All @@ -14,6 +15,8 @@
use PhpMyAdmin\Tracking;
use PhpMyAdmin\Url;
use PhpMyAdmin\Util;
use Throwable;
use Webmozart\Assert\Assert;

use function __;
use function array_map;
Expand Down Expand Up @@ -93,8 +96,8 @@ public function __invoke(ServerRequest $request): void

$logType = $this->validateLogTypeParam($request->getParsedBodyParam('log_type'));

$dateFrom = '';
$dateTo = '';
$dateFrom = null;
$dateTo = null;
$users = '';

// Init vars for tracking report
Expand All @@ -105,16 +108,20 @@ public function __invoke(ServerRequest $request): void
$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(
Expand Down Expand Up @@ -272,4 +279,18 @@ private function validateLogTypeParam($param): string
{
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();
}
}
}
66 changes: 36 additions & 30 deletions libraries/classes/Tracking.php
Expand Up @@ -7,6 +7,7 @@

namespace PhpMyAdmin;

use DateTimeImmutable;
use PhpMyAdmin\ConfigStorage\Relation;
use PhpMyAdmin\Dbal\ResultInterface;
use PhpMyAdmin\Html\Generator;
Expand Down Expand Up @@ -68,18 +69,20 @@ public function __construct(
*
* @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[] = [
Expand Down Expand Up @@ -218,8 +221,8 @@ public function getHtmlForTrackingReport(
string $logType,
array $filter_users,
string $version,
string $dateFrom,
string $dateTo,
DateTimeImmutable $dateFrom,
DateTimeImmutable $dateTo,
string $users
) {
$html = '<h3>' . __('Tracking report')
Expand Down Expand Up @@ -300,8 +303,8 @@ public function getHtmlForTrackingReport(
*/
public function getHtmlForElementsOfTrackingReport(
string $logType,
string $dateFrom,
string $dateTo,
DateTimeImmutable $dateFrom,
DateTimeImmutable $dateTo,
string $users
): array {
$str1 = '<select name="log_type">'
Expand All @@ -316,9 +319,9 @@ public function getHtmlForElementsOfTrackingReport(
. __('Structure and data') . '</option>'
. '</select>';
$str2 = '<input type="text" name="date_from" value="'
. htmlspecialchars($dateFrom) . '" size="19">';
. htmlspecialchars($dateFrom->format('Y-m-d H:i:s')) . '" size="19">';
$str3 = '<input type="text" name="date_to" value="'
. htmlspecialchars($dateTo) . '" size="19">';
. htmlspecialchars($dateTo->format('Y-m-d H:i:s')) . '" size="19">';
$str4 = '<input type="text" name="users" value="'
. htmlspecialchars($users) . '">';
$str5 = '<input type="hidden" name="list_report" value="1">'
Expand Down Expand Up @@ -361,8 +364,8 @@ public function getHtmlForTrackingReportExportForm1(
$str5,
$drop_image_or_text,
string $version,
string $dateFrom,
string $dateTo
DateTimeImmutable $dateFrom,
DateTimeImmutable $dateTo
) {
$ddlog_count = 0;

Expand Down Expand Up @@ -436,8 +439,8 @@ public function getHtmlForTrackingReportExportForm2(
$str5,
string $logType,
string $version,
string $dateFrom,
string $dateTo,
DateTimeImmutable $dateFrom,
DateTimeImmutable $dateTo,
string $users
) {
$html = '<form method="post" action="' . Url::getFromRoute('/table/tracking') . '">';
Expand All @@ -461,8 +464,8 @@ public function getHtmlForTrackingReportExportForm2(
'report' => 'true',
'version' => $version,
'log_type' => $logType,
'date_from' => $dateFrom,
'date_to' => $dateTo,
'date_from' => $dateFrom->format('Y-m-d H:i:s'),
'date_to' => $dateTo->format('Y-m-d H:i:s'),
'users' => $users,
'report_export' => 'true',
]);
Expand Down Expand Up @@ -504,8 +507,8 @@ public function getHtmlForDataManipulationStatements(
$ddlog_count,
$drop_image_or_text,
string $version,
string $dateFrom,
string $dateTo
DateTimeImmutable $dateFrom,
DateTimeImmutable $dateTo
) {
// no need for the second returned parameter
[$html] = $this->getHtmlForDataStatements(
Expand Down Expand Up @@ -541,8 +544,8 @@ public function getHtmlForDataDefinitionStatements(
array $url_params,
$drop_image_or_text,
string $version,
string $dateFrom,
string $dateTo
DateTimeImmutable $dateFrom,
DateTimeImmutable $dateTo
) {
[$html, $line_number] = $this->getHtmlForDataStatements(
$data,
Expand Down Expand Up @@ -588,18 +591,16 @@ private function getHtmlForDataStatements(
$lineNumber,
$tableId,
string $version,
string $dateFrom,
string $dateTo
DateTimeImmutable $dateFrom,
DateTimeImmutable $dateTo
) {
$dateFromTimestamp = strtotime($dateFrom);
$dateToTimestamp = strtotime($dateTo);
$offset = $lineNumber;
$entries = [];
foreach ($data[$whichLog] as $entry) {
$timestamp = strtotime($entry['date']);
if (
$timestamp >= $dateFromTimestamp
&& $timestamp <= $dateToTimestamp
$timestamp >= $dateFrom->getTimestamp()
&& $timestamp <= $dateTo->getTimestamp()
&& (in_array('*', $filterUsers)
|| in_array($entry['username'], $filterUsers))
) {
Expand Down Expand Up @@ -1062,8 +1063,13 @@ public function createTrackingForMultipleTables(string $db, array $selected, str
*
* @return array
*/
public function getEntries(array $data, array $filter_users, string $logType, string $dateFrom, string $dateTo)
{
public function getEntries(
array $data,
array $filter_users,
string $logType,
DateTimeImmutable $dateFrom,
DateTimeImmutable $dateTo
) {
$entries = [];
// Filtering data definition statements
if ($logType === 'schema' || $logType === 'schema_and_data') {
Expand Down
24 changes: 15 additions & 9 deletions test/classes/TrackingTest.php
Expand Up @@ -4,6 +4,7 @@

namespace PhpMyAdmin\Tests;

use DateTimeImmutable;
use PhpMyAdmin\ConfigStorage\Relation;
use PhpMyAdmin\ConfigStorage\RelationParameters;
use PhpMyAdmin\SqlQueryForm;
Expand Down Expand Up @@ -77,7 +78,12 @@ public function testFilter(): void
];
$filter_users = ['username1'];

$ret = $this->tracking->filter($data, $filter_users, '2010-01-01 12:34:56', '2020-01-01 12:34:56');
$ret = $this->tracking->filter(
$data,
$filter_users,
new DateTimeImmutable('2010-01-01 12:34:56'),
new DateTimeImmutable('2020-01-01 12:34:56')
);

$this->assertEquals('username1', $ret[0]['username']);
$this->assertEquals('statement1', $ret[0]['statement']);
Expand Down Expand Up @@ -280,8 +286,8 @@ public function testGetHtmlForTrackingReportr(): void
'schema_and_data',
$filter_users,
'10',
'2022-11-03 22:15:24',
'2022-11-04 22:15:24',
new DateTimeImmutable('2022-11-03 22:15:24'),
new DateTimeImmutable('2022-11-04 22:15:24'),
'users'
);

Expand Down Expand Up @@ -354,8 +360,8 @@ public function testGetHtmlForDataManipulationStatements(): void
$ddlog_count,
$drop_image_or_text,
'10',
'2010-01-01 12:34:56',
'2020-01-01 12:34:56'
new DateTimeImmutable('2010-01-01 12:34:56'),
new DateTimeImmutable('2020-01-01 12:34:56')
);

$this->assertStringContainsString(
Expand Down Expand Up @@ -404,8 +410,8 @@ public function testGetHtmlForDataDefinitionStatements(): void
$url_params,
$drop_image_or_text,
'10',
'2010-01-01 12:34:56',
'2020-01-01 12:34:56'
new DateTimeImmutable('2010-01-01 12:34:56'),
new DateTimeImmutable('2020-01-01 12:34:56')
);

$this->assertStringContainsString(
Expand Down Expand Up @@ -572,8 +578,8 @@ public function testGetEntries(): void
$data,
$filter_users,
'schema',
'2010-01-01 12:34:56',
'2020-01-01 12:34:56'
new DateTimeImmutable('2010-01-01 12:34:56'),
new DateTimeImmutable('2020-01-01 12:34:56')
);
$this->assertEquals('username3', $entries[0]['username']);
$this->assertEquals('statement1', $entries[0]['statement']);
Expand Down

0 comments on commit a1c8769

Please sign in to comment.