- aether-medical: Stationen/Belegung, Intensivstation, Blutbank, Fuhrpark, Nachrichten/Aushänge, Berichte und Textbausteine (server + NUI) - aether-admin: vollständiges Server-Admin-Panel als echtes FiveM-Resource, an aether-core gekoppelt (Rechte über aether_users.admin_group), mit WebRTC-Live-Kameras (Bildschirmfreigabe) und separatem Media-Server (SFU) - Prototypen admin/ vervollständigt - SQL-Schema aether_admin.sql - Docker-Compose mit MariaDB und idempotenter Auto-Migration (schema_migrations) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
62 lines
1.9 KiB
Lua
62 lines
1.9 KiB
Lua
-- =====================================================================
|
|
-- 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
|