Die rechte Hand legt selbst Personen an -- und sieht die Codes

Filipe: "dan will ich dass die rechte hand auch neue personen
hinzufuegen kann. also neue erstellen kann und die codes genau so
sieht wie dogfather, damit sie das auch machen kann wenn er live ist."

WAS SIE DARF: Modis und Community anlegen, und deren Codes neu setzen.
Die Liste ist ABGELEITET aus ROLLEN_ZUM_AENDERN -- dieselben zwei
Rollen, die sie ohnehin vergeben darf. Zwei Listen waeren zwei
Gelegenheiten, eine davon zu aendern und die andere zu vergessen.

WAS SIE NICHT DARF: eine zweite rechte Hand, eine linke Hand oder
einen zweiten DogFather anlegen -- und an einer linken Hand auch
nichts aendern. Ohne die zweite Schranke haette sie den Code einer
linken Hand neu setzen koennen und damit einen Zugang in der Hand, der
fast so viel darf wie sie selbst. Die alte Schranke kannte nur "admin"
und "manager".

NUR DIE RECHTE, NICHT DIE LINKE. `istHand()` haette beide getroffen;
fuer die linke Hand ist "legt niemanden an" eine ausdrueckliche
Entscheidung vom 21.09.

VIER STELLEN IN DER OBERFLAECHE, die alle an Rollennamen hingen:

  `nurLesen = ich.rolle === 'hand'` -- sie bekam die Liste und kein
  Formular. Jetzt abgeleitet aus `darf_anlegen`.

  Die Wache darueber warf sie auf die Startseite, sobald `nurLesen`
  falsch wurde. Die Seite ging fuer sie einfach nicht auf, ohne
  Meldung.

  Der Sendeweg hing an `ich.rolle === 'admin'`. Fuer sie gab es damit
  GAR KEINEN: Die Seite antwortete "Fuer die Rolle modi gibt es hier
  keinen Weg" -- ein Satz, der wie ein Formularfehler klingt und eine
  fehlende Zeile war.

  UND EIN ECHTER FUND: `rollenwahlErgaenzen()` hing jede Zusatzrolle an
  das Formular, die mit der Personenliste kam -- ohne zu fragen, ob man
  sie anlegen darf. Solange nur DogFather das Formular sah, fiel es
  nicht auf: Er darf sie alle. Der rechten Hand bot es "rechte Hand"
  und "linke Hand" an. Der Server haette es abgelehnt -- aber der Knopf
  verriet eine Rolle, die sie nicht vergeben soll.

Zwei Pruefungen waren dabei selbst kaputt: pruef-personen-formular
erwartete sieben Rollen (seit "linke" am 21.09. sind es acht) und
suchte den Namen im sichtbaren Text -- die Abschnitte sind zugeklappt
und zeigen nur Anfangsbuchstaben. Beides abgeleitet statt gezaehlt.

Geprueft: pruef-personen-formular 43/0 (war 34 ok / 2 FEHL), davon
neun am echten Bildschirm auf der Crew-Adresse -- anmelden, Formular
oeffnen, anlegen, Code lesen, Person in der Liste wiederfinden.
pruef-haus-trennung 81/0 (war 72 ok / 2 FEHL), pruef-rollen-anlegen
11/0.
This commit is contained in:
2026-09-22 01:39:12 +02:00
parent 39c0b4dc1f
commit 82335c783d
43 changed files with 899 additions and 540 deletions
+49
View File
@@ -128,6 +128,36 @@ function nurAdmin(req, res, next) {
WELCHE Rolle sie vergeben darf, steht NICHT hier -- das entscheidet
ANLEGBAR in der Route. Diese Zeile oeffnet nur die Tuer. */
/* DIE RECHTE HAND LEGT PERSONEN AN UND SIEHT IHRE CODES (22.09.2026).
Filipe: "damit sie das auch machen kann wenn er live ist."
NUR DIE RECHTE, NICHT DIE LINKE. `istHand()` wuerde beide treffen;
fuer die linke Hand ist "legt niemanden an" eine ausdrueckliche
Entscheidung vom 21.09. Deshalb steht hier die Rolle und nicht der
Sammelbegriff -- der haette die Entscheidung stillschweigend
umgedreht.
ZWEI WEGE, NICHT DIE GANZE VERWALTUNG: anlegen und einen Code neu
erzeugen. Sperren, Loeschen, Betreuung und Protokoll bleiben bei
DogFather. Und WELCHE Rolle sie anlegen darf, entscheidet nicht
diese Zeile, sondern ANLEGBAR in der Route -- diese Tuer oeffnet
nur den Weg.
WARUM AUCH "Code neu erzeugen": Ein Code wird genau einmal
angezeigt. Geht er verloren, ist der Zugang ohne diesen Weg tot --
und dann muesste doch wieder DogFather ran, also genau das, was
nicht sein soll. */
const anlegeWeg = req.method === "POST"
&& req.baseUrl + req.path === "/workspace/api/verwaltung/personen";
const codeWeg = req.method === "POST"
&& /^\/workspace\/api\/verwaltung\/personen\/[0-9]+\/code$/
.test(req.baseUrl + req.path);
if (person.rolle === "hand" && (anlegeWeg || codeWeg)) {
req.person = person;
return next();
}
const rollenWeg = req.method === "PUT"
&& /^\/workspace\/api\/verwaltung\/personen\/[0-9]+\/rolle$/
.test(req.baseUrl + req.path);
@@ -169,6 +199,25 @@ function nurDogFatherBeiLeitung(req, res, next) {
const id = Number(req.params.id);
if (!Number.isInteger(id)) return next();
const ziel = db().prepare("SELECT rolle FROM personen WHERE id = ?").get(id);
/* DIE RECHTE HAND NUR AN DENEN, DIE SIE AUCH ANLEGEN DUERFTE
(22.09.2026).
Ohne diese Zeile koennte sie den Code einer LINKEN HAND neu
erzeugen -- und haette damit einen Zugang, der fast so viel darf
wie sie selbst, in der Hand. Das ist nicht gemeint und waere auch
nicht aufgefallen: Die Schranke darunter kennt nur "admin" und
"manager".
Gefragt wird dieselbe Liste wie beim Anlegen. Eine zweite waere
die, die beim naechsten Umbau auseinanderlaeuft. */
if (req.person?.rolle === "hand" && ziel
&& !darfAnlegen(req.person).includes(ziel.rolle)) {
return res.status(403).json({
fehler: "An dieser Rolle ändert die rechte Hand nichts.",
});
}
if (ziel && (ziel.rolle === "admin" || ziel.rolle === "manager")) {
return res.status(403).json({
fehler: "An DogFather und Managern ändert nur DogFather etwas.",