Files
urlshort-qr-gen/templates/profile/show.php
T
florian.wildeandClaude Opus 5 7f52613821 feat(admin): Verwaltung fuer Benutzer, Gruppen und das eigene Konto
Setzt die Rechte aus dem vorigen Commit in den Oberflaechen um und
ergaenzt die fehlenden Verwaltungsseiten.

Neu:
- /admin/users  - Konten anlegen, Rolle und Sperre setzen, Passwort
  zuruecksetzen, Gruppenzuordnung je Konto
- /admin/groups - Gruppen anlegen und umbenennen, Mitglieder samt
  Rolle pflegen, zugeordnete Domains einsehen
- /admin/profile - eigenes Konto: Gruppenzugehoerigkeit ansehen und
  das Passwort aendern. Das fehlte bisher vollstaendig, auch fuer
  den einen Administrator.

Domains sind jetzt Administratorsache, weil dort die Gruppe zugewiesen
wird. Kurzlinks, Statistik und QR-Codes richten sich nach der Gruppe:
ein fremder Kurzlink antwortet mit 404 (seine Existenz geht den
Aufrufer nichts an), ein sichtbarer ohne Schreibrecht mit 403.

Geschlossene Luecke: /admin/uploads/{file} pruefte bisher nur, ob
ueberhaupt jemand angemeldet ist. Da alle Logos in einem gemeinsamen
Verzeichnis liegen, war der Dateiname die einzige Huerde. Ausgeliefert
wird jetzt nur noch, was laut Datenbank zu einem Kurzlink aus einer
Gruppe des Aufrufers gehoert.

Die Navigation blendet aus, wofuer die Rechte fehlen - das ist
Bedienkomfort, kein Zugriffsschutz: die Routen pruefen unabhaengig
davon noch einmal.

Der Setup-Assistent legt das erste Konto als Administrator an und
traegt es gleich als Editor der Gruppe "Standard" ein. Ohne das
koennte es zwar verwalten, aber selbst keine Kurzlinks anlegen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-14 12:03:20 +02:00

93 lines
3.8 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* Eigenes Konto: Zugehoerigkeit ansehen, Passwort aendern.
*
* @var array<string,mixed>|null $user
* @var string $roleLabel
* @var bool $isEmergency
* @var list<array<string,mixed>> $groups
* @var array<string,string> $errors
* @var int $minLength
* @var App\Security\Csrf $csrf
*/
use App\Security\Role;
?>
<div class="page-head">
<div>
<h1>Mein Konto</h1>
<p class="muted mono"><?= $e($user['username'] ?? '') ?></p>
</div>
</div>
<div class="card">
<h2>Zugehörigkeit</h2>
<p class="muted small">Rolle: <strong><?= $e($roleLabel) ?></strong></p>
<?php if ($isEmergency): ?>
<p class="muted">Dies ist der Notfallzugang aus der <code>.env</code>. Er hat volle
Administratorrechte und ist an keine Gruppe gebunden.</p>
<?php elseif ($groups === []): ?>
<p class="muted">Sie sind noch in keiner Gruppe. Ohne Gruppe sind keine Kurzlinks sichtbar –
eine Administratorin oder ein Administrator kann Sie hinzufügen.</p>
<?php else: ?>
<ul class="plain">
<?php foreach ($groups as $group): ?>
<li>
<strong><?= $e($group['name']) ?></strong>
<span class="muted small"><?= $e(Role::groupLabel($group['group_role'])) ?></span>
</li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
</div>
<div class="card card--form">
<h2>Passwort ändern</h2>
<?php if ($isEmergency): ?>
<p class="muted">Das Passwort dieses Zugangs steht als Hash in der <code>.env</code>
(<code>ADMIN_PASSWORD_HASH</code>) und lässt sich nur dort ändern.</p>
<?php else: ?>
<form method="post" action="<?= $e($url('/admin/profile/password')) ?>" class="form">
<?= $csrf->field() ?>
<div class="field <?= isset($errors['current_password']) ? 'field--error' : '' ?>">
<label for="current_password">Aktuelles Passwort <span class="req">*</span></label>
<input type="password" id="current_password" name="current_password" required
autocomplete="current-password">
<?php if (isset($errors['current_password'])): ?>
<p class="field__error"><?= $e($errors['current_password']) ?></p>
<?php endif; ?>
</div>
<div class="field <?= isset($errors['password']) ? 'field--error' : '' ?>">
<label for="password">Neues Passwort <span class="req">*</span></label>
<input type="password" id="password" name="password" required minlength="<?= (int) $minLength ?>"
autocomplete="new-password">
<p class="field__hint">Mindestens <?= (int) $minLength ?> Zeichen. Eine lange Passphrase
ist besser als kurze Sonderzeichenakrobatik.</p>
<?php if (isset($errors['password'])): ?>
<p class="field__error"><?= $e($errors['password']) ?></p>
<?php endif; ?>
</div>
<div class="field <?= isset($errors['password_confirm']) ? 'field--error' : '' ?>">
<label for="password_confirm">Wiederholung <span class="req">*</span></label>
<input type="password" id="password_confirm" name="password_confirm" required
autocomplete="new-password">
<?php if (isset($errors['password_confirm'])): ?>
<p class="field__error"><?= $e($errors['password_confirm']) ?></p>
<?php endif; ?>
</div>
<p class="field__hint">Nach der Änderung werden alle anderen Sitzungen dieses Kontos abgemeldet.</p>
<div class="form__actions">
<button type="submit" class="btn btn--primary">Passwort ändern</button>
</div>
</form>
<?php endif; ?>
</div>