Rollen wechseln: auch Spicy Media -- und DogFather ist nicht mehr vergebbar
Filipe: "ich will dass die rolle spicy und dogfather, auch die rollen
wechseln koennen wenn die personen schon drin sind. von alle
kategorien, creator, scouts, manager spicy. dogfather soll man nicht
auswaehlen koennen. das ist die einzige die man nicht auswaehlen kann
bitte."
ZWEI AENDERUNGEN, BEIDE IN EINER LISTE (ANLEGBAR):
admin: alles AUSSER der eigenen Rolle
spicy: spicy, manager, scout, creator (vorher ohne spicy)
Weil die Oberflaeche ihre Knoepfe aus derselben Auskunft baut
(`darf_anlegen` in /api/ich), verschwindet DogFather damit von selbst
aus JEDER Auswahl -- beim Anlegen wie beim Wechseln, bei Spicy Media
wie bei DogFather. Eine Liste, zwei Formulare, kein Nachziehen.
WAS DAS BEDEUTET, damit es niemand spaeter sucht: Es laesst sich kein
zweiter DogFather-Zugang mehr anlegen und niemand mehr zu einem
befoerdern. Der bestehende ist durch Sicherung 3 geschuetzt (nie den
letzten herabstufen) und kann nicht versehentlich verschwinden.
Zurueckdrehen laesst sich das nur in ANLEGBAR.
DIE TUER: /verwaltung haengt an nurAdmin, und dort steht jetzt eine
DRITTE enge Ausnahme -- PUT auf genau /personen/<Ziffern>/rolle, fuer
genau die Rollen aus darfRollenWechseln(). Gleiche Bauweise wie die
beiden davor (Liste fuer Spicy Media, Liste fuer die rechte Hand). Was
NICHT mitgeht: Codes, Sperren, Loeschen, Zuteilung, Protokoll.
EINE NEUE SICHERUNG, weil sich die Tuer geoeffnet hat: An einer
DogFather-Zeile aendert nur DogFather. Die bestehenden Pruefungen sehen
auf die ZIEL-Rolle ("darfst du 'manager' vergeben?") -- dass die
BETROFFENE Person DogFather ist, kam darin bis heute nicht vor.
Sicherung 3 haette es heute zufaellig abgefangen, weil es genau einen
gibt; eine Sperre, die nur wegen einer Zahl im Bestand haelt, ist
keine.
DIE OBERFLAECHE: "Rolle aendern" und "Loeschen" hingen an EINER Zeile
(`ich.rolle === 'admin'`). Sie gehoeren nicht zusammen -- Loeschen
bleibt bei DogFather. Und die CSS-Regel, die fuer Spicy Media die ganze
Knopfreihe ausblendete, ist weg: Welche Knoepfe es gibt, entscheidet
jetzt personen.js, und was nicht entsteht, muss man nicht verstecken.
pruef-spicy 62 -> 83. Gemessen wird jede der vier Kategorien EINZELN
(waere nur eine offen, saehe "geht" genauso aus), dazu: admin weder von
Spicy Media noch von DogFather vergebbar, an DogFathers Zeile aendert
sie nichts (und er ist danach nachweislich noch admin), ein Manager
kommt an den Weg nicht, loeschen bleibt zu -- und im Browser, dass der
KNOPF da ist, nicht nur das Recht. Genau daran war heute frueh im Chat
eine Stunde draufgegangen.
Dabei zwei eigene Messfehler gefunden: Die Knoepfe entstehen erst in
einer AUFGEKLAPPTEN Kategorie (vorher zu frueh gemessen), und /api/ich
wird jetzt als Vorbedingung geprueft.
DREI PRUEFUNGEN GEDREHT, KEINE GELOESCHT:
- pruef-personen-formular: 7 Karten, `admin` fehlt (eigene Aussage).
Die Zeichenpruefung verglich die rechte Hand gegen die Admin-KARTE --
die es nicht mehr gibt; sie lief gegen `undefined`. Ersatz ist das
Zeichen selbst, und der Kommentar sagt, dass das schwaecher ist.
- pruef-haus-trennung: Der zweite DogFather entsteht jetzt im Bestand
statt ueber die Schnittstelle, und DASS die Schnittstelle ihn
ablehnt, ist der erste Prueffall geworden. Sonst waere "nie den
letzten DogFather" ab heute ungeprueft -- weil ihre Voraussetzung
schwerer herzustellen ist.
- pruef-creator-anlegen: aus einer Aussage zwei (die vier sind da UND
admin fehlt).
Gruen: personen-liste, personen-kachel, verborgen, manager-sicht,
creator-anlegen, haus-trennung, personen-formular, spicy, rollen.
Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -15,7 +15,7 @@
|
||||
|
||||
import express from "express";
|
||||
import {
|
||||
db, protokolliere, echteIp, sitzungLesen, personAnlegen, codeNeu, sitzungToken, personSperren, betreuungSetzen, scoutZuteilungSetzen, istLeitung, istDogFather, siehtModis, siehtAlles, ROLLEN_SORTIERUNG, ROLLEN_REIHE, istSpicy, verborgeneIds, TEAM_DOGI_ROLLEN, darfAnlegen, hausBedingung,
|
||||
db, protokolliere, echteIp, sitzungLesen, personAnlegen, codeNeu, sitzungToken, personSperren, betreuungSetzen, scoutZuteilungSetzen, istLeitung, istDogFather, siehtModis, siehtAlles, ROLLEN_SORTIERUNG, ROLLEN_REIHE, istSpicy, verborgeneIds, TEAM_DOGI_ROLLEN, darfAnlegen, darfRollenWechseln, hausBedingung,
|
||||
} from "./workspace.js";
|
||||
import { sicherungJetzt } from "./workspace-sicherung.js";
|
||||
|
||||
@@ -100,6 +100,35 @@ function nurAdmin(req, res, next) {
|
||||
return next();
|
||||
}
|
||||
|
||||
/* SPICY MEDIA DARF ROLLEN WECHSELN (11.09.2026).
|
||||
|
||||
Filipe: "ich will dass die rolle spicy und dogfather, auch die
|
||||
rollen wechseln koennen wenn die personen schon drin sind. von
|
||||
alle kategorien, creator, scouts, manager spicy."
|
||||
|
||||
DRITTE AUSNAHME, GLEICHE BAUWEISE wie die beiden darueber: eine
|
||||
Methode, eine Adresse, eine Rolle. Wer hier etwas anderes baut,
|
||||
hat drei Fassungen derselben Ausnahme -- und die dritte laesst
|
||||
irgendwann mehr durch als gedacht.
|
||||
|
||||
Codes, Sperren, Loeschen, Zuteilung und Protokoll bleiben bei
|
||||
DogFather. Filipe hat das Rollenwechseln genannt, nicht die
|
||||
Verwaltung.
|
||||
|
||||
DER PFAD TRAEGT EINE NUMMER, laesst sich also nicht wie oben
|
||||
vergleichen. Das Muster ist absichtlich streng: genau
|
||||
/personen/<Ziffern>/rolle, nichts davor und nichts danach.
|
||||
|
||||
WELCHE Rolle sie vergeben darf, steht NICHT hier -- das entscheidet
|
||||
ANLEGBAR in der Route. Diese Zeile oeffnet nur die Tuer. */
|
||||
const rollenWeg = req.method === "PUT"
|
||||
&& /^\/workspace\/api\/verwaltung\/personen\/[0-9]+\/rolle$/
|
||||
.test(req.baseUrl + req.path);
|
||||
if (darfRollenWechseln(person) && rollenWeg) {
|
||||
req.person = person;
|
||||
return next();
|
||||
}
|
||||
|
||||
if (!istDogFather(person)) return res.status(404).json({ fehler: "nicht_gefunden" });
|
||||
req.person = person;
|
||||
next();
|
||||
@@ -817,6 +846,29 @@ personenRouter.put("/workspace/api/verwaltung/personen/:id/rolle", gleicheHerkun
|
||||
return res.status(400).json({ fehler: "Diese Rolle hat sie schon." });
|
||||
}
|
||||
|
||||
/* SICHERUNG 6 -- NEU AM 11.09.2026, WEIL SICH DIE TUER GEOEFFNET HAT.
|
||||
|
||||
Seit Spicy Media Rollen wechseln darf, gibt es einen Fall, den
|
||||
es vorher nicht geben konnte: jemand ohne DogFather-Rolle, der
|
||||
an einer DogFather-Zeile steht.
|
||||
|
||||
DIE PRUEFUNGEN DARUEBER FANGEN DAS NICHT. Sie sehen auf die
|
||||
ZIEL-Rolle ("darfst du 'manager' vergeben?") -- und 'manager'
|
||||
darf Spicy Media vergeben. Dass die Person, die da herabgestuft
|
||||
wird, DogFather ist, steht in der AUSGANGS-Rolle, und die kam
|
||||
bis heute nirgends vor.
|
||||
|
||||
Sicherung 3 (nie den letzten DogFather) haette es heute
|
||||
zufaellig abgefangen, weil es genau einen gibt. Eine Sperre,
|
||||
die nur wegen einer Zahl im Bestand haelt, ist keine.
|
||||
|
||||
Zusaetzlich sieht Spicy Media DogFather gar nicht in der Liste
|
||||
(`req.ohneDogFather`). Das ist eine Sicht, keine Schranke -- wer
|
||||
die Nummer kennt, ruft den Weg direkt auf. */
|
||||
if (person.rolle === "admin" && !istDogFather(req.person)) {
|
||||
return res.status(403).json({ fehler: "An der DogFather-Rolle ändert nur DogFather." });
|
||||
}
|
||||
|
||||
/* SICHERUNG 2 */
|
||||
if (id === req.person.id) {
|
||||
return res.status(400).json({ fehler: "Die eigene Rolle lässt sich nicht ändern.",
|
||||
|
||||
Reference in New Issue
Block a user