DogFather konnte einen zweiten DogFather nicht mehr herabstufen

Gefunden beim Durchsehen der schnellen Pruefungen: pruef-haus-trennung
stand auf 60 ok / 6 Fehler. Drei Ursachen, eine davon ein echter
Rueckschritt von gestern.

--- 1. DER RUECKSCHRITT ---------------------------------------------

In darfRolleAendern stand seit gestern:

  if (person.rolle === "admin") return ziel.rolle !== "admin";

Das macht aus "DogFather ist nicht mehr VERGEBBAR" ein "an einem
DogFather ist nichts mehr zu aendern". Ein zweiter Zugang liess sich
damit nie wieder zuruecksetzen -- er waere fuer immer DogFather
geblieben. Die Pruefung sagte es woertlich: "solange es zwei gibt,
darf einer wechseln (403)".

Die beiden echten Gefahren haengen woanders und bleiben unberuehrt:
Niemand KANN 'admin' vergeben, und der LETZTE DogFather laesst sich
nicht herabstufen.

--- 2. ZWEI SCHLOESSER FUER DIESELBE TUER ---------------------------

Ich hatte gestern `rollenZumAendern` mit 403 VOR die vorhandene
Pruefung gesetzt, die mit 400 "Unbekannte Rolle." antwortet. Damit war
die Luecke wieder offen, vor der der Kommentar vom 17.09. direkt
daneben warnt: Zwei verschiedene Antworten -- "gibt es nicht" gegen
"darfst du nicht" -- verraten beim Durchprobieren, WELCHE Rollen
existieren.

Jetzt eine Regel an einer Stelle. `darfAnlegen` ist dort raus, weil
Vergeben und Anlegen seit gestern verschiedene Dinge sind. Gemessen:

  admin   anlegen = aendern (sieben Rollen)
  spicy   anlegen = aendern (vier)
  hand    anlegen = —        aendern = modi, gast
  manager anlegen = creator  aendern = —

Und die eigene Zeile bekommt jetzt 400 mit einem Satz statt 403:
Es ist keine Rechtefrage, sondern eine unsinnige Bitte.

--- 3. DREI ERWARTUNGEN, DIE AELTER WAREN ALS DIE REGEL --------------

Die Pruefung verlangte 403, wo seit dem 17.09. 400 richtig ist --
ihre Zeile stammt vom 10.09., sieben Tage aelter als die Regel. Und
sie verlangte 404 fuer "die rechte Hand vergibt keine Rolle", was bis
vorgestern stimmte.

Dabei fiel auf, dass NICHTS geprueft hat, ob die rechte Hand ihre neue
Faehigkeit ueberhaupt ausueben kann -- nur, dass sie es nicht darf.
Eine Pruefung, die nur das Verbotene misst, laesst offen, ob das
Erlaubte geht. Jetzt beide Richtungen:

  an einer anderen rechten Hand aendert sie nichts (403)
  und an DogFather erst recht nicht (403)
  einen Modi macht sie sehr wohl zur Community (200)
  und es steht so in der Datenbank (gast)
  eine zweite rechte Hand ernennt sie nicht (400)

Nebenbei: `unbekannte_kachel` (gestern eingefuehrt) hatte keinen Satz
in meldung.js -- die Kennung waere woertlich auf dem Bildschirm
gelandet. pruef-meldungen hatte es gemeldet.

Und ein Absturz beim Bauen: `const anlegen = await hole(...)` weiter
unten im selben Block verdeckt die gleichnamige Funktion im GANZEN
Block, auch oberhalb seiner eigenen Zeile.

pruef-haus-trennung: 70 ok, 0 Fehler (vorher 60/6).
Dazu gruen: rollen-anlegen 11/0, personen-loeschen 40/0,
rechte-umstellen 46/0, verteilen 11/0, meldungen 8/0.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-20 23:13:27 +02:00
co-authored by Claude Opus 5
parent 445ea88f2b
commit 67a0eb8717
4 changed files with 114 additions and 9 deletions
+32 -4
View File
@@ -896,12 +896,21 @@ personenRouter.put("/workspace/api/verwaltung/personen/:id/rolle", gleicheHerkun
Sie beantwortet drei Fragen auf einmal: nicht die eigene Rolle,
nicht DogFather, und fuer die rechte Hand auch keine zweite
rechte Hand. */
/* DIE EIGENE ZEILE ZUERST -- und mit 400, nicht 403.
Sie ist keine Rechtefrage, sondern eine unsinnige Bitte: Es
gibt niemanden, der sie duerfte. Eine 403 haette hier
ausserdem den Fall "der letzte DogFather tritt zurueck"
verschluckt, den die Sicherung weiter unten mit einem
verstaendlichen Satz beantwortet. */
if (person.id === req.person.id) {
return res.status(400).json({
fehler: "Deine eigene Rolle kannst du nicht ändern. Das muss jemand anderes tun.",
});
}
if (!darfRolleAendern(req.person, person)) {
return res.status(403).json({ fehler: "Diese Rolle darfst du nicht ändern." });
}
if (!rollenZumAendern(req.person).includes(rolle)) {
return res.status(403).json({ fehler: "Diese Rolle vergibst du nicht." });
}
/* Dieselbe Auskunft wie beim Anlegen: Wer eine Rolle nicht
vergeben darf, darf sie auch nicht zuweisen. Sonst waere das
@@ -924,7 +933,26 @@ personenRouter.put("/workspace/api/verwaltung/personen/:id/rolle", gleicheHerkun
Rolle." mit 400). Wer durchprobiert, haette daran ablesen
koennen, welche Rollen es gibt. Jetzt beide Faelle wortgleich
-- wie beim Anlegen. */
if (!darfAnlegen(req.person).includes(rolle)) {
/* WELCHE ROLLE DARF DIESE PERSON VERGEBEN.
Hier stand `darfAnlegen`. Das war richtig, solange Vergeben und
Anlegen dasselbe waren -- seit dem 20.09. sind sie es nicht
mehr: Die rechte Hand darf NIEMANDEN anlegen und trotzdem
'modi' und 'gast' vergeben, ein Manager darf einen Creator
anlegen und gar keine Rolle vergeben. Gemessen:
admin anlegen = aendern (sieben Rollen)
spicy anlegen = aendern (vier)
hand anlegen = — aendern = modi, gast
manager anlegen = creator aendern = —
WORTGLEICH MIT DEM FALL DARUEBER, und das ist Absicht: Zwei
verschiedene Antworten -- "Unbekannte Rolle" gegen "die darfst
du nicht vergeben" -- verraten beim Durchprobieren, WELCHE
Rollen es gibt. Genau davor warnt der Kommentar von 17.09., und
eine 403 an dieser Stelle hatte die Luecke am 20.09. kurz
wieder aufgemacht. */
if (!rollenZumAendern(req.person).includes(rolle)) {
return res.status(400).json({ fehler: "Unbekannte Rolle." });
}
if (person.rolle === rolle) {