189 lines
8.1 KiB
PHP
189 lines
8.1 KiB
PHP
<?php /* Name: approve-registration.php
|
|
Beschreibung: Admin genehmigt oder lehnt eine Registrierungsanfrage ab.
|
|
- Setzt Rollen bei Freischaltung
|
|
- Sendet Mails an Nutzer UND Admins
|
|
POST-Parameter: action (approve/reject), pending_id, message_id, roles[] */
|
|
|
|
require_once $_SERVER['DOCUMENT_ROOT'].'/intranet_repo/general_files/initialise.php';
|
|
require_once $_SERVER['DOCUMENT_ROOT'].'/intranet_repo/general_files/ini/send_mail.php';
|
|
require_once $_SERVER['DOCUMENT_ROOT'].'/intranet_repo/projects/authorization/util/authorization_helpers.php';
|
|
|
|
// Admin-Check
|
|
$stmt = $pdo->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();
|
|
}
|
|
|
|
if (!authorization_csrf_is_valid($_POST['csrf_token'] ?? null)) {
|
|
header("Location: admin_inbox.php?inbox_status=error");
|
|
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();
|
|
?>
|