Refactor code structure for improved readability and maintainability
This commit is contained in:
+42
-11
@@ -30,15 +30,17 @@ function is_https_request(): bool {
|
||||
|
||||
function start_secure_session(): void {
|
||||
if (session_status() === PHP_SESSION_NONE) {
|
||||
// Zorg voor een ruime sessieduur (30 dagen)
|
||||
ini_set('session.gc_maxlifetime', '2592000');
|
||||
ini_set('session.cookie_lifetime', '2592000');
|
||||
// Dagsessie: verloopt iedere nacht om 23:59:59 (blijft niet meerdere dagen staan)
|
||||
$secondsUntilMidnight = max(60, strtotime('today 23:59:59') - time());
|
||||
|
||||
ini_set('session.gc_maxlifetime', (string)$secondsUntilMidnight);
|
||||
ini_set('session.cookie_lifetime', (string)$secondsUntilMidnight);
|
||||
ini_set('session.use_strict_mode', '1');
|
||||
ini_set('session.use_only_cookies', '1');
|
||||
|
||||
$isSecure = is_https_request();
|
||||
session_set_cookie_params([
|
||||
'lifetime' => 30 * 24 * 60 * 60, // 30 dagen
|
||||
'lifetime' => $secondsUntilMidnight, // Verloopt vannacht om 23:59:59
|
||||
'path' => '/',
|
||||
'domain' => '',
|
||||
'secure' => $isSecure,
|
||||
@@ -117,12 +119,14 @@ function ensure_theme_column(PDO $db): void {
|
||||
}
|
||||
|
||||
/**
|
||||
* Genereert en bewaart een persistente 'Onthoud mij' token in MariaDB en plaatst een veilige cookie
|
||||
* Genereert en bewaart een dagspecifieke login token in MariaDB en plaatst een veilige cookie.
|
||||
* Verloopt altijd dezelfde nacht om 23:59:59 zodat sessies niet meerdere dagen blijven staan.
|
||||
*/
|
||||
function issue_remember_token(int $userId): string {
|
||||
$rawToken = bin2hex(random_bytes(32));
|
||||
$tokenHash = hash('sha256', $rawToken);
|
||||
$expiresAt = date('Y-m-d H:i:s', time() + (30 * 86400)); // 30 dagen geldig
|
||||
$midnightTs = strtotime('today 23:59:59');
|
||||
$expiresAt = date('Y-m-d 23:59:59', $midnightTs);
|
||||
|
||||
$db = get_db_connection();
|
||||
ensure_remember_token_columns($db);
|
||||
@@ -132,7 +136,7 @@ function issue_remember_token(int $userId): string {
|
||||
|
||||
$isSecure = is_https_request();
|
||||
setcookie('fociz_remember', $rawToken, [
|
||||
'expires' => time() + (30 * 86400),
|
||||
'expires' => $midnightTs, // Verloopt vannacht om 23:59:59
|
||||
'path' => '/',
|
||||
'secure' => $isSecure,
|
||||
'httponly' => true,
|
||||
@@ -158,11 +162,33 @@ function clear_remember_cookie(): void {
|
||||
|
||||
/**
|
||||
* Haalt de huidige ingelogde gebruiker op uit de database.
|
||||
* Herstelt automatisch de sessie als een geldige 'fociz_remember' cookie aanwezig is.
|
||||
* Garandeert dat de sessie strikt om 23:59:59 gereset wordt en nooit meerdere dagen blijft staan.
|
||||
*/
|
||||
function get_logged_in_user(): ?array {
|
||||
start_secure_session();
|
||||
|
||||
$today = date('Y-m-d');
|
||||
$now = time();
|
||||
|
||||
// Controleer of de sessie van een eerdere dag is of voorbij 23:59:59
|
||||
if (!empty($_SESSION['auth_date']) && $_SESSION['auth_date'] !== $today) {
|
||||
$_SESSION = [];
|
||||
clear_remember_cookie();
|
||||
if (session_status() === PHP_SESSION_ACTIVE) {
|
||||
@session_regenerate_id(true);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!empty($_SESSION['session_expires_at']) && $now > (int)$_SESSION['session_expires_at']) {
|
||||
$_SESSION = [];
|
||||
clear_remember_cookie();
|
||||
if (session_status() === PHP_SESSION_ACTIVE) {
|
||||
@session_regenerate_id(true);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
$db = get_db_connection();
|
||||
ensure_remember_token_columns($db);
|
||||
|
||||
@@ -172,13 +198,16 @@ function get_logged_in_user(): ?array {
|
||||
$stmt->execute([$_SESSION['user_id']]);
|
||||
$user = $stmt->fetch();
|
||||
if ($user) {
|
||||
$_SESSION['auth_date'] = $today;
|
||||
$_SESSION['session_expires_at'] = strtotime('today 23:59:59');
|
||||
return $user;
|
||||
}
|
||||
// Gebruiker bestaat niet meer in database
|
||||
$_SESSION = [];
|
||||
clear_remember_cookie();
|
||||
}
|
||||
|
||||
// 2. Controleer persistente 'remember me' cookie (voorkomt ongewenst uitloggen bij refresh of herstart)
|
||||
// 2. Controleer dagspecifieke cookie (uitsluitend geldig voor vandaag tot 23:59:59)
|
||||
if (!empty($_COOKIE['fociz_remember'])) {
|
||||
$rawToken = trim($_COOKIE['fociz_remember']);
|
||||
$tokenHash = hash('sha256', $rawToken);
|
||||
@@ -192,14 +221,16 @@ function get_logged_in_user(): ?array {
|
||||
$user = $stmt->fetch();
|
||||
|
||||
if ($user) {
|
||||
// Herstel volledige PHP sessie
|
||||
// Herstel PHP sessie voor de huidige werkdag
|
||||
$_SESSION['user_id'] = $user['id'];
|
||||
$_SESSION['user_name'] = $user['name'];
|
||||
$_SESSION['user_email'] = $user['email'];
|
||||
$_SESSION['user_role'] = $user['role'];
|
||||
$_SESSION['is_2fa_verified'] = true;
|
||||
$_SESSION['auth_date'] = $today;
|
||||
$_SESSION['session_expires_at'] = strtotime('today 23:59:59');
|
||||
|
||||
// Verleng direct de geldigheid van de remember token voor nog eens 30 dagen
|
||||
// Verleng uitsluitend tot 23:59:59 van vandaag
|
||||
issue_remember_token((int)$user['id']);
|
||||
|
||||
return $user;
|
||||
|
||||
@@ -57,6 +57,21 @@ $currentUserTheme = !empty($currentUser['id']) ? get_user_theme((int)$currentUse
|
||||
</script>
|
||||
<!-- Lucide Icons -->
|
||||
<script src="https://unpkg.com/lucide@latest"></script>
|
||||
<!-- Dagsessie Expiratie Watchdog: reset iedere nacht om 23:59:59 -->
|
||||
<script>
|
||||
(function() {
|
||||
try {
|
||||
const now = new Date();
|
||||
const midnight = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 23, 59, 59, 999);
|
||||
const msUntilMidnight = midnight.getTime() - now.getTime();
|
||||
if (msUntilMidnight > 0) {
|
||||
setTimeout(function() {
|
||||
window.location.href = '/auth/login.php?expired=1';
|
||||
}, msUntilMidnight);
|
||||
}
|
||||
} catch(e) {}
|
||||
})();
|
||||
</script>
|
||||
<style>
|
||||
html.dark body {
|
||||
background-color: #0c0f17;
|
||||
@@ -77,6 +92,33 @@ $currentUserTheme = !empty($currentUser['id']) ? get_user_theme((int)$currentUse
|
||||
html:not(.dark) ::-webkit-scrollbar-track { background: #f8fafc; }
|
||||
html:not(.dark) ::-webkit-scrollbar-thumb { background: #cbd5e1; border-radius: 4px; }
|
||||
html:not(.dark) ::-webkit-scrollbar-thumb:hover { background: #94a3b8; }
|
||||
|
||||
/* Modern Block & Card Design System */
|
||||
.fociz-card {
|
||||
background: rgba(255, 255, 255, 0.95);
|
||||
border: 1px solid rgba(226, 232, 240, 0.9);
|
||||
box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.04), 0 1px 2px -1px rgba(0, 0, 0, 0.04);
|
||||
border-radius: 1rem;
|
||||
backdrop-filter: blur(12px);
|
||||
transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1);
|
||||
}
|
||||
html.dark .fociz-card {
|
||||
background: rgba(17, 22, 34, 0.88);
|
||||
border: 1px solid rgba(30, 41, 59, 0.7);
|
||||
box-shadow: 0 4px 20px -2px rgba(0, 0, 0, 0.35);
|
||||
}
|
||||
.fociz-card-interactive {
|
||||
transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1);
|
||||
}
|
||||
.fociz-card-interactive:hover {
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.08), 0 8px 10px -6px rgba(0, 0, 0, 0.06);
|
||||
border-color: rgba(99, 102, 241, 0.4);
|
||||
}
|
||||
html.dark .fociz-card-interactive:hover {
|
||||
box-shadow: 0 12px 28px -5px rgba(0, 0, 0, 0.5), 0 0 20px rgba(99, 102, 241, 0.15);
|
||||
border-color: rgba(99, 102, 241, 0.5);
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body class="min-h-screen flex flex-col antialiased selection:bg-indigo-500 selection:text-white transition-colors duration-150">
|
||||
|
||||
Reference in New Issue
Block a user