Merge pull request 'Timzone' (#59) from dev into main
Reviewed-on: #59
This commit was merged in pull request #59.
This commit is contained in:
@@ -1453,9 +1453,9 @@ require_once __DIR__ . '/includes/header.php';
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex items-center space-x-2 flex-shrink-0">
|
<div class="flex items-center space-x-2 flex-shrink-0">
|
||||||
<span class="inline-flex items-center px-2.5 py-1 rounded-full text-xs font-semibold bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 border border-emerald-500/20">
|
<span class="inline-flex items-center px-2.5 py-1 rounded-full text-xs font-semibold bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 border border-emerald-500/20" title="Tijdzone: Europe/Amsterdam (UTC+2 in zomertijd / UTC+1 in wintertijd)">
|
||||||
<span class="w-1.5 h-1.5 rounded-full bg-emerald-500 mr-1.5 animate-pulse"></span>
|
<span class="w-1.5 h-1.5 rounded-full bg-emerald-500 mr-1.5 animate-pulse"></span>
|
||||||
Live Audit Logging Actief
|
Live Audit Logging Actief • NL Tijd
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -1464,7 +1464,7 @@ require_once __DIR__ . '/includes/header.php';
|
|||||||
<table class="w-full text-left text-xs text-slate-600 dark:text-slate-300">
|
<table class="w-full text-left text-xs text-slate-600 dark:text-slate-300">
|
||||||
<thead>
|
<thead>
|
||||||
<tr class="border-b border-slate-200 dark:border-slate-800 text-[11px] font-bold uppercase tracking-wider text-slate-400 dark:text-slate-500">
|
<tr class="border-b border-slate-200 dark:border-slate-800 text-[11px] font-bold uppercase tracking-wider text-slate-400 dark:text-slate-500">
|
||||||
<th class="py-3 px-3">Tijdstip</th>
|
<th class="py-3 px-3">Tijdstip (NL)</th>
|
||||||
<th class="py-3 px-3">Gebruiker / Doel</th>
|
<th class="py-3 px-3">Gebruiker / Doel</th>
|
||||||
<th class="py-3 px-3">Actie</th>
|
<th class="py-3 px-3">Actie</th>
|
||||||
<th class="py-3 px-3">IP-adres</th>
|
<th class="py-3 px-3">IP-adres</th>
|
||||||
|
|||||||
+21
-1
@@ -32,6 +32,7 @@ function get_db_connection(): PDO {
|
|||||||
");
|
");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$tzOffset = date('P'); // Dynamische offset conform Europe/Amsterdam (+02:00 in zomertijd, +01:00 in wintertijd)
|
||||||
$options = [
|
$options = [
|
||||||
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
||||||
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
||||||
@@ -41,6 +42,9 @@ function get_db_connection(): PDO {
|
|||||||
if (defined('PDO::MYSQL_ATTR_MULTI_STATEMENTS')) {
|
if (defined('PDO::MYSQL_ATTR_MULTI_STATEMENTS')) {
|
||||||
$options[PDO::MYSQL_ATTR_MULTI_STATEMENTS] = true;
|
$options[PDO::MYSQL_ATTR_MULTI_STATEMENTS] = true;
|
||||||
}
|
}
|
||||||
|
if (defined('PDO::MYSQL_ATTR_INIT_COMMAND')) {
|
||||||
|
$options[PDO::MYSQL_ATTR_INIT_COMMAND] = "SET time_zone = '{$tzOffset}'";
|
||||||
|
}
|
||||||
|
|
||||||
$dsnWithDb = sprintf(
|
$dsnWithDb = sprintf(
|
||||||
'mysql:host=%s;port=%s;dbname=%s;charset=%s',
|
'mysql:host=%s;port=%s;dbname=%s;charset=%s',
|
||||||
@@ -53,6 +57,8 @@ function get_db_connection(): PDO {
|
|||||||
// 2. CHECK: Bestaat de database al?
|
// 2. CHECK: Bestaat de database al?
|
||||||
try {
|
try {
|
||||||
$pdo = new PDO($dsnWithDb, DB_USER, DB_PASS, $options);
|
$pdo = new PDO($dsnWithDb, DB_USER, DB_PASS, $options);
|
||||||
|
// Garandeer dat MariaDB sessietijd 1-op-1 synchroon loopt met PHP tijd (Europe/Amsterdam)
|
||||||
|
$pdo->exec("SET time_zone = '{$tzOffset}'");
|
||||||
ensure_tables_exist($pdo);
|
ensure_tables_exist($pdo);
|
||||||
return $pdo;
|
return $pdo;
|
||||||
|
|
||||||
@@ -70,6 +76,7 @@ function get_db_connection(): PDO {
|
|||||||
));
|
));
|
||||||
|
|
||||||
$pdo = new PDO($dsnWithDb, DB_USER, DB_PASS, $options);
|
$pdo = new PDO($dsnWithDb, DB_USER, DB_PASS, $options);
|
||||||
|
$pdo->exec("SET time_zone = '{$tzOffset}'");
|
||||||
ensure_tables_exist($pdo);
|
ensure_tables_exist($pdo);
|
||||||
return $pdo;
|
return $pdo;
|
||||||
|
|
||||||
@@ -228,8 +235,21 @@ function ensure_tables_exist(PDO $pdo): void {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Zorg dat eerdere audit logs die in UTC (+00:00) zijn weggeschreven worden gesynchroniseerd naar Europe/Amsterdam (+2 uur)
|
||||||
|
try {
|
||||||
|
$stmtCheck = $pdo->query("SELECT setting_value FROM system_settings WHERE setting_key = 'audit_logs_tz_fixed' LIMIT 1");
|
||||||
|
$fixed = $stmtCheck ? $stmtCheck->fetchColumn() : null;
|
||||||
|
if (!$fixed) {
|
||||||
|
// Pas bestaande audit logs eenmalig aan zodat de weergave klopt met de lokale tijd
|
||||||
|
$pdo->exec("UPDATE audit_logs SET created_at = DATE_ADD(created_at, INTERVAL 2 HOUR)");
|
||||||
|
$pdo->prepare("
|
||||||
|
INSERT INTO system_settings (setting_key, setting_value, created_at, updated_at)
|
||||||
|
VALUES ('audit_logs_tz_fixed', '1', NOW(), NOW())
|
||||||
|
ON DUPLICATE KEY UPDATE setting_value = '1', updated_at = NOW()
|
||||||
|
")->execute();
|
||||||
|
}
|
||||||
} catch (Throwable $e) {
|
} catch (Throwable $e) {
|
||||||
// Stil negeren indien tabellen nog in opbouw zijn
|
// Stil negeren indien system_settings tabel nog niet bestaat
|
||||||
}
|
}
|
||||||
} catch (Throwable $e) {
|
} catch (Throwable $e) {
|
||||||
error_log("Fout bij controleren tabellen: " . $e->getMessage());
|
error_log("Fout bij controleren tabellen: " . $e->getMessage());
|
||||||
|
|||||||
+4
-2
@@ -112,9 +112,10 @@ function fociz_log_audit(?int $userId, string $action, string $resourceType = ''
|
|||||||
$statusNormalized = 'SUCCESS';
|
$statusNormalized = 'SUCCESS';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$createdAt = date('Y-m-d H:i:s');
|
||||||
$stmt = $db->prepare("
|
$stmt = $db->prepare("
|
||||||
INSERT INTO audit_logs (user_id, user_email, action, resource_type, resource_id, details, ip_address, user_agent, status, created_at)
|
INSERT INTO audit_logs (user_id, user_email, action, resource_type, resource_id, details, ip_address, user_agent, status, created_at)
|
||||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, NOW())
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||||
");
|
");
|
||||||
$stmt->execute([
|
$stmt->execute([
|
||||||
$userId ?: null,
|
$userId ?: null,
|
||||||
@@ -125,7 +126,8 @@ function fociz_log_audit(?int $userId, string $action, string $resourceType = ''
|
|||||||
$detailsJson,
|
$detailsJson,
|
||||||
$ip,
|
$ip,
|
||||||
$ua,
|
$ua,
|
||||||
$statusNormalized
|
$statusNormalized,
|
||||||
|
$createdAt
|
||||||
]);
|
]);
|
||||||
} catch (Throwable $e) {
|
} catch (Throwable $e) {
|
||||||
// Audit log mag NOOIT de applicatiewerking breken
|
// Audit log mag NOOIT de applicatiewerking breken
|
||||||
|
|||||||
Reference in New Issue
Block a user