From 130a43eabcbd4a07cd7305b319e6db9fd4617484 Mon Sep 17 00:00:00 2001 From: Niek Rabelink Date: Thu, 10 Sep 2026 11:27:31 +0200 Subject: [PATCH 1/2] Refactor code structure for improved readability and maintainability --- api/integrations.php | 165 +++++ assets/avatars/avatar-01.svg | 18 + assets/avatars/avatar-02.svg | 22 + assets/avatars/avatar-03.svg | 22 + assets/avatars/avatar-04.svg | 20 + assets/avatars/avatar-05.svg | 18 + assets/avatars/avatar-06.svg | 25 + assets/avatars/avatar-07.svg | 24 + assets/avatars/avatar-08.svg | 20 + assets/avatars/avatar-09.svg | 21 + assets/avatars/avatar-10.svg | 22 + assets/avatars/avatar-11.svg | 19 + assets/avatars/avatar-12.svg | 23 + assets/avatars/avatar-13.svg | 18 + assets/avatars/avatar-14.svg | 27 + assets/avatars/avatar-15.svg | 22 + assets/avatars/avatar-16.svg | 20 + assets/avatars/avatar-17.svg | 18 + assets/avatars/avatar-18.svg | 25 + assets/avatars/avatar-19.svg | 19 + assets/avatars/avatar-20.svg | 20 + assets/avatars/avatar-21.svg | 26 + assets/avatars/avatar-22.svg | 22 + assets/avatars/avatar-23.svg | 19 + assets/avatars/avatar-24.svg | 23 + assets/favicon.ico | 20 + assets/favicon.svg | 21 + auth/forgot-password.php | 2 + auth/invite.php | 2 + auth/login.php | 2 + auth/reset-password.php | 2 + auth/setup.php | 2 + board.php | 7 +- favicon.ico | 20 + favicon.svg | 20 + includes/auth.php | 4 +- includes/header.php | 27 +- includes/integrations/jira.php | 437 +++++++++--- jira.php | 1199 ++++++++++++++++++++++++++++++++ profile.php | 197 +++++- timeline.php | 10 +- users.php | 17 +- 42 files changed, 2545 insertions(+), 122 deletions(-) create mode 100644 assets/avatars/avatar-01.svg create mode 100644 assets/avatars/avatar-02.svg create mode 100644 assets/avatars/avatar-03.svg create mode 100644 assets/avatars/avatar-04.svg create mode 100644 assets/avatars/avatar-05.svg create mode 100644 assets/avatars/avatar-06.svg create mode 100644 assets/avatars/avatar-07.svg create mode 100644 assets/avatars/avatar-08.svg create mode 100644 assets/avatars/avatar-09.svg create mode 100644 assets/avatars/avatar-10.svg create mode 100644 assets/avatars/avatar-11.svg create mode 100644 assets/avatars/avatar-12.svg create mode 100644 assets/avatars/avatar-13.svg create mode 100644 assets/avatars/avatar-14.svg create mode 100644 assets/avatars/avatar-15.svg create mode 100644 assets/avatars/avatar-16.svg create mode 100644 assets/avatars/avatar-17.svg create mode 100644 assets/avatars/avatar-18.svg create mode 100644 assets/avatars/avatar-19.svg create mode 100644 assets/avatars/avatar-20.svg create mode 100644 assets/avatars/avatar-21.svg create mode 100644 assets/avatars/avatar-22.svg create mode 100644 assets/avatars/avatar-23.svg create mode 100644 assets/avatars/avatar-24.svg create mode 100644 assets/favicon.ico create mode 100644 assets/favicon.svg create mode 100644 favicon.ico create mode 100644 favicon.svg create mode 100644 jira.php diff --git a/api/integrations.php b/api/integrations.php index 57aa15e..dd96b69 100644 --- a/api/integrations.php +++ b/api/integrations.php @@ -72,6 +72,171 @@ try { exit; } + // 2b. Jira Dashboard Data Ophalen (Toegewezen + Team issues + Stats) + if ($action === 'get_jira_dashboard') { + $force = !empty($_GET['force']) || !empty($_POST['force']); + $res = jira_get_dashboard_data($user['id'], $force); + echo json_encode($res); + exit; + } + + // 2c. Jira Issue inplannen in Dagplanner + if ($action === 'plan_jira_task') { + $input = json_decode(file_get_contents('php://input'), true) ?: $_POST; + $key = trim($input['key'] ?? ''); + $summary = trim($input['summary'] ?? ''); + $url = trim($input['url'] ?? ''); + $planDate = !empty($input['plan_date']) ? trim($input['plan_date']) : date('Y-m-d'); + $priority = in_array($input['priority'] ?? '', ['P1', 'P2', 'P3']) ? $input['priority'] : 'P2'; + $timeBlockStart = !empty($input['time_block_start']) ? trim($input['time_block_start']) : null; + $timeBlockEnd = !empty($input['time_block_end']) ? trim($input['time_block_end']) : null; + $durationMinutes = !empty($input['duration_minutes']) ? (int)$input['duration_minutes'] : 45; + + if (empty($key) || empty($summary)) { + echo json_encode(['error' => 'Ticket key en titel zijn verplicht']); + exit; + } + + $title = "[{$key}] {$summary}"; + + // Zoek of maak daily plan aan voor deze datum + $stmtPlan = $db->prepare("SELECT id FROM daily_plans WHERE user_id = ? AND plan_date = ?"); + $stmtPlan->execute([$user['id'], $planDate]); + $planId = $stmtPlan->fetchColumn(); + + if (!$planId) { + $stmtCreatePlan = $db->prepare("INSERT INTO daily_plans (user_id, plan_date) VALUES (?, ?)"); + $stmtCreatePlan->execute([$user['id'], $planDate]); + $planId = (int)$db->lastInsertId(); + } + + // Voeg taak toe + $stmt = $db->prepare(" + INSERT INTO tasks (user_id, daily_plan_id, title, priority, time_block_start, time_block_end, duration_minutes, status, source, external_id, external_url) + VALUES (?, ?, ?, ?, ?, ?, ?, 'TODO', 'JIRA', ?, ?) + "); + $stmt->execute([ + $user['id'], + $planId, + $title, + $priority, + $timeBlockStart, + $timeBlockEnd, + $durationMinutes, + $key, + $url + ]); + $taskId = (int)$db->lastInsertId(); + + echo json_encode([ + 'success' => true, + 'task_id' => $taskId, + 'message' => "Ticket {$key} is succesvol ingepland voor " . date('d-m-Y', strtotime($planDate)) . "!", + ]); + exit; + } + + // 2d. Jira Issue toevoegen aan een Kanban Bord kolom + if ($action === 'board_jira_card') { + $input = json_decode(file_get_contents('php://input'), true) ?: $_POST; + $boardId = (int)($input['board_id'] ?? 0); + $laneId = (int)($input['lane_id'] ?? 0); + $key = trim($input['key'] ?? ''); + $summary = trim($input['summary'] ?? ''); + $description = trim($input['description'] ?? ''); + $url = trim($input['url'] ?? ''); + $priority = in_array($input['priority'] ?? '', ['P1', 'P2', 'P3']) ? $input['priority'] : 'P2'; + $color = in_array($input['color'] ?? '', ['yellow', 'blue', 'green', 'purple', 'red', 'pink', 'indigo', 'orange']) ? $input['color'] : 'blue'; + + if (empty($boardId) || empty($laneId) || empty($key) || empty($summary)) { + echo json_encode(['error' => 'Bord, kolom, ticket key en titel zijn verplicht']); + exit; + } + + // Controleer toegang tot bord + $isAdmin = ($user['role'] ?? '') === 'ADMIN'; + if (!$isAdmin) { + $stmtCheck = $db->prepare("SELECT role FROM board_members WHERE board_id = ? AND user_id = ?"); + $stmtCheck->execute([$boardId, $user['id']]); + if (!$stmtCheck->fetchColumn()) { + echo json_encode(['error' => 'Geen toegang tot dit bord']); + exit; + } + } + + // Controleer of lane bij bord hoort + $stmtLane = $db->prepare("SELECT id FROM board_lanes WHERE id = ? AND board_id = ?"); + $stmtLane->execute([$laneId, $boardId]); + if (!$stmtLane->fetchColumn()) { + echo json_encode(['error' => 'Kolom hoort niet bij dit bord']); + exit; + } + + $title = "[{$key}] {$summary}"; + $descFull = trim(($url ? "🔗 Jira: {$url}\n\n" : "") . $description); + + $maxPos = (int)$db->query("SELECT COALESCE(MAX(position), -1) FROM board_cards WHERE lane_id = {$laneId}")->fetchColumn(); + + $stmt = $db->prepare(" + INSERT INTO board_cards (board_id, lane_id, title, description, assignee_id, priority, color, position, created_by_id) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) + "); + $stmt->execute([ + $boardId, + $laneId, + $title, + $descFull, + $user['id'], + $priority, + $color, + $maxPos + 1, + $user['id'] + ]); + $cardId = (int)$db->lastInsertId(); + + echo json_encode([ + 'success' => true, + 'card_id' => $cardId, + 'message' => "Ticket {$key} is succesvol als kaart op het bord geplaatst!", + ]); + exit; + } + + // 2e. Beschikbare borden en kolommen ophalen voor selectiedialoog + if ($action === 'get_boards_and_lanes') { + $isAdmin = ($user['role'] ?? '') === 'ADMIN'; + if ($isAdmin) { + $boards = $db->query("SELECT id, title FROM boards WHERE is_archived = 0 ORDER BY id ASC")->fetchAll(); + } else { + $stmt = $db->prepare(" + SELECT b.id, b.title + FROM boards b + JOIN board_members bm ON b.id = bm.board_id + WHERE bm.user_id = ? AND b.is_archived = 0 + ORDER BY b.id ASC + "); + $stmt->execute([$user['id']]); + $boards = $stmt->fetchAll(); + } + + $boardIds = array_column($boards, 'id'); + $lanesByBoard = []; + if (!empty($boardIds)) { + $inClause = implode(',', array_map('intval', $boardIds)); + $lanes = $db->query("SELECT id, board_id, title, color FROM board_lanes WHERE board_id IN ({$inClause}) ORDER BY position ASC")->fetchAll(); + foreach ($lanes as $lane) { + $lanesByBoard[$lane['board_id']][] = $lane; + } + } + + foreach ($boards as &$b) { + $b['lanes'] = $lanesByBoard[$b['id']] ?? []; + } + + echo json_encode(['success' => true, 'boards' => $boards]); + exit; + } + // 3. Outlook Agenda Afspraken Ophalen if ($action === 'get_outlook_events') { $date = $_GET['date'] ?? date('Y-m-d'); diff --git a/assets/avatars/avatar-01.svg b/assets/avatars/avatar-01.svg new file mode 100644 index 0000000..224692b --- /dev/null +++ b/assets/avatars/avatar-01.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/assets/avatars/avatar-02.svg b/assets/avatars/avatar-02.svg new file mode 100644 index 0000000..d4b9bf2 --- /dev/null +++ b/assets/avatars/avatar-02.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/avatars/avatar-03.svg b/assets/avatars/avatar-03.svg new file mode 100644 index 0000000..684089b --- /dev/null +++ b/assets/avatars/avatar-03.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/avatars/avatar-04.svg b/assets/avatars/avatar-04.svg new file mode 100644 index 0000000..8fc7bf5 --- /dev/null +++ b/assets/avatars/avatar-04.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/assets/avatars/avatar-05.svg b/assets/avatars/avatar-05.svg new file mode 100644 index 0000000..5acb03f --- /dev/null +++ b/assets/avatars/avatar-05.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/assets/avatars/avatar-06.svg b/assets/avatars/avatar-06.svg new file mode 100644 index 0000000..66025a4 --- /dev/null +++ b/assets/avatars/avatar-06.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/avatars/avatar-07.svg b/assets/avatars/avatar-07.svg new file mode 100644 index 0000000..8ca3bcc --- /dev/null +++ b/assets/avatars/avatar-07.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/avatars/avatar-08.svg b/assets/avatars/avatar-08.svg new file mode 100644 index 0000000..8cd0bb9 --- /dev/null +++ b/assets/avatars/avatar-08.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/assets/avatars/avatar-09.svg b/assets/avatars/avatar-09.svg new file mode 100644 index 0000000..8a4a163 --- /dev/null +++ b/assets/avatars/avatar-09.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/avatars/avatar-10.svg b/assets/avatars/avatar-10.svg new file mode 100644 index 0000000..81bb3b2 --- /dev/null +++ b/assets/avatars/avatar-10.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/avatars/avatar-11.svg b/assets/avatars/avatar-11.svg new file mode 100644 index 0000000..fe7cb1d --- /dev/null +++ b/assets/avatars/avatar-11.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/assets/avatars/avatar-12.svg b/assets/avatars/avatar-12.svg new file mode 100644 index 0000000..5deec67 --- /dev/null +++ b/assets/avatars/avatar-12.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/avatars/avatar-13.svg b/assets/avatars/avatar-13.svg new file mode 100644 index 0000000..87ed632 --- /dev/null +++ b/assets/avatars/avatar-13.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/assets/avatars/avatar-14.svg b/assets/avatars/avatar-14.svg new file mode 100644 index 0000000..e99eab5 --- /dev/null +++ b/assets/avatars/avatar-14.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/avatars/avatar-15.svg b/assets/avatars/avatar-15.svg new file mode 100644 index 0000000..2366585 --- /dev/null +++ b/assets/avatars/avatar-15.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/avatars/avatar-16.svg b/assets/avatars/avatar-16.svg new file mode 100644 index 0000000..60c5cc8 --- /dev/null +++ b/assets/avatars/avatar-16.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/assets/avatars/avatar-17.svg b/assets/avatars/avatar-17.svg new file mode 100644 index 0000000..096d5a2 --- /dev/null +++ b/assets/avatars/avatar-17.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/assets/avatars/avatar-18.svg b/assets/avatars/avatar-18.svg new file mode 100644 index 0000000..dc64b6d --- /dev/null +++ b/assets/avatars/avatar-18.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/avatars/avatar-19.svg b/assets/avatars/avatar-19.svg new file mode 100644 index 0000000..a4011a1 --- /dev/null +++ b/assets/avatars/avatar-19.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/assets/avatars/avatar-20.svg b/assets/avatars/avatar-20.svg new file mode 100644 index 0000000..eb8b3df --- /dev/null +++ b/assets/avatars/avatar-20.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/assets/avatars/avatar-21.svg b/assets/avatars/avatar-21.svg new file mode 100644 index 0000000..73d2cbd --- /dev/null +++ b/assets/avatars/avatar-21.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/avatars/avatar-22.svg b/assets/avatars/avatar-22.svg new file mode 100644 index 0000000..4760bb4 --- /dev/null +++ b/assets/avatars/avatar-22.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/avatars/avatar-23.svg b/assets/avatars/avatar-23.svg new file mode 100644 index 0000000..7fe9aac --- /dev/null +++ b/assets/avatars/avatar-23.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/assets/avatars/avatar-24.svg b/assets/avatars/avatar-24.svg new file mode 100644 index 0000000..25bd777 --- /dev/null +++ b/assets/avatars/avatar-24.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/favicon.ico b/assets/favicon.ico new file mode 100644 index 0000000..3b05a9e --- /dev/null +++ b/assets/favicon.ico @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/assets/favicon.svg b/assets/favicon.svg new file mode 100644 index 0000000..8314b41 --- /dev/null +++ b/assets/favicon.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/auth/forgot-password.php b/auth/forgot-password.php index 335dbd9..23de8b3 100644 --- a/auth/forgot-password.php +++ b/auth/forgot-password.php @@ -75,6 +75,8 @@ $pageTitle = "Fociz — Wachtwoord Vergeten"; <?= htmlspecialchars($pageTitle) ?> + + + + + diff --git a/profile.php b/profile.php index 8ad60ad..0002967 100644 --- a/profile.php +++ b/profile.php @@ -185,6 +185,86 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { $messageType = 'success'; } } + + // 8. Standaard avatar kiezen uit bibliotheek + elseif ($action === 'select_preset_avatar') { + $preset = trim($_POST['avatar_preset'] ?? ''); + if (preg_match('/^\/assets\/avatars\/avatar-(0[1-9]|1[0-9]|2[0-4])\.svg$/', $preset)) { + $stmtUp = $db->prepare("UPDATE users SET avatar_url = ? WHERE id = ?"); + $stmtUp->execute([$preset, $userId]); + $_SESSION['user_avatar_url'] = $preset; + $user['avatar_url'] = $preset; + $message = "Uw avatar is succesvol bijgewerkt!"; + $messageType = 'success'; + } else { + $message = "Ongeldige avatar geselecteerd."; + $messageType = 'error'; + } + } + + // 9. Eigen profielfoto uploaden + elseif ($action === 'upload_custom_avatar') { + if (!isset($_FILES['avatar_file']) || $_FILES['avatar_file']['error'] !== UPLOAD_ERR_OK) { + $message = "Selecteer een geldige afbeelding om te uploaden."; + $messageType = 'error'; + } else { + $file = $_FILES['avatar_file']; + $maxSize = 4 * 1024 * 1024; // 4MB + if ($file['size'] > $maxSize) { + $message = "De afbeelding is te groot (maximaal 4MB toegestaan)."; + $messageType = 'error'; + } else { + $allowedTypes = ['image/jpeg', 'image/png', 'image/webp', 'image/gif']; + $finfo = finfo_open(FILEINFO_MIME_TYPE); + $mime = finfo_file($finfo, $file['tmp_name']); + finfo_close($finfo); + + if (!in_array($mime, $allowedTypes)) { + $message = "Alleen JPG, PNG, WebP of GIF afbeeldingen zijn toegestaan."; + $messageType = 'error'; + } else { + $ext = match($mime) { + 'image/jpeg' => 'jpg', + 'image/png' => 'png', + 'image/webp' => 'webp', + 'image/gif' => 'gif', + default => 'jpg' + }; + + $uploadDir = __DIR__ . '/assets/uploads/avatars'; + if (!is_dir($uploadDir)) { + @mkdir($uploadDir, 0755, true); + } + + $filename = "avatar_{$userId}_" . time() . "_" . bin2hex(random_bytes(4)) . ".{$ext}"; + $targetPath = $uploadDir . '/' . $filename; + + if (move_uploaded_file($file['tmp_name'], $targetPath)) { + $webPath = "/assets/uploads/avatars/{$filename}"; + $stmtUp = $db->prepare("UPDATE users SET avatar_url = ? WHERE id = ?"); + $stmtUp->execute([$webPath, $userId]); + $_SESSION['user_avatar_url'] = $webPath; + $user['avatar_url'] = $webPath; + $message = "Uw profielfoto is succesvol geüpload en ingesteld!"; + $messageType = 'success'; + } else { + $message = "Er is een fout opgetreden bij het verplaatsen van het geüploade bestand."; + $messageType = 'error'; + } + } + } + } + } + + // 10. Avatar verwijderen + elseif ($action === 'remove_avatar') { + $stmtUp = $db->prepare("UPDATE users SET avatar_url = NULL WHERE id = ?"); + $stmtUp->execute([$userId]); + unset($_SESSION['user_avatar_url']); + $user['avatar_url'] = null; + $message = "Uw avatar is teruggezet naar de standaard weergave met uw initialen."; + $messageType = 'success'; + } } // Actuele gegevens ophalen @@ -228,10 +308,14 @@ require_once __DIR__ . '/includes/header.php';
-
-
- -
+
+ + Avatar + +
+ +
+
@@ -419,6 +503,100 @@ require_once __DIR__ . '/includes/header.php';
+ +
+
+
+
+ +
+
+
+

Profielfoto & Avatar

+ + + +
+

Kies een mini-avatar uit de 24 stijlvolle karakters of upload een eigen afbeelding.

+
+
+ + +
+ + +
+ +
+ +
+ +
+
+

+ + Kies een Karakter (24 Mini Avatars) +

+ Klik om direct toe te passen +
+ +
+ +
+ + + +
+ +
+
+ + +
+

+ + Eigen Foto Uploaden +

+ +
+ + +
+
+ +
+ +

JPG, PNG, WebP of GIF (max. 4MB)

+ + +
+ + +
+
+
+
+
@@ -911,6 +1089,17 @@ function toggleJiraToken() { if (window.lucide) lucide.createIcons(); } +function previewUploadAvatar(input) { + if (input.files && input.files[0]) { + const file = input.files[0]; + const nameEl = document.getElementById('uploadFileName'); + if (nameEl) { + nameEl.textContent = '📄 ' + file.name + ' (' + Math.round(file.size / 1024) + ' KB)'; + nameEl.classList.remove('hidden'); + } + } +} + // Sync banner status met browser permissie & activeer actuele thema kaart document.addEventListener('DOMContentLoaded', () => { // Initialiseer geselecteerde thema-kaart diff --git a/timeline.php b/timeline.php index e6945e9..8206987 100644 --- a/timeline.php +++ b/timeline.php @@ -690,11 +690,11 @@ function renderTimeline() {
${dateBadge} - ${card.assignee_name ? ` -
- ${card.assignee_name.charAt(0).toUpperCase()} -
- ` : ''} + ${card.assignee_name ? ( + card.assignee_avatar + ? `` + : `
${card.assignee_name.charAt(0).toUpperCase()}
` + ) : ''}
`; workContainer.appendChild(leftItem); diff --git a/users.php b/users.php index 070d13b..a4100aa 100644 --- a/users.php +++ b/users.php @@ -205,8 +205,21 @@ require_once __DIR__ . '/includes/header.php'; -
-
+
+
+ + Avatar + +
+ +
+ +
+
+
+
+
+
-- 2.52.0 From ffc824f27cafcd5c33ec97e529610a53b6ce5753 Mon Sep 17 00:00:00 2001 From: Niek Rabelink Date: Thu, 10 Sep 2026 12:49:37 +0200 Subject: [PATCH 2/2] Improve error handling and feedback for password reset functionality --- auth/forgot-password.php | 17 +++++++++++++---- config/config.php | 2 +- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/auth/forgot-password.php b/auth/forgot-password.php index 23de8b3..8e36f08 100644 --- a/auth/forgot-password.php +++ b/auth/forgot-password.php @@ -53,13 +53,22 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { // Verstuur herstelmail via de nieuwe FocizMailer $mailResult = FocizMailer::sendPasswordResetEmail($user['email'], $user['name'], $resetUrl); if (!$mailResult['success']) { - error_log("Fout bij verzenden wachtwoordherstel mail naar {$email}: " . ($mailResult['error'] ?? 'Onbekend')); + $errMsg = $mailResult['error'] ?? 'Mailserver fout'; + error_log("Fout bij verzenden wachtwoordherstel mail naar {$email}: {$errMsg}"); + $error = "De herstelmail kon niet worden verzonden via de mailserver: " . htmlspecialchars($errMsg); + } else { + $submitted = true; + } + } else { + // In development omgeving geven we directe diagnostische feedback + if (defined('APP_ENV') && APP_ENV === 'development') { + $error = "Er is geen Fociz account gevonden met het e-mailadres '{$email}'. Controleer of dit e-mailadres correct is ingevoerd."; + } else { + // Anti-enumeratie op productie: toon altijd succes + $submitted = true; } } - // Anti-enumeratie: Toon altijd succes ongeacht of het e-mailadres bestaat - $submitted = true; - } catch (Throwable $e) { error_log("Wachtwoord vergeten fout: " . $e->getMessage()); $error = "Er is een technische fout opgetreden. Probeer het over enkele ogenblikken opnieuw."; diff --git a/config/config.php b/config/config.php index 127691e..fd30565 100644 --- a/config/config.php +++ b/config/config.php @@ -136,7 +136,7 @@ define('SMTP_PORT', (int)fociz_env('SMTP_PORT', 587)); define('SMTP_USER', fociz_env('SMTP_USER', 'info@fociz.nl')); define('SMTP_PASS', fociz_env('SMTP_PASS', '6swpQSBg5uWFmjar7F6a')); define('SMTP_SECURE', fociz_env('SMTP_SECURE', 'tls')); // 'tls' (STARTTLS port 587) of 'ssl' (port 465) -define('SMTP_FROM_EMAIL', fociz_env('SMTP_FROM_EMAIL', 'no-reply@fociz.nl')); +define('SMTP_FROM_EMAIL', fociz_env('SMTP_FROM_EMAIL', 'info@fociz.nl')); define('SMTP_FROM_NAME', fociz_env('SMTP_FROM_NAME', 'Fociz')); define('SMTP_REPLY_TO', fociz_env('SMTP_REPLY_TO', 'info@fociz.nl')); -- 2.52.0