Passwoerter verdeckt, Kontobereich mit eigenem Passwortwechsel

Zwei berechtigte Rueckmeldungen von Florian:

1. In der Benutzerverwaltung standen die Passwortfelder auf type='text',
   das Passwort war also im Klartext lesbar - vor fremden Augen und in
   jeder Bildschirmuebertragung. Alle Passwortfelder nutzen jetzt ein
   gemeinsames PasswordInput: verdeckt als Voreinstellung, mit Auge zum
   Aufdecken. Weil ein Administrator das Passwort weitergeben muss, gibt es
   daneben einen Generator fuer ein zufaelliges, vorlesbares Passwort in
   Vierergruppen.

2. Es gab keinen Kontobereich. Neu ist /konto mit Profil, den eigenen
   Gruppen samt Rollenerklaerung, Passwortwechsel und Abmelden. Im
   Kopfbereich fuehrt ein Namenskuerzel dorthin. Ist die Anmeldung
   ausgeschaltet, steht dort 'Ohne Anmeldung' und die Seite erklaert, wie
   man sie einschaltet - vorher suchte man den Abmelden-Knopf vergeblich.

Dabei eine echte Luecke geschlossen: ein Benutzer konnte sein Passwort gar
nicht selbst aendern, nur ein Administrator konnte es setzen. Der Wechsel
verlangt das bisherige Passwort, lehnt ein identisches ab und beendet alle
anderen Sitzungen - die eigene bleibt bestehen.

Nebenbei: die Betriebsart-Knoepfe im Generator haben jetzt data-mode. Ueber
aria-pressed waren sie nicht mehr eindeutig, seit das Passwortfeld einen
eigenen Umschalter hat.

Geprueft: 63 Pruefungen fuer Anmeldung inkl. Passwortwechsel und Konto,
dazu 280 bestehende bei ausgeschalteter Anmeldung.
This commit is contained in:
Florian Wilde
2026-08-14 13:46:21 +02:00
parent 2a80f15e20
commit 6b2baa66c5
11 changed files with 533 additions and 29 deletions
+4 -1
View File
@@ -9,6 +9,7 @@ import {
TextArea,
TextInput,
} from "@/components/ui";
import { PasswordInput } from "@/components/password-input";
import type { QrFormProps } from "@/components/qr-forms/types";
import { parseCoordinates } from "@/lib/qr/encoding";
import {
@@ -193,10 +194,12 @@ export function WifiForm({ value, onChange, error, disabled }: QrFormProps) {
{security !== "nopass" ? (
<Field label="Passwort" htmlFor="wifi-password">
<TextInput
<PasswordInput
id="wifi-password"
autoComplete="off"
spellCheck={false}
revealLabel="WLAN-Passwort anzeigen"
hideLabel="WLAN-Passwort verbergen"
value={text(value, "passwort")}
disabled={disabled}
onChange={(event) =>