PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ] ); $currentUserId = (int)$_SESSION['user_id']; $loggedIn = true; $errors = []; $successMessage = ''; $pageTitle = 'Benutzerverwaltung'; $headerIntroPre = 'Administration'; $headerIntroTitle = 'Benutzerkonten verwalten'; $headerIntroSub = 'Konten freischalten, deaktivieren und Rollen verwalten'; function h(?string $value): string { return htmlspecialchars((string)$value, ENT_QUOTES, 'UTF-8'); } function redirectToAdminUsers(): void { header('Location: admin_users.php'); exit; } function sendActivationNotification(string $username, string $email, ?string $displayName): void { $subject = 'Dein SkyView-Konto wurde freigeschaltet'; $recipientName = $displayName !== null && $displayName !== '' ? $displayName : $username; $messageLines = [ 'Hallo ' . $recipientName . ',', '', 'dein Benutzerkonto bei SkyView wurde soeben freigeschaltet.', 'Du kannst dich ab sofort mit deinen Zugangsdaten anmelden.', '', 'Benutzername: ' . $username, '', 'Viele Gruesse', 'Astronomiemuseum der Sternwarte Sonneberg', ]; $headers = [ 'MIME-Version: 1.0', 'Content-Type: text/plain; charset=UTF-8', 'From: noreply@astronomiemuseum.de', 'Reply-To: tm@astronomiemuseum.de', ]; try { mail( $email, $subject, implode(PHP_EOL, $messageLines), implode("\r\n", $headers) ); } catch (Throwable $e) { error_log('Activation notification mail failed: ' . $e->getMessage()); } } if (empty($_SESSION['admin_users_csrf'])) { $_SESSION['admin_users_csrf'] = bin2hex(random_bytes(16)); } $stmtCurrentUser = $pdo->prepare(" SELECT `id`, `username`, `display_name`, `role`, `is_active` FROM `app_users` WHERE `id` = :id LIMIT 1 "); $stmtCurrentUser->execute([':id' => $currentUserId]); $currentUser = $stmtCurrentUser->fetch(); if ( !$currentUser || $currentUser['role'] !== 'admin' || (int)$currentUser['is_active'] !== 1 ) { $_SESSION = []; session_destroy(); header('Location: login.php'); exit; } if (isset($_SESSION['admin_users_flash_success'])) { $successMessage = (string)$_SESSION['admin_users_flash_success']; unset($_SESSION['admin_users_flash_success']); } if (isset($_SESSION['admin_users_flash_errors']) && is_array($_SESSION['admin_users_flash_errors'])) { $errors = array_values($_SESSION['admin_users_flash_errors']); unset($_SESSION['admin_users_flash_errors']); } if ($_SERVER['REQUEST_METHOD'] === 'POST') { $action = $_POST['action'] ?? ''; $targetUserId = (int)($_POST['user_id'] ?? 0); $csrfToken = (string)($_POST['csrf_token'] ?? ''); if (!hash_equals($_SESSION['admin_users_csrf'], $csrfToken)) { $errors[] = 'Die Sitzung ist abgelaufen. Bitte die Seite neu laden.'; } $stmtTargetUser = $pdo->prepare(" SELECT `id`, `username`, `email`, `display_name`, `role`, `is_active` FROM `app_users` WHERE `id` = :id LIMIT 1 "); $targetUser = null; if ($targetUserId > 0) { $stmtTargetUser->execute([':id' => $targetUserId]); $targetUser = $stmtTargetUser->fetch(); } if (!$targetUser) { $errors[] = 'Das ausgewählte Benutzerkonto wurde nicht gefunden.'; } if ($targetUser && $targetUserId === $currentUserId && in_array($action, ['deactivate_user', 'change_role', 'delete_user'], true)) { $errors[] = 'Das eigene Administrationskonto kann hier nicht deaktiviert, geloescht oder umgestellt werden.'; } if (empty($errors) && $targetUser) { $stmtActiveAdminCount = $pdo->query(" SELECT COUNT(*) FROM `app_users` WHERE `role` = 'admin' AND `is_active` = 1 "); $activeAdminCount = (int)$stmtActiveAdminCount->fetchColumn(); if ( $action === 'deactivate_user' && $targetUser['role'] === 'admin' && (int)$targetUser['is_active'] === 1 && $activeAdminCount <= 1 ) { $errors[] = 'Der letzte aktive Admin kann nicht deaktiviert werden.'; } if ( $action === 'change_role' && $targetUser['role'] === 'admin' && ($_POST['role'] ?? '') !== 'admin' && (int)$targetUser['is_active'] === 1 && $activeAdminCount <= 1 ) { $errors[] = 'Der letzte aktive Admin kann nicht zur Benutzerrolle herabgestuft werden.'; } if ( $action === 'delete_user' && $targetUser['role'] === 'admin' && (int)$targetUser['is_active'] === 1 && $activeAdminCount <= 1 ) { $errors[] = 'Der letzte aktive Admin kann nicht geloescht werden.'; } } if (empty($errors) && $targetUser) { if ($action === 'activate_user') { $notifyUser = (int)($_POST['notify_user'] ?? 0) === 1; $stmtUpdate = $pdo->prepare(" UPDATE `app_users` SET `is_active` = 1, `updated_at` = NOW() WHERE `id` = :id "); $stmtUpdate->execute([':id' => $targetUserId]); if ($notifyUser) { sendActivationNotification( $targetUser['username'], $targetUser['email'], $targetUser['display_name'] ); $_SESSION['admin_users_flash_success'] = 'Benutzerkonto wurde freigeschaltet und der Benutzer wurde benachrichtigt.'; } else { $_SESSION['admin_users_flash_success'] = 'Benutzerkonto wurde freigeschaltet.'; } redirectToAdminUsers(); } if ($action === 'deactivate_user') { $stmtUpdate = $pdo->prepare(" UPDATE `app_users` SET `is_active` = 0, `updated_at` = NOW() WHERE `id` = :id "); $stmtUpdate->execute([':id' => $targetUserId]); $_SESSION['admin_users_flash_success'] = 'Benutzerkonto wurde deaktiviert.'; redirectToAdminUsers(); } if ($action === 'change_role') { $newRole = (string)($_POST['role'] ?? 'user'); if (!in_array($newRole, ['user', 'admin'], true)) { $errors[] = 'Die gewählte Rolle ist ungültig.'; } else { $stmtUpdate = $pdo->prepare(" UPDATE `app_users` SET `role` = :role, `updated_at` = NOW() WHERE `id` = :id "); $stmtUpdate->execute([ ':role' => $newRole, ':id' => $targetUserId, ]); $_SESSION['admin_users_flash_success'] = 'Die Benutzerrolle wurde aktualisiert.'; redirectToAdminUsers(); } } if ($action === 'delete_user') { $stmtDelete = $pdo->prepare(" DELETE FROM `app_users` WHERE `id` = :id "); $stmtDelete->execute([ ':id' => $targetUserId, ]); $_SESSION['admin_users_flash_success'] = 'Benutzerkonto wurde geloescht. Zugehoerige Standorte und Satelliten wurden automatisch entfernt.'; redirectToAdminUsers(); } } if (!empty($errors)) { $_SESSION['admin_users_flash_errors'] = $errors; redirectToAdminUsers(); } } $stats = [ 'total' => 0, 'active' => 0, 'pending' => 0, 'admins' => 0, ]; $stmtStats = $pdo->query(" SELECT COUNT(*) AS total_users, SUM(CASE WHEN `is_active` = 1 THEN 1 ELSE 0 END) AS active_users, SUM(CASE WHEN `is_active` = 0 THEN 1 ELSE 0 END) AS pending_users, SUM(CASE WHEN `role` = 'admin' THEN 1 ELSE 0 END) AS admin_users FROM `app_users` "); $statsRow = $stmtStats->fetch(); if ($statsRow) { $stats['total'] = (int)$statsRow['total_users']; $stats['active'] = (int)$statsRow['active_users']; $stats['pending'] = (int)$statsRow['pending_users']; $stats['admins'] = (int)$statsRow['admin_users']; } $stmtUsers = $pdo->query(" SELECT `id`, `username`, `email`, `display_name`, `role`, `is_active`, `last_login_at`, `created_at`, `updated_at` FROM `app_users` ORDER BY `is_active` ASC, `role` DESC, `created_at` DESC, `username` ASC "); $users = $stmtUsers->fetchAll(); ?>

Uebersicht

Hier kannst du Benutzerkonten freischalten, deaktivieren, loeschen und zwischen user und admin wechseln.

Gesamt
Aktiv
Warten auf Freischaltung
Admins

Benutzerkonten

Benutzer Status Rolle Registriert Letzter Login Aktionen
Dieses Konto

Benutzer benachrichtigen?

Soll der Benutzer benachrichtigt werden?

Benutzer loeschen?

Soll dieser Benutzer wirklich geloescht werden?