diff --git a/auth/callback_microsoft.php b/auth/callback_microsoft.php
index c1f00bd..a045b3a 100644
--- a/auth/callback_microsoft.php
+++ b/auth/callback_microsoft.php
@@ -27,6 +27,8 @@ if (empty($_SESSION['user_id']) && $stateUserId) {
$_SESSION['user_email'] = $recoveredUser['email'];
$_SESSION['user_role'] = $recoveredUser['role'];
$_SESSION['is_2fa_verified'] = true;
+ $_SESSION['auth_date'] = date('Y-m-d');
+ $_SESSION['session_expires_at'] = strtotime('today 23:59:59');
issue_remember_token((int)$recoveredUser['id']);
}
} catch (Throwable $e) {
diff --git a/auth/invite.php b/auth/invite.php
index 1e4757c..915d2f1 100644
--- a/auth/invite.php
+++ b/auth/invite.php
@@ -75,12 +75,14 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$db->commit();
- // Start sessie
+ // Start dagsessie (geldig tot 23:59:59)
$_SESSION['user_id'] = $newUserId;
$_SESSION['user_name'] = $name;
$_SESSION['user_email'] = $invite['email'];
$_SESSION['user_role'] = $invite['role'];
$_SESSION['is_2fa_verified'] = true;
+ $_SESSION['auth_date'] = date('Y-m-d');
+ $_SESSION['session_expires_at'] = strtotime('today 23:59:59');
issue_remember_token($newUserId);
unset($_SESSION['invite_totp_secret']);
diff --git a/auth/login.php b/auth/login.php
index 169d050..37d9054 100644
--- a/auth/login.php
+++ b/auth/login.php
@@ -20,6 +20,10 @@ if ($currentUser) {
}
$error = null;
+$infoMessage = null;
+if (isset($_GET['expired'])) {
+ $infoMessage = "Uw dagsessie is om 23:59 beëindigd. Log opnieuw in om een nieuwe werkdag te starten.";
+}
$step = isset($_SESSION['pending_2fa_user_id']) ? 2 : 1;
// Terug naar stap 1
@@ -95,14 +99,16 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
}
if ($isValid) {
- // Volledige login succesvol
+ // Volledige login succesvol (geldig tot 23:59:59 van vandaag)
$_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'] = date('Y-m-d');
+ $_SESSION['session_expires_at'] = strtotime('today 23:59:59');
- // Activeer persistente remember token (30 dagen blijf ingelogd)
+ // Activeer dagspecifieke remember token (verloopt vannacht om 23:59:59)
issue_remember_token((int)$user['id']);
unset($_SESSION['pending_2fa_user_id'], $_SESSION['pending_2fa_user_email'], $_SESSION['pending_2fa_user_name']);
@@ -178,6 +184,13 @@ $pageTitle = "Fociz — Inloggen";
+
+
diff --git a/auth/setup.php b/auth/setup.php
index 91bc969..ffe70d8 100644
--- a/auth/setup.php
+++ b/auth/setup.php
@@ -62,12 +62,14 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$adminId = (int)$db->lastInsertId();
- // Automatische sessie starten
+ // Automatische dagsessie starten (geldig tot 23:59:59)
$_SESSION['user_id'] = $adminId;
$_SESSION['user_name'] = $name;
$_SESSION['user_email'] = $email;
$_SESSION['user_role'] = 'ADMIN';
$_SESSION['is_2fa_verified'] = true;
+ $_SESSION['auth_date'] = date('Y-m-d');
+ $_SESSION['session_expires_at'] = strtotime('today 23:59:59');
issue_remember_token($adminId);
unset($_SESSION['setup_totp_secret']);
diff --git a/includes/auth.php b/includes/auth.php
index 92aa78e..f0b7364 100644
--- a/includes/auth.php
+++ b/includes/auth.php
@@ -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;
diff --git a/includes/header.php b/includes/header.php
index c4e2e79..41a6d02 100644
--- a/includes/header.php
+++ b/includes/header.php
@@ -57,6 +57,21 @@ $currentUserTheme = !empty($currentUser['id']) ? get_user_theme((int)$currentUse
+
+
diff --git a/planner.php b/planner.php
index 3e1b310..abf417c 100644
--- a/planner.php
+++ b/planner.php
@@ -260,19 +260,19 @@ for ($h = $startHour; $h <= $endHour; $h++) {
-
+
-
+
= htmlspecialchars($formattedSelectedDate) ?>
- VANDAAG
+
- GEKOZEN DAG
+ GEKOZEN DAG
-
+
Dagplanning & Structuur
@@ -280,28 +280,28 @@ for ($h = $startHour; $h <= $endHour; $h++) {
-
-
-
-
-
+
+
+
+
+
+
+
+
+
@@ -336,20 +342,20 @@ for ($h = $startHour; $h <= $endHour; $h++) {
-
+
-
+
Vorige week
-
+
Vandaag
-
+
Volgende week
@@ -357,7 +363,7 @@ for ($h = $startHour; $h <= $endHour; $h++) {
-
+
Week = $weekNumber ?> • = $yearNumber ?>
@@ -373,58 +379,58 @@ for ($h = $startHour; $h <= $endHour; $h++) {
id="jumpDateInput"
value="= htmlspecialchars($selectedDate) ?>"
onchange="if(this.value) window.location.href='planner.php?date=' + this.value;"
- class="bg-slate-50 dark:bg-slate-950 border border-slate-200 dark:border-slate-800 rounded-xl px-3 py-1.5 text-xs text-slate-800 dark:text-slate-200 focus:outline-none focus:ring-2 focus:ring-indigo-500/30 font-medium cursor-pointer"
+ class="bg-slate-50 dark:bg-slate-950 border border-slate-200 dark:border-slate-800 rounded-xl px-3 py-1.5 text-xs text-slate-800 dark:text-slate-200 focus:outline-none focus:ring-2 focus:ring-indigo-500/30 font-medium cursor-pointer shadow-2xs"
>
-