prepare("SELECT \"Admin\" FROM user_permissions WHERE user_id = ?"); $stmt->execute([$_SESSION["user_id"]]); $isAdmin = $stmt->fetchColumn(); if ((int)$isAdmin !== 1) { header("Location: {$g_httpHomePath}"); exit(); } if ($_SERVER["REQUEST_METHOD"] !== "POST") { header("Location: admin_inbox.php"); exit(); } // Admin-Name ermitteln $adminName = trim(($user['first_name'] ?? '') . ' ' . ($user['last_name'] ?? '')); if (empty($adminName)) $adminName = 'Ein Administrator'; $action = $_POST["action"] ?? ''; $pending_id = (int)($_POST["pending_id"] ?? 0); $message_id = (int)($_POST["message_id"] ?? 0); $selectedRoles = $_POST["roles"] ?? []; if (!is_array($selectedRoles)) $selectedRoles = []; if ($pending_id === 0) { header("Location: admin_inbox.php?inbox_status=error"); exit(); } // Pending Registration laden $stmt = $pdo->prepare("SELECT * FROM pending_registrations WHERE id = ? AND status = 'pending'"); $stmt->execute([$pending_id]); $pending = $stmt->fetch(PDO::FETCH_ASSOC); if (!$pending) { header("Location: admin_inbox.php?inbox_status=error"); exit(); } // Rollen-Spalten laden $permissionRoles = []; $rolesResult = $pdo->query("SELECT column_name FROM information_schema.columns WHERE table_name = 'user_permissions' AND table_schema = 'public'"); while ($col = $rolesResult->fetch(PDO::FETCH_ASSOC)) { if (!in_array($col['column_name'], ['p_id', 'user_id'], true)) { $permissionRoles[] = $col['column_name']; } } $loginUrl = "https://" . ($_SERVER['HTTP_HOST'] ?? intranet_env('INTRANET_FQDN')) . "/intranet_repo/projects/authorization/login.php"; if ($action === 'approve') { $pdo->beginTransaction(); try { // Nutzer in user_general_information anlegen $stmt = $pdo->prepare("INSERT INTO user_general_information (mail, first_name, last_name, phone) VALUES (?, ?, ?, ?)"); $stmt->execute([$pending['email'], $pending['first_name'], $pending['last_name'], $pending['phone']]); $newUserId = $pdo->lastInsertId(); if (!$newUserId) { $checkStmt = $pdo->prepare("SELECT user_id FROM user_general_information WHERE mail = ?"); $checkStmt->execute([$pending['email']]); $newUserId = $checkStmt->fetchColumn(); } // Login-Daten anlegen $stmt = $pdo->prepare("INSERT INTO user_login (user_id, password_hash) VALUES (?, ?)"); $stmt->execute([$newUserId, $pending['password_hash']]); // Berechtigungen mit gewählten Rollen anlegen $roleColumns = array_map(function($r) { return '"' . str_replace('"', '""', $r) . '"'; }, $permissionRoles); $columns = array_merge(['"user_id"'], $roleColumns); $placeholders = array_fill(0, count($columns), '?'); $roleValues = []; foreach ($permissionRoles as $role) { $roleValues[] = in_array($role, $selectedRoles, true) ? 1 : 0; } $params = array_merge([(int)$newUserId], $roleValues); $insertSql = "INSERT INTO user_permissions (" . implode(', ', $columns) . ") VALUES (" . implode(', ', $placeholders) . ")"; $stmt = $pdo->prepare($insertSql); $stmt->execute($params); // Pending-Status aktualisieren $stmt = $pdo->prepare("UPDATE pending_registrations SET status = 'approved' WHERE id = ?"); $stmt->execute([$pending_id]); // Inbox-Nachricht als erledigt markieren if ($message_id > 0) { $stmt = $pdo->prepare("UPDATE admin_messages SET status = 'done', processed_at = NOW() WHERE id = ?"); $stmt->execute([$message_id]); } $pdo->commit(); // Zugewiesene Rollen als Text $assignedRoles = !empty($selectedRoles) ? implode(', ', $selectedRoles) : 'Keine besonderen Rollen'; // Mail an den Nutzer $userBetreff = "Registrierung freigeschaltet"; $userNachricht = "Hallo {$pending['first_name']},\n\n"; $userNachricht .= "Ihr Account für das Intranet der NAK Reinickendorf wurde freigeschaltet!\n\n"; $userNachricht .= "Sie können sich ab sofort mit Ihrer E-Mail-Adresse und dem von Ihnen gewählten Passwort anmelden."; send_intranet_mail($pending['email'], $userBetreff, $userNachricht, null, "intranet@nak-reinickendorf.de", "Jetzt anmelden", $loginUrl); // Mail an Admin-Team $adminBetreff = "Registrierung freigegeben: {$pending['first_name']} {$pending['last_name']}"; $adminNachricht = "{$adminName} hat die Registrierung bearbeitet:\n\n"; $adminNachricht .= "Nutzer: {$pending['first_name']} {$pending['last_name']}\n"; $adminNachricht .= "E-Mail: {$pending['email']}\n"; $adminNachricht .= "Aktion: Freigeschaltet\n"; $adminNachricht .= "Zugewiesene Rollen: {$assignedRoles}"; send_admin_team_mail($pdo, $adminBetreff, $adminNachricht); // Systemnachricht im Posteingang $sysSubject = "Nutzer freigeschaltet: {$pending['first_name']} {$pending['last_name']}"; $sysMessage = "{$adminName} hat {$pending['first_name']} {$pending['last_name']} ({$pending['email']}) freigeschaltet.\nZugewiesene Rollen: {$assignedRoles}"; $stmtSys = $pdo->prepare("INSERT INTO admin_messages (type, sender_name, sender_email, subject, message, status, processed_at, created_at) VALUES ('system', ?, ?, ?, ?, 'done', NOW(), NOW())"); $stmtSys->execute([$adminName, $pending['email'], $sysSubject, $sysMessage]); header("Location: admin_inbox.php?inbox_status=approved"); exit(); } catch (Throwable $e) { $pdo->rollBack(); error_log("approve-registration error: " . $e->getMessage()); header("Location: admin_inbox.php?inbox_status=error"); exit(); } } elseif ($action === 'reject') { // Ablehnen $stmt = $pdo->prepare("UPDATE pending_registrations SET status = 'rejected' WHERE id = ?"); $stmt->execute([$pending_id]); // Inbox-Nachricht als erledigt markieren if ($message_id > 0) { $stmt = $pdo->prepare("UPDATE admin_messages SET status = 'done', processed_at = NOW() WHERE id = ?"); $stmt->execute([$message_id]); } // Mail an den Nutzer $userBetreff = "Registrierung abgelehnt"; $userNachricht = "Hallo {$pending['first_name']},\n\n"; $userNachricht .= "Ihre Registrierungsanfrage für das Intranet der NAK Reinickendorf wurde leider abgelehnt.\n\n"; $userNachricht .= "Bei Fragen wenden Sie sich bitte an den Administrator über das Kontaktformular auf der Anmeldeseite."; send_intranet_mail($pending['email'], $userBetreff, $userNachricht); // Mail an Admin-Team $adminBetreff = "Registrierung abgelehnt: {$pending['first_name']} {$pending['last_name']}"; $adminNachricht = "{$adminName} hat die Registrierung bearbeitet:\n\n"; $adminNachricht .= "Nutzer: {$pending['first_name']} {$pending['last_name']}\n"; $adminNachricht .= "E-Mail: {$pending['email']}\n"; $adminNachricht .= "Aktion: Abgelehnt"; send_admin_team_mail($pdo, $adminBetreff, $adminNachricht); // Systemnachricht im Posteingang $sysSubject = "Registrierung abgelehnt: {$pending['first_name']} {$pending['last_name']}"; $sysMessage = "{$adminName} hat die Registrierung von {$pending['first_name']} {$pending['last_name']} ({$pending['email']}) abgelehnt."; $stmtSys = $pdo->prepare("INSERT INTO admin_messages (type, sender_name, sender_email, subject, message, status, processed_at, created_at) VALUES ('system', ?, ?, ?, ?, 'done', NOW(), NOW())"); $stmtSys->execute([$adminName, $pending['email'], $sysSubject, $sysMessage]); header("Location: admin_inbox.php?inbox_status=rejected"); exit(); } header("Location: admin_inbox.php"); exit(); ?>