feat: Fusion — barre d'apps commune (#28) et pont SSO draco_session (#27)
CI / test (push) Successful in 1m37s

This commit is contained in:
Spark
2026-10-21 10:56:22 -04:00
parent 6066890bae
commit f087b41b4b
13 changed files with 635 additions and 3 deletions
+32 -1
View File
@@ -220,7 +220,8 @@ gitea = GiteaClient()
SESSION_COOKIE = "kanbante_session"
SESSION_DAYS = 7
_PUBLIC_PATHS = ("/api/health", "/webhooks/gitea", "/api/capture", "/login")
_PUBLIC_PATHS = ("/api/health", "/webhooks/gitea", "/api/capture", "/login",
"/auth/draco")
def _session_secret() -> bytes:
@@ -374,6 +375,32 @@ async def logout():
return response
@app.get("/auth/draco")
def draco_bridge(request: Request, next: str = "/"):
"""Fusion ACC-3.2 — pont SSO : cookie ``draco_session`` → session.
Point de retour de ``GET /sso/authorize`` de l'émettrice
(ObsiGate) : si le cookie partagé est valide, la session native
de l'opérateur configuré est créée (Kanbante est mono-utilisateur,
aucun mapping de comptes n'est nécessaire) ; sinon, retour à
l'écran de connexion. Inerte sans ``DRACO_SESSION_SECRET``.
"""
from app import draco
settings = get_settings()
if not settings.auth_enabled or draco.claims_for(request) is None:
return RedirectResponse("/login", status_code=303)
response = RedirectResponse(_safe_next(next), status_code=303)
response.set_cookie(
SESSION_COOKIE,
_make_session(settings.auth_user),
max_age=SESSION_DAYS * 86400,
httponly=True,
samesite="lax",
)
return response
# ── Live updates (SSE hub) ─────────────────────────────────
class LiveHub:
@@ -459,6 +486,10 @@ def render(
token = secrets.token_urlsafe(32)
context.setdefault("csrf_token", token)
context.setdefault("version", APP_VERSION)
# Fusion ACC-1 : initiale de l'opérateur pour la barre d'apps commune.
context.setdefault(
"draco_avatar", (get_settings().auth_user or "K")[:1].upper()
)
context.setdefault("active_nav", _NAV_BY_TEMPLATE.get(name, ""))
context.setdefault("auth_enabled", get_settings().auth_enabled)
context.setdefault("data_freshness", snapshots_service.freshness_label())