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(); ?>
Hier kannst du Benutzerkonten freischalten, deaktivieren, loeschen und zwischen user und admin wechseln.
= h($successMessage) ?>
| Benutzer | Status | Rolle | Registriert | Letzter Login | Aktionen |
|---|---|---|---|---|---|
|
= h($userRow['display_name'] ?: $userRow['username']) ?>
= h($userRow['username']) ?>
= h($userRow['email']) ?>
Dieses Konto
|
= h($statusLabel) ?> | = h($userRow['role']) ?> | = h($userRow['created_at']) ?> | = h($userRow['last_login_at'] ?: 'Noch nie') ?> |
|