223 lines
12 KiB
PHP
223 lines
12 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
require_once dirname(__DIR__, 3) . '/src/App/bootstrap.php';
|
|
|
|
use App\ConfigLoader;
|
|
use App\RegistrationAccess;
|
|
use App\RegistrationService;
|
|
|
|
session_start();
|
|
|
|
$projectRoot = dirname(__DIR__, 3);
|
|
$config = ConfigLoader::load($projectRoot, 'registration');
|
|
$registration = new RegistrationService($projectRoot, $config);
|
|
$access = new RegistrationAccess($config);
|
|
|
|
if (!$access->canManage()) {
|
|
http_response_code(403);
|
|
echo 'Kein Zugriff auf Registrierungsfreigaben.';
|
|
exit;
|
|
}
|
|
|
|
$csrfToken = (string) ($_SESSION['registration_admin_token'] ?? '');
|
|
|
|
if ($csrfToken === '') {
|
|
$csrfToken = bin2hex(random_bytes(16));
|
|
$_SESSION['registration_admin_token'] = $csrfToken;
|
|
}
|
|
|
|
$currentUser = is_array($_SESSION['desktop_auth']['user'] ?? null) ? $_SESSION['desktop_auth']['user'] : [];
|
|
$reviewer = (string) ($currentUser['username'] ?? 'unbekannt');
|
|
$selectedId = trim((string) ($_GET['id'] ?? $_POST['id'] ?? ''));
|
|
$errors = [];
|
|
$notice = null;
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
$postedToken = (string) ($_POST['csrf_token'] ?? '');
|
|
|
|
if ($postedToken === '' || !hash_equals($csrfToken, $postedToken)) {
|
|
$errors[] = 'Die Formularprüfung ist fehlgeschlagen.';
|
|
} else {
|
|
$action = (string) ($_POST['action'] ?? '');
|
|
|
|
if ($action === 'approve') {
|
|
$result = $registration->approve($selectedId, array_map('strval', $_POST), $reviewer);
|
|
|
|
if (($result['success'] ?? false) !== true) {
|
|
$errors = array_values(array_map('strval', (array) ($result['errors'] ?? [])));
|
|
} else {
|
|
$notice = 'Registrierung freigegeben. Ein LDIF-Entwurf für den inaktiven Benutzer wurde erzeugt.';
|
|
}
|
|
} elseif ($action === 'reject') {
|
|
$result = $registration->reject($selectedId, (string) ($_POST['reject_reason'] ?? ''), $reviewer);
|
|
|
|
if (($result['success'] ?? false) !== true) {
|
|
$errors = array_values(array_map('strval', (array) ($result['errors'] ?? [])));
|
|
} else {
|
|
$notice = 'Registrierung abgelehnt.';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$requests = $registration->all();
|
|
$selected = $selectedId !== '' ? $registration->find($selectedId) : ($requests[0] ?? null);
|
|
$provisioning = is_array($selected['provisioning'] ?? null) ? $selected['provisioning'] : [];
|
|
?><!DOCTYPE html>
|
|
<html lang="de">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>Registrierungsfreigaben</title>
|
|
<link rel="stylesheet" href="/assets/auth/login.css">
|
|
</head>
|
|
<body>
|
|
<main class="login-shell">
|
|
<section class="login-panel login-panel-admin">
|
|
<div class="login-panel-top">
|
|
<p class="login-kicker">Kusche.Berlin</p>
|
|
<h1>Registrierungsfreigaben</h1>
|
|
<p class="login-copy">Anfragen werden erst nach Prüfung für LDAP und NAS vorbereitet. Die Freigabe erzeugt aktuell einen LDIF-Entwurf für einen inaktiven Benutzer.</p>
|
|
</div>
|
|
|
|
<?php if ($notice !== null): ?>
|
|
<div class="login-notice login-notice-success">
|
|
<strong>Aktion abgeschlossen</strong>
|
|
<p><?= htmlspecialchars($notice, ENT_QUOTES) ?></p>
|
|
</div>
|
|
<?php endif; ?>
|
|
|
|
<?php if ($errors !== []): ?>
|
|
<div class="login-notice login-notice-error">
|
|
<strong>Bitte prüfen</strong>
|
|
<ul class="login-list">
|
|
<?php foreach ($errors as $error): ?>
|
|
<li><?= htmlspecialchars($error, ENT_QUOTES) ?></li>
|
|
<?php endforeach; ?>
|
|
</ul>
|
|
</div>
|
|
<?php endif; ?>
|
|
|
|
<div class="admin-layout">
|
|
<aside class="admin-sidebar">
|
|
<h2>Offene Vorgänge</h2>
|
|
<div class="admin-request-list">
|
|
<?php foreach ($requests as $request): ?>
|
|
<a class="admin-request-card<?= (($selected['id'] ?? '') === ($request['id'] ?? '')) ? ' is-active' : '' ?>" href="/admin/registrations/?id=<?= urlencode((string) ($request['id'] ?? '')) ?>">
|
|
<strong><?= htmlspecialchars((string) ($request['username'] ?? ''), ENT_QUOTES) ?></strong>
|
|
<span><?= htmlspecialchars((string) ($request['email'] ?? ''), ENT_QUOTES) ?></span>
|
|
<span class="admin-status admin-status-<?= htmlspecialchars((string) ($request['status'] ?? 'pending'), ENT_QUOTES) ?>">
|
|
<?= htmlspecialchars((string) ($request['status'] ?? 'pending'), ENT_QUOTES) ?>
|
|
</span>
|
|
</a>
|
|
<?php endforeach; ?>
|
|
</div>
|
|
</aside>
|
|
|
|
<section class="admin-detail">
|
|
<?php if (!is_array($selected)): ?>
|
|
<div class="login-notice login-notice-info">
|
|
<strong>Keine Anfragen vorhanden</strong>
|
|
<p>Es liegt aktuell keine Registrierungsanfrage vor.</p>
|
|
</div>
|
|
<?php else: ?>
|
|
<div class="admin-summary">
|
|
<h2><?= htmlspecialchars((string) ($selected['display_name'] ?? $selected['username'] ?? ''), ENT_QUOTES) ?></h2>
|
|
<p>Status: <strong><?= htmlspecialchars((string) ($selected['status'] ?? 'pending'), ENT_QUOTES) ?></strong></p>
|
|
<p>Benutzername: <?= htmlspecialchars((string) ($selected['username'] ?? ''), ENT_QUOTES) ?></p>
|
|
<p>E-Mail: <?= htmlspecialchars((string) ($selected['email'] ?? ''), ENT_QUOTES) ?></p>
|
|
<p>Angelegt: <?= htmlspecialchars((string) ($selected['created_at'] ?? ''), ENT_QUOTES) ?></p>
|
|
<?php if (((string) ($selected['note'] ?? '')) !== ''): ?>
|
|
<p>Zusatzinfo: <?= nl2br(htmlspecialchars((string) ($selected['note'] ?? ''), ENT_QUOTES)) ?></p>
|
|
<?php endif; ?>
|
|
</div>
|
|
|
|
<form class="login-form" method="post" action="/admin/registrations">
|
|
<input type="hidden" name="csrf_token" value="<?= htmlspecialchars($csrfToken, ENT_QUOTES) ?>">
|
|
<input type="hidden" name="id" value="<?= htmlspecialchars((string) ($selected['id'] ?? ''), ENT_QUOTES) ?>">
|
|
|
|
<div class="login-form-grid">
|
|
<label class="login-field">
|
|
<span>uidNumber</span>
|
|
<input type="text" name="uid_number" value="<?= htmlspecialchars((string) ($provisioning['uid_number'] ?? ''), ENT_QUOTES) ?>" required>
|
|
</label>
|
|
|
|
<label class="login-field">
|
|
<span>gidNumber</span>
|
|
<input type="text" name="gid_number" value="<?= htmlspecialchars((string) ($provisioning['gid_number'] ?? ''), ENT_QUOTES) ?>" required>
|
|
</label>
|
|
|
|
<label class="login-field">
|
|
<span>homeDirectory</span>
|
|
<input type="text" name="home_directory" value="<?= htmlspecialchars((string) ($provisioning['home_directory'] ?? ('/home/' . ($selected['username'] ?? ''))), ENT_QUOTES) ?>" required>
|
|
</label>
|
|
|
|
<label class="login-field">
|
|
<span>loginShell</span>
|
|
<input type="text" name="login_shell" value="<?= htmlspecialchars((string) ($provisioning['login_shell'] ?? '/bin/sh'), ENT_QUOTES) ?>">
|
|
</label>
|
|
|
|
<label class="login-field">
|
|
<span>Display Name</span>
|
|
<input type="text" name="display_name" value="<?= htmlspecialchars((string) ($provisioning['display_name'] ?? $selected['display_name'] ?? ''), ENT_QUOTES) ?>">
|
|
</label>
|
|
|
|
<label class="login-field">
|
|
<span>CN</span>
|
|
<input type="text" name="cn" value="<?= htmlspecialchars((string) ($provisioning['cn'] ?? $selected['display_name'] ?? $selected['username'] ?? ''), ENT_QUOTES) ?>">
|
|
</label>
|
|
|
|
<label class="login-field">
|
|
<span>GECOS</span>
|
|
<input type="text" name="gecos" value="<?= htmlspecialchars((string) ($provisioning['gecos'] ?? $selected['display_name'] ?? ''), ENT_QUOTES) ?>">
|
|
</label>
|
|
|
|
<label class="login-field">
|
|
<span>apple-generateduid</span>
|
|
<input type="text" name="apple_generateduid" value="<?= htmlspecialchars((string) ($provisioning['apple_generateduid'] ?? ''), ENT_QUOTES) ?>">
|
|
</label>
|
|
|
|
<label class="login-field">
|
|
<span>sambaSID</span>
|
|
<input type="text" name="samba_sid" value="<?= htmlspecialchars((string) ($provisioning['samba_sid'] ?? ''), ENT_QUOTES) ?>">
|
|
</label>
|
|
|
|
<label class="login-field login-field-span-2">
|
|
<span>memberOf als CSV</span>
|
|
<input type="text" name="member_of_csv" value="<?= htmlspecialchars((string) ($provisioning['member_of_csv'] ?? 'cn=generaluser,cn=groups,dc=nas,dc=kusche,dc=berlin'), ENT_QUOTES) ?>">
|
|
</label>
|
|
</div>
|
|
|
|
<label class="login-field">
|
|
<span>Admin-Notiz</span>
|
|
<textarea name="admin_note" rows="4"><?= htmlspecialchars((string) ($provisioning['admin_note'] ?? ''), ENT_QUOTES) ?></textarea>
|
|
</label>
|
|
|
|
<div class="login-actions">
|
|
<button class="login-button login-button-primary" type="submit" name="action" value="approve">Freigeben und LDIF erzeugen</button>
|
|
<button class="login-button login-button-danger" type="submit" name="action" value="reject">Ablehnen</button>
|
|
</div>
|
|
|
|
<label class="login-field">
|
|
<span>Ablehnungsgrund</span>
|
|
<textarea name="reject_reason" rows="3" placeholder="Nur erforderlich, wenn du auf Ablehnen klickst."></textarea>
|
|
</label>
|
|
</form>
|
|
|
|
<?php if (((string) ($provisioning['ldif_path'] ?? '')) !== '' && is_file((string) $provisioning['ldif_path'])): ?>
|
|
<div class="login-notice login-notice-info">
|
|
<strong>LDIF-Entwurf</strong>
|
|
<p><?= htmlspecialchars((string) ($provisioning['ldif_path'] ?? ''), ENT_QUOTES) ?></p>
|
|
<pre class="login-pre"><?= htmlspecialchars((string) file_get_contents((string) $provisioning['ldif_path']), ENT_QUOTES) ?></pre>
|
|
</div>
|
|
<?php endif; ?>
|
|
<?php endif; ?>
|
|
</section>
|
|
</div>
|
|
</section>
|
|
</main>
|
|
</body>
|
|
</html>
|