-- ===================================================================== -- aether-police — Rechteprüfung -- -- Ein Beamter hat ein Recht, wenn seine Rolle es vorsieht ODER es ihm -- einzeln gewährt wurde — und es ihm nicht einzeln entzogen wurde. -- Der Entzug hat immer Vorrang. -- ===================================================================== Rechte = {} --- Wandelt eine JSON-Liste in eine Menge um --- @param roh string|nil JSON-Array --- @return table { [wert] = true } local function ZuMenge(roh) local menge = {} if not roh then return menge end local erfolg, liste = pcall(json.decode, roh) if erfolg and type(liste) == 'table' then for _, wert in ipairs(liste) do menge[wert] = true end end return menge end --- Baut die vollständige Rechtemenge eines Beamten --- @param personal table Zeile aus police_personal --- @return table { [rechtId] = true } function Rechte.Berechne(personal) local menge = Polizei.RechteDerRolle(personal.rolle) -- Einzeln gewährte Rechte ergänzen for recht in pairs(ZuMenge(personal.rechte_extra)) do menge[recht] = true end -- Einzeln entzogene Rechte haben Vorrang for recht in pairs(ZuMenge(personal.rechte_entzug)) do menge[recht] = nil end return menge end --- Prüft ein einzelnes Recht --- @param beamter table Beamtendaten (mit Feld `rechte`) --- @param recht string Recht-Kennung --- @return boolean function Rechte.Hat(beamter, recht) if not beamter or not beamter.rechte then return false end if not recht then return true end return beamter.rechte[recht] == true end --- Prüft, ob ein Beamter über einem anderen steht. --- Verhindert, dass jemand Gleichrangige oder Höhere verwaltet. --- @param beamter table Handelnder --- @param zielRolle string Rolle der Zielperson --- @return boolean function Rechte.StehtUeber(beamter, zielRolle) return Polizei.Stufe(beamter.rolle) > Polizei.Stufe(zielRolle) end