aether-framework/resources/[aether]/aether-admin/server/auth.lua
Jerrit Fritzsche e4b82dd685 Aether-Framework: Fachmodule, Admin-Panel und Docker-Datenbank
- 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>
2026-07-27 18:55:32 +02:00

96 lines
2.9 KiB
Lua

-- =====================================================================
-- aether-admin — Rechteprüfung (Kopplung an aether-core)
--
-- Die Wahrheit über die Gruppe eines Spielers steht in
-- `aether_users.admin_group` — gepflegt vom Core. Dieses Modul liest
-- sie, hält sie je Session vor und beantwortet die einzige Frage, die
-- der Rest des Codes stellt: „Darf diese Server-ID das?"
--
-- Geprüft wird IMMER hier, nie in der Oberfläche. Was der Client
-- schickt, ist ein Wunsch, kein Nachweis.
-- =====================================================================
Admin = Admin or {}
Admin.Auth = {}
-- Zwischenspeicher: [quelle] = gruppe
local gruppeCache = {}
--- Liest die Rockstar-Lizenz einer Server-ID (ohne Präfix)
--- @param quelle number
--- @return string|nil
function Admin.Auth.Lizenz(quelle)
local lizenz = GetPlayerIdentifierByType(quelle, 'license')
if not lizenz then return nil end
return (lizenz:gsub('license:', ''))
end
--- Anzeigename einer Server-ID
--- @param quelle number
--- @return string
function Admin.Auth.Name(quelle)
return GetPlayerName(quelle) or ('Spieler ' .. tostring(quelle))
end
--- Rechtegruppe einer Server-ID (mit Cache)
--- @param quelle number
--- @return string
function Admin.Auth.Gruppe(quelle)
if gruppeCache[quelle] then return gruppeCache[quelle] end
local lizenz = Admin.Auth.Lizenz(quelle)
if not lizenz then return 'user' end
local gruppe = Admin.DB.GruppeVonLizenz(lizenz)
gruppeCache[quelle] = gruppe
return gruppe
end
--- Verwirft den Cache einer Server-ID (nach Rollenänderung / Disconnect)
--- @param quelle number
function Admin.Auth.CacheLeeren(quelle)
gruppeCache[quelle] = nil
end
--- Verwirft den Cache einer Lizenz, egal unter welcher Server-ID sie online ist
--- @param lizenz string
function Admin.Auth.CacheLeerenNachLizenz(lizenz)
for quelle in pairs(gruppeCache) do
if Admin.Auth.Lizenz(quelle) == lizenz then
gruppeCache[quelle] = nil
end
end
end
--- Erfüllt die Server-ID mindestens die geforderte Gruppe?
--- @param quelle number
--- @param benoetigt string
--- @return boolean
function Admin.Auth.Hat(quelle, benoetigt)
return AdminConfig.Erfuellt(Admin.Auth.Gruppe(quelle), benoetigt)
end
--- Darf die Server-ID das Panel überhaupt öffnen?
--- @param quelle number
--- @return boolean
function Admin.Auth.DarfOeffnen(quelle)
return Admin.Auth.Hat(quelle, AdminConfig.MindestGruppe)
end
--- Baut den „Handelnden"-Kontext, den Module und das Log erwarten
--- @param quelle number
--- @return table { quelle, lizenz, name, gruppe }
function Admin.Auth.Handelnder(quelle)
return {
quelle = quelle,
lizenz = Admin.Auth.Lizenz(quelle),
name = Admin.Auth.Name(quelle),
gruppe = Admin.Auth.Gruppe(quelle),
}
end
-- Cache aufräumen, wenn jemand geht
AddEventHandler('playerDropped', function()
gruppeCache[source] = nil
end)