Der Server schrieb deutsche Sätze an eine Stelle, die niemand liest
„Die Anfrage war so nicht zu gebrauchen" — das ist der Ersatzsatz des
Browsers für eine Ablehnung ohne Begründung. Dabei stand die Begründung
da: „Benutzername darf nicht leer sein, das Passwort braucht mindestens 8
Zeichen." Nur eben in `errors`, und beide Clients lesen `detail`.
Zwei Formen waren betroffen. `Results.ValidationProblem` legt den Satz
unter `errors` ab, `Results.BadRequest(new { fehler = … })` unter
`fehler` — in beiden Fällen kommt er nirgends an. Zusammen 36 Stellen,
darunter jede Zeile, die ich gestern für die Meldungen geschrieben habe.
Dass die Clients `title` und `errors` auslassen, ist dabei richtig: dort
stehen sonst die englischen Prüftexte des Rahmenwerks, und „Not Found" ist
keine Auskunft.
Jetzt eine Form, hinter `Einwand.Bitte` / `.Fehlt` / `.Belegt`. Dass es
drei benannte Türen sind statt eines Aufrufs mit Zahl, hat einen Grund:
man sieht am Wort, ob der Server um eine bessere Eingabe bittet, etwas
nicht findet oder auf etwas Bestehendes stösst.
**Auffallen konnte es nicht**, und das ist der eigentliche Fund. Die
vorhandenen Tests prüften den Rumpf als Zeichenkette — der Satz *stand* ja
drin, nur im falschen Feld. Der neue Test prüft deshalb, in welchem Feld,
und ein Wächter am Quelltext schlägt an, wenn eine der beiden alten Formen
zurückkommt. Er hat beim ersten Lauf gleich eine Stelle gefunden, die mein
Suchmuster übersehen hatte.
Dazu drei Kleinigkeiten, die beim Lesen auffielen:
**Passwörter wurden getrimmt.** Der Dialog schnitt jedem Feld die Ränder
ab, auch dem Passwort — `login.ts` sendet es ungeschoren. Ein Leerzeichen
am Ende, und das angelegte Konto war für immer unbetretbar.
**Beim Einrichten stapelten sich die Fehlerzeilen**, weil `.error`
weggeräumt wurde und `.fehler` entsteht. Drei Fehlversuche, drei rote
Kästen.
**Der Benutzerdialog versprach acht Zeichen und prüfte nichts.** Jetzt
sagt er es selbst, ohne den Umweg über die Leitung.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
7cd48f5528
commit
8e9da1355c
@@ -204,6 +204,12 @@ export function dialog(optionen: {
|
||||
// obwohl man sichtbar etwas geschrieben hat.
|
||||
if (e instanceof HTMLTextAreaElement) { gesammelt.set(name, e.value.trim()); return; }
|
||||
if (!(e instanceof HTMLInputElement)) { gesammelt.set(name, e.wert); return; }
|
||||
// **Ein Passwort wird nicht beschnitten.** Überall sonst sind Ränder
|
||||
// ein Versehen; in einem Passwort sind sie Inhalt. Getrimmt legte der
|
||||
// Verwaltungsdialog ein Konto an, in das sich niemand anmelden konnte —
|
||||
// `login.ts` sendet es ungeschoren, und die beiden Zeichenketten waren
|
||||
// dann verschieden.
|
||||
if (e.type === 'password') { gesammelt.set(name, e.value); return; }
|
||||
gesammelt.set(name, e.type === 'checkbox' ? String(e.checked) : e.value.trim());
|
||||
});
|
||||
|
||||
|
||||
@@ -24,7 +24,16 @@ export function benutzerbereich(): HTMLElement {
|
||||
],
|
||||
bestaetigen: 'Anlegen',
|
||||
tun: async wert => {
|
||||
await benutzerAnlegen(wert('name'), wert('passwort'), wert('admin') === 'true');
|
||||
// **Hier, nicht erst am Server.** Der Dialog bleibt bei einem Wurf offen
|
||||
// und zeigt den Satz; einmal hin und zurück über die Leitung wäre dafür
|
||||
// Verschwendung. Der Server prüft es trotzdem.
|
||||
const name = wert('name').trim();
|
||||
if (name.length === 0) throw new Error('Ohne Namen geht es nicht.');
|
||||
if (wert('passwort').length < 8) {
|
||||
throw new Error('Das Passwort braucht mindestens acht Zeichen.');
|
||||
}
|
||||
|
||||
await benutzerAnlegen(name, wert('passwort'), wert('admin') === 'true');
|
||||
await laden();
|
||||
},
|
||||
});
|
||||
|
||||
@@ -25,7 +25,7 @@ export function einrichtung(fertig: () => void): HTMLElement {
|
||||
karte.append(titel, text, name, passwort, los);
|
||||
|
||||
async function absenden(): Promise<void> {
|
||||
karte.querySelector('.error')?.remove();
|
||||
karte.querySelector('.fehler')?.remove();
|
||||
los.disabled = true;
|
||||
try {
|
||||
await einrichten(name.value.trim(), passwort.value);
|
||||
|
||||
Reference in New Issue
Block a user