Die rechte Hand: dieselben Rechte, außer an DogFather
Filipe: „die rechte hand soll das auch sehen. und die selben rechte
da haben wie dogfather. das einzige was sie nicht kann ist die
dogfather rolle oder leute anfassen. also da kann sie nichts
verändern."
ZUERST EIN IRRTUM VON MIR. Ich hatte den Bildschirmfoto-Ausschnitt
fuer die Rechtetafel gehalten und dort gebaut. „Vertritt dich im
Alltag und koordiniert das Team" steht aber in workspace-personen.js:
Gemeint war die PERSONENSEITE. Die Arbeit an der Rechtetafel ist
trotzdem drin (siehe unten) -- sie loeste dasselbe Problem an einer
zweiten Stelle.
=== DIE PERSONENSEITE ===
DIE OBERFLAECHE WAR STRENGER ALS DER SERVER. In personen.js stand
`if (ich.rolle === 'hand') { keine Knoepfe }` mit der Begruendung
„Der Server antwortet ihr auf jeden davon mit 404". Am 22.09. stimmte
das. Seither wurde der Server ZWEIMAL erweitert -- sie durfte
Personen anlegen, Codes neu erzeugen und Rollen aendern -- und diese
Zeile blieb stehen. Sie hatte drei Rechte und sah keinen einzigen
Knopf. Ein Rollenvergleich im Browser ist genau die zweite Wahrheit,
die still veraltet.
Jetzt fragt die Oberflaeche den Server (`darf_zugaenge_verwalten`,
`darf_personen_loeschen`, `rollen_anfassbar`). Dazu kommen SPERREN
und LOESCHEN, die bis heute ausdruecklich bei DogFather lagen --
Filipes „das einzige" ist juenger und eindeutig.
Die Knoepfe „Neuer Code" und „Sperren" standen inline im
DogFather-Zweig; sie sind jetzt Funktionen und werden von beiden
Stellen benutzt. Eine zweite Abschrift waere die geworden, die beim
naechsten Umbau nur halb nachgezogen wird.
ZWEI ECHTE LOECHER FAND DIE NEUE PRUEFUNG:
* `PUT /personen/:id/rolle` hatte `nurDogFatherBeiLeitung` NICHT.
Bis heute folgenlos; mit den neuen Rechten konnte die rechte Hand
darueber die Rolle eines MANAGERS aendern -- waehrend derselbe
Manager fuer DogFather auf crew. gar nicht in der Liste steht.
Zwei Wege, zwei Antworten, und der laxere galt fuer die Rolle mit
weniger Rechten.
* Die Loesch-Route hatte dieselbe Middleware ebenfalls nicht. Das
war harmlos, solange die Route selbst nur DogFather durchliess --
seit die rechte Hand loescht, ist es die Stelle, an der DogFather
geschuetzt wird.
=== DIE RECHTETAFEL (nicht bestellt, aber dasselbe Problem) ===
Dort durfte sie sehen, aber nichts umstellen. Jetzt umstellen wie
DogFather -- ausser der Spalte „DogFather" und der Zeile „Personen &
Zugaenge" (wer die freischaltet, hat Zugaenge vergeben, ohne einen
anzulegen). Zuruecksetzen bleibt bei DogFather: Der Knopf naehme
genau diese zwei Sperren mit, und eine Sperre, die ein zweiter Knopf
daneben aufhebt, ist keine.
Sie kann sich auch selbst nicht aussperren -- das hat er nicht
gesagt, aber eine Sperre, aus der man sich aussperren kann, ist eine
Falle. Ein festes Feld ist jetzt gar kein Knopf mehr und nennt den
Grund, der fuer DIESE Person gilt.
=== DREI MESSFEHLER VON MIR ===
Ein Manager ist auf crew. fuer die LISTE unsichtbar, fuer DogFathers
direkten Zugriff aber nicht -- ich hielt das eine fuer das andere und
erwartete, dass beide abgewiesen werden. Die Loesch-Vorschau (GET)
fehlte in meinem Waechter. Und `rollen_anfassbar` beantwortet eine
andere Frage als „wen sehe ich".
Gemessen: pruef-hand-personen, 40 Pruefungen, 0 Fehler -- jeder der
fuenf Wege einzeln gegen DogFather und die linke Hand, plus die
Gegenprobe, dass DogFather es kann. pruef-rechte-umstellen von 46 auf
56 Pruefungen. Gruen: pruef-personen-liste, pruef-personen-loeschen,
pruef-personen-kachel, pruef-rollen-anlegen, pruef-rechtetafel.
Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
+88
-1
@@ -676,10 +676,97 @@ export const UNANTASTBAR = [
|
||||
{ pfad: "/workspace/start.html", rolle: "admin" },
|
||||
];
|
||||
|
||||
/* =====================================================================
|
||||
WAS DIE RECHTE HAND NICHT ANFASSEN DARF (24.09.2026)
|
||||
|
||||
Filipe: „die rechte hand soll das auch sehen. und die selben rechte
|
||||
da haben wie dogfather. das einzige was sie nicht kann ist die
|
||||
dogfather rolle oder leute anfassen. also da kann sie nichts
|
||||
verändern."
|
||||
|
||||
SEHEN KONNTE SIE DIE TAFEL SCHON -- `nurLeitung` liess sie herein,
|
||||
und die Kachel steht in ihrer Liste. Was ihr fehlte, war das
|
||||
Umstellen: Jeder Knopf antwortete mit „Umstellen kann das nur
|
||||
DogFather."
|
||||
|
||||
ZWEI SPERREN, und beide stehen hier statt in der Route -- damit die
|
||||
Oberflaeche dieselbe Auskunft bekommt und den Knopf gar nicht erst
|
||||
als Knopf zeigt:
|
||||
|
||||
1. DIE SPALTE „DogFather". Sie entscheidet, was er selbst sieht.
|
||||
Wer sie aendern kann, kann ihm Seiten wegnehmen.
|
||||
2. DIE ZEILE „Personen & Zugaenge" -- „leute anfassen". Wer
|
||||
personen.html fuer eine Rolle freischaltet, hat damit
|
||||
Zugaenge vergeben, ohne einen einzigen anzulegen.
|
||||
|
||||
DRITTENS, UND DAS HAT ER NICHT GESAGT: Sie kann sich auch selbst
|
||||
nicht aussperren. Dieselbe Ueberlegung wie bei UNANTASTBAR fuer
|
||||
DogFather -- eine Sperre, aus der man sich aussperren kann, ist
|
||||
keine Einstellung, sondern eine Falle. Haette ich es weggelassen,
|
||||
waere der erste Fehlklick auf „rechte.html / Rechte Hand" das Ende
|
||||
ihres Zugangs zu dieser Seite gewesen.
|
||||
===================================================================== */
|
||||
|
||||
/** Die Spalte, die nur DogFather selbst aendern darf. */
|
||||
const NUR_DOGFATHER_SPALTE = "admin";
|
||||
/** Die Zeile, die nur DogFather aendern darf -- fuer JEDE Rolle. */
|
||||
const NUR_DOGFATHER_ZEILE = "/workspace/personen.html";
|
||||
/** Und was die rechte Hand sich selbst nicht wegnehmen kann. */
|
||||
const HAND_BRAUCHT = ["/workspace/rechte.html", "/workspace/start.html"];
|
||||
|
||||
/** Darf DIESE PERSON dieses Feld anfassen? -- unabhaengig davon, ob
|
||||
* sie es an- oder abwaehlen will.
|
||||
*
|
||||
* Getrennt von `darfUmstellen`, weil die Oberflaeche genau diese
|
||||
* Frage stellt, bevor sie ein Feld zeichnet: Ein Knopf, der eine
|
||||
* Absage bringt, ist schlimmer als keiner.
|
||||
*
|
||||
* @returns {string|null} Grund -- oder null, wenn es geht. */
|
||||
export function darfFeldAnfassen(person, pfad, rolle) {
|
||||
const wer = person?.rolle;
|
||||
if (wer === "admin") return null;
|
||||
if (wer !== "hand") return "Umstellen kann das nur DogFather und die rechte Hand.";
|
||||
|
||||
if (rolle === NUR_DOGFATHER_SPALTE) {
|
||||
return "Was DogFather sieht, stellt nur er selbst um.";
|
||||
}
|
||||
if (pfad === NUR_DOGFATHER_ZEILE) {
|
||||
return "Wer Zugänge vergeben darf, entscheidet nur DogFather.";
|
||||
}
|
||||
if (rolle === "hand" && HAND_BRAUCHT.includes(pfad)) {
|
||||
return "Diese Seite kannst du dir nicht selbst wegnehmen – "
|
||||
+ "sonst kämst du an die Rechte nicht mehr heran.";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/** Alle Felder, die diese Person nicht anfassen darf -- fuer die
|
||||
* Oberflaeche, damit sie sie als fest zeichnet.
|
||||
*
|
||||
* ABGELEITET AUS `darfFeldAnfassen`, nicht danebengeschrieben: Zwei
|
||||
* Listen fuer dieselbe Regel waeren die, die beim naechsten Umbau
|
||||
* auseinanderlaufen -- und die in der Oberflaeche waere die, die
|
||||
* jeder herunterlaedt. */
|
||||
export function festeFelder(person, pfad) {
|
||||
const aus = UNANTASTBAR.filter((u) => u.pfad === pfad).map((u) => u.rolle);
|
||||
for (const r of ALLE_ROLLEN) {
|
||||
if (aus.includes(r)) continue;
|
||||
if (darfFeldAnfassen(person, pfad, r)) aus.push(r);
|
||||
}
|
||||
return aus;
|
||||
}
|
||||
|
||||
/** @returns {string|null} Grund, warum das nicht geht -- oder null. */
|
||||
export function darfUmstellen(pfad, rolle, erlaubt) {
|
||||
export function darfUmstellen(pfad, rolle, erlaubt, person) {
|
||||
if (!Object.prototype.hasOwnProperty.call(SEITEN, pfad)) return "Diese Seite gibt es nicht.";
|
||||
if (!ALLE_ROLLEN.includes(rolle)) return "Diese Rolle gibt es nicht.";
|
||||
/* ZUERST DIE PERSON, DANN DER INHALT. Wer ein Feld gar nicht
|
||||
anfassen darf, bekommt denselben Grund -- egal ob er an- oder
|
||||
abwaehlen wollte. Stuende diese Frage nach `if (erlaubt) return
|
||||
null`, koennte die rechte Hand DogFather jede Seite ZUSCHALTEN
|
||||
und nur nicht wegnehmen; das waere dieselbe Tuer, nur andersherum. */
|
||||
const nein = person ? darfFeldAnfassen(person, pfad, rolle) : null;
|
||||
if (nein) return nein;
|
||||
if (erlaubt) return null;
|
||||
const fest = UNANTASTBAR.find((u) => u.pfad === pfad && u.rolle === rolle);
|
||||
if (fest) {
|
||||
|
||||
Reference in New Issue
Block a user