From 32f5e780d6290a8addecd10b56f0999703664c44 Mon Sep 17 00:00:00 2001 From: M_Viper Date: Thu, 5 Nov 2026 21:21:52 +0000 Subject: [PATCH] Upload via GUI (452 Dateien) --- DeskHub-Webseite/staff/languages.php | 2 +- DeskHub-Webseite/staff/login.php | 35 +- DeskHub-Webseite/staff/login_log.php | 22 +- DeskHub-Webseite/staff/mail_queue.php | 2 +- DeskHub-Webseite/staff/passkey.php | 73 ++ DeskHub-Webseite/staff/plugins.php | 17 +- DeskHub-Webseite/staff/problems.php | 2 +- DeskHub-Webseite/staff/profile.php | 114 ++ DeskHub-Webseite/staff/recurring_tickets.php | 2 +- DeskHub-Webseite/staff/report_builder.php | 8 +- DeskHub-Webseite/staff/reset_password.php | 5 +- DeskHub-Webseite/staff/roles.php | 146 ++- DeskHub-Webseite/staff/settings.php | 6 + DeskHub-Webseite/staff/site_pages.php | 2 +- DeskHub-Webseite/staff/staff_manage.php | 341 ++++- DeskHub-Webseite/staff/status_page.php | 2 +- .../staff/ticket_merge_search.php | 2 +- DeskHub-Webseite/staff/ticket_rules.php | 2 +- DeskHub-Webseite/staff/ticket_split.php | 2 +- DeskHub-Webseite/staff/ticket_templates.php | 2 +- DeskHub-Webseite/staff/ticket_view.php | 31 +- DeskHub-Webseite/staff/tickets.php | 26 +- DeskHub-Webseite/staff/update.php | 1154 ++++++++++------- 23 files changed, 1397 insertions(+), 601 deletions(-) create mode 100644 DeskHub-Webseite/staff/passkey.php diff --git a/DeskHub-Webseite/staff/languages.php b/DeskHub-Webseite/staff/languages.php index 46d65cd0..9dfbe861 100644 --- a/DeskHub-Webseite/staff/languages.php +++ b/DeskHub-Webseite/staff/languages.php @@ -1,6 +1,6 @@ - - -
+ Mit Passkey anmelden' : ''; + ?> + +
@@ -165,7 +173,24 @@ $displayName = get_setting('display_name', config()['site']['name']); Copyright © – Alle Rechte vorbehalten. + + + + +
+

Von allen Geräten abmelden

+

Beendet alle Anmeldungen in Browsern und in den Apps (Android, Windows-Programm, Chrome-Erweiterung) und stoppt die Push-Benachrichtigungen auf diesen Geräten. Sinnvoll, wenn ein Gerät verloren ging oder Sie sich irgendwo angemeldet gelassen haben. Ihr Passwort bleibt unverändert.

+ +
Angemeldete Apps: +
·
+
+ +
+
+
+
+
+

🛡️ Meine Geräte und Anmeldungen

Von diesen Geräten haben Sie sich schon angemeldet. Meldet sich jemand von einem neuen Gerät oder Ort an, bekommen Sie eine Mail. Ein Gerät, das Sie nicht kennen, können Sie hier entfernen; ändern Sie dann auch Ihr Passwort.

diff --git a/DeskHub-Webseite/staff/recurring_tickets.php b/DeskHub-Webseite/staff/recurring_tickets.php index ebbfcfeb..e2a23ba1 100644 --- a/DeskHub-Webseite/staff/recurring_tickets.php +++ b/DeskHub-Webseite/staff/recurring_tickets.php @@ -1,6 +1,6 @@ query('SELECT department_id FROM recurring_tickets')->fetchAll(PDO::FETCH_COLUMN))); diff --git a/DeskHub-Webseite/staff/report_builder.php b/DeskHub-Webseite/staff/report_builder.php index 31c9834a..7ef4ab3b 100644 --- a/DeskHub-Webseite/staff/report_builder.php +++ b/DeskHub-Webseite/staff/report_builder.php @@ -25,7 +25,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { $cfg = report_clean_config($pdo, $cfgIn); $now = db_now(); $pdo->prepare('INSERT INTO saved_reports (staff_id, name, config, is_shared, created_at, updated_at) VALUES (?,?,?,?,?,?)') - ->execute([$staff['id'], mb_substr($name, 0, 120), json_encode($cfg, JSON_UNESCAPED_UNICODE), !empty($_POST['shared']) ? 1 : 0, $now, $now]); + ->execute([$staff['id'], mb_substr($name, 0, 120), json_encode($cfg, JSON_UNESCAPED_UNICODE), (!empty($_POST['shared']) && has_permission($staff, 'share_views')) ? 1 : 0, $now, $now]); flash('success', 'Bericht gespeichert.'); } redirect('/staff/report_builder.php?' . ltrim((string) ($_POST['return_query'] ?? ''), '?')); @@ -46,7 +46,9 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { $own->execute([$sid]); $sch = $own->fetch(); $mine = $sch && ((int) $sch['staff_id'] === (int) $staff['id'] || $staff['role'] === 'admin'); - if ($action === 'schedule_add') { + if (in_array($action, ['schedule_add'], true) && !has_permission($staff, 'schedule_reports')) { + flash('error', 'Für Berichte per E-Mail fehlt die erforderliche Berechtigung.'); + } elseif ($action === 'schedule_add') { $err = report_schedule_create($pdo, $staff, $_POST); $err ? flash('error', $err) : flash('success', 'Zeitplan angelegt. Der Bericht wird zum nächsten Termin per E-Mail gesendet.'); } elseif (!$mine) { @@ -208,7 +210,7 @@ require __DIR__ . '/_header.php'; - +
diff --git a/DeskHub-Webseite/staff/reset_password.php b/DeskHub-Webseite/staff/reset_password.php index 693012f2..dee67f88 100644 --- a/DeskHub-Webseite/staff/reset_password.php +++ b/DeskHub-Webseite/staff/reset_password.php @@ -25,7 +25,10 @@ if (!$token || !$email) { consume_password_reset('staff', $token); $staffRow = $pdo->prepare('SELECT id FROM staff WHERE LOWER(email) = LOWER(?)'); $staffRow->execute([$email]); - audit_log((int) $staffRow->fetchColumn(), 'Passwort per Reset-Link zurückgesetzt'); + $resetStaffId = (int) $staffRow->fetchColumn(); + audit_log($resetStaffId, 'Passwort per Reset-Link zurückgesetzt'); + // Wer den Link aus der Mail benutzt, hat sich als Besitzer des Postfachs ausgewiesen: Die Anmeldesperre endet damit + if ($resetStaffId > 0) login_guard_unlock($pdo, $resetStaffId, null, 'Sperre aufgehoben: Passwort per Reset-Link zurückgesetzt'); $done = true; } } diff --git a/DeskHub-Webseite/staff/roles.php b/DeskHub-Webseite/staff/roles.php index dd47320a..14435798 100644 --- a/DeskHub-Webseite/staff/roles.php +++ b/DeskHub-Webseite/staff/roles.php @@ -4,23 +4,10 @@ require_once __DIR__ . '/_ui.php'; $staff = require_admin_or_permission('manage_roles'); $pdo = get_db(); -$ticketPermLabels = [ - 'reply_ticket' => 'Tickets beantworten', - 'close_ticket' => 'Tickets schließen/lösen', - 'delete_ticket' => 'Tickets löschen', - 'transfer_ticket' => 'Tickets übertragen (Abteilung ändern)', - 'post_note' => 'Interne Notizen schreiben', - 'assign_ticket' => 'Tickets zuweisen (Mitarbeiter/Team)', - 'manage_canned' => 'Textbausteine verwalten', - 'view_reports' => 'Berichte einsehen', - 'manage_kb' => 'Wissensdatenbank verwalten', - 'create_ticket' => 'Tickets im Namen von Kunden erstellen', -]; -// Feinkörnige Adminportal-Rechte ("Co-Admin") – siehe admin_section_permissions() in functions.php. -// manage_kb steckt bewusst nur oben bei den Ticket-Rechten, nicht doppelt hier. -$adminPermLabels = admin_section_permissions(); -unset($adminPermLabels['manage_kb']); -$permLabels = array_merge($ticketPermLabels, $adminPermLabels); +// Alle Rechte, Gruppen, Beschreibungen und Standardwerte: includes/permissions.php +$catalog = permission_catalog(); +$permLabels = permission_labels(); +$agentDefaults = default_permissions('agent'); $errors = []; @@ -39,8 +26,16 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { if ($dup->fetchColumn() > 0) $errors[] = 'Eine Rolle mit diesem Namen existiert bereits.'; if (!$errors) { $perms = []; + // Wer kein echter Administrator ist, kann keine Rechte vergeben, die er selbst nicht hat (sonst könnte sich ein Co-Admin zum Administrator hochstufen) + $oldPerms = []; + if ($action === 'update') { + $op = $pdo->prepare('SELECT permissions FROM roles WHERE id = ?'); $op->execute([$id]); + $oldPerms = json_decode((string) $op->fetchColumn(), true) ?: []; + } foreach (array_keys($permLabels) as $p) { - $perms[$p] = !empty($_POST['perm_' . $p]); + $want = !empty($_POST['perm_' . $p]); + if ($staff['role'] !== 'admin' && $want && !has_permission($staff, $p)) $want = !empty($oldPerms[$p]); + $perms[$p] = $want; } $json = json_encode($perms); if ($action === 'create') { @@ -58,6 +53,17 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { } } + if ($action === 'seed_defaults') { + if ($staff['role'] !== 'admin') { + flash('error', 'Vordefinierte Rollen anlegen dürfen nur Administratoren.'); + } else { + $made = permission_seed_default_roles($pdo); + if ($made) { audit_log($staff['id'], 'Vordefinierte Rollen angelegt: ' . implode(', ', $made)); flash('success', count($made) . ' Rolle(n) angelegt: ' . implode(', ', $made) . '.'); } + else flash('info', 'Alle vordefinierten Rollen sind schon vorhanden.'); + } + redirect('/staff/roles.php'); + } + if ($action === 'delete') { $id = (int) $_POST['id']; // Mitarbeiter und Abteilungszugriffe auf die Hauptrolle zurücksetzen @@ -74,17 +80,19 @@ $isNew = isset($_GET['new']); $editId = (int) ($_GET['edit'] ?? 0); $showForm = $isNew || $editId || ($errors && in_array($_POST['action'] ?? '', ['create', 'update'], true)); +$presetNames = []; +foreach (permission_presets() as [$__pn, , , $__seed]) if ($__seed) $presetNames[] = mb_strtolower($__pn); $roles = $pdo->query( 'SELECT r.*, (SELECT COUNT(*) FROM staff s WHERE s.role_id = r.id) + (SELECT COUNT(*) FROM staff_department sd WHERE sd.role_id = r.id) AS staff_count FROM roles r ORDER BY r.name' )->fetchAll(); $editRole = null; -$editPerms = array_fill_keys(array_keys($permLabels), false); +$editPerms = $agentDefaults; // neue Rolle: wie ein Standard-Mitarbeiter; fehlende Rechte älterer Rollen gelten mit dem Standardwert if ($editId) { $es = $pdo->prepare('SELECT * FROM roles WHERE id = ?'); $es->execute([$editId]); $editRole = $es->fetch() ?: null; - if ($editRole) $editPerms = array_merge($editPerms, json_decode($editRole['permissions'] ?? '{}', true) ?? []); + if ($editRole) $editPerms = permission_effective(json_decode($editRole['permissions'] ?? '{}', true) ?? []); } if ($_POST && $errors) foreach (array_keys($permLabels) as $p) $editPerms[$p] = !empty($_POST['perm_' . $p]); @@ -123,24 +131,52 @@ require __DIR__ . '/_header.php';
+ +