From 64a7a3bcf003c9188f6c2285a2d1c0c10fa580b6 Mon Sep 17 00:00:00 2001 From: Niek Rabelink Date: Wed, 9 Sep 2026 16:30:11 +0200 Subject: [PATCH] Refactor code structure for improved readability and maintainability --- auth/callback_microsoft.php | 2 + auth/invite.php | 4 +- auth/login.php | 17 ++- auth/setup.php | 4 +- includes/auth.php | 53 ++++++-- includes/header.php | 42 ++++++ planner.php | 246 +++++++++++++++++++----------------- 7 files changed, 235 insertions(+), 133 deletions(-) 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++) {
-
+
-
+
- VANDAAG + VANDAAG - GEKOZEN DAG + GEKOZEN DAG
-

+

Dagplanning & Structuur

@@ -280,28 +280,28 @@ for ($h = $startHour; $h <= $endHour; $h++) {
-
+
Outlook 365 Live - +
- + Koppel Outlook - + Jira: tickets - + Koppel Jira @@ -309,26 +309,32 @@ for ($h = $startHour; $h <= $endHour; $h++) {
- -
- -
- + +
+
+
+ +
+ +
+
+
+ +
@@ -336,20 +342,20 @@ for ($h = $startHour; $h <= $endHour; $h++) {
-
+
- + - + Vandaag - + @@ -357,7 +363,7 @@ for ($h = $startHour; $h <= $endHour; $h++) {
-
+
Week •
@@ -373,58 +379,58 @@ for ($h = $startHour; $h <= $endHour; $h++) { id="jumpDateInput" value="" 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" >
-
+
- + - + Nu
-
- +
+ - +
- -
-
+ +
+
- + Taken - + /
-
+
Agenda - +
@@ -440,75 +446,76 @@ for ($h = $startHour; $h <= $endHour; $h++) {
- -
+ +
-
-
- +
+
+

Focus Modus

-

Pomodoro & geconcentreerd werken

+

Pomodoro werkstation & concentratie

-
- - - +
+ + +
-
-
-
- Actieve focus: - Kies een taak hieronder +
+
+
+ + Doeltaak: + Kies een taak hieronder
-
-
+
+
- -
- -
-
+ +
+

Dagtaken & Prioriteiten - () +

-
-