"""Schreib-Freigabe für externe Systeme (Mittwald, Login-API) – pro Tenant. `DEPLOY_ALLOWED_TENANTS` (Env der Admin-Plattform) legt fest, welche Tenants live angefasst werden dürfen: (leer/nicht gesetzt) keiner – auch mit DEPLOY_LIVE=true wird nichts geschrieben demo-admin,demo2 nur diese * alle Greift bei Live-Deploy, Offboard, Rollout/Rollback und beim Schreiben im Login-System (OIDC-Abgleich/Löschen). Dry-Runs und Lesezugriffe sind nie betroffen. Damit lässt sich die Plattform schrittweise und gefahrlos parallel zum Altbetrieb einführen. """ from __future__ import annotations import os def allowed_tenants() -> set[str] | None: """None = alle, sonst die erlaubten IDs (leere Menge = keiner).""" raw = os.getenv("DEPLOY_ALLOWED_TENANTS", "").strip() if raw == "*": return None return {x.strip() for x in raw.split(",") if x.strip()} def live_allowed(tenant_id: str) -> bool: a = allowed_tenants() return a is None or tenant_id in a def describe() -> str: a = allowed_tenants() return "alle Tenants" if a is None else (", ".join(sorted(a)) if a else "keiner") def denial(tenant_id: str) -> str: return (f"Tenant „{tenant_id}“ ist für Live-Schreibzugriffe nicht freigegeben (Env DEPLOY_ALLOWED_TENANTS = {describe()}). " "Dry-Runs sind weiterhin möglich.") def auth_ok() -> bool: """Live-Schreibzugriffe nur mit aktivem Login der Admin-Plattform (sonst wäre sie – mit Mittwald-Token im Container – für jeden offen). Nur für lokale Experimente übersteuerbar: ALLOW_NO_AUTH_LIVE=true.""" from app.settings import AUTH_ENABLED return AUTH_ENABLED or os.getenv("ALLOW_NO_AUTH_LIVE", "false").lower() == "true"