Merge pull request 'Fusion #69 : Alertes unifiées (panneau + pastille, agrégation à la demande)' (#29) from alertes-unifiees-69 into main
This commit was merged in pull request #29.
This commit is contained in:
+12
@@ -239,6 +239,18 @@ app.add_middleware(RateLimitMiddleware)
|
||||
_CORS_ORIGINS = sorted(
|
||||
{o.rstrip("/") for o in (settings.app_base_url or "").split() if o.startswith(("http://", "https://"))}
|
||||
)
|
||||
# Fusion #69 : le panneau Alertes unifiées lit /api/notifications
|
||||
# depuis les hôtes soeurs, avec credentials — leurs origines doivent
|
||||
# donc figurer dans allow_origins (résolution draco_urls : explicite
|
||||
# > hôte de la requête > dérivation > défaut officiel ; hors requête,
|
||||
# la configuration seule). Lecture seule (GET) ; les POST restent
|
||||
# soumis au CSRFMiddleware.
|
||||
from app.services import draco_urls as _draco_urls69
|
||||
_toutes69 = _draco_urls69.toutes()
|
||||
_CORS_ORIGINS = sorted(set(_CORS_ORIGINS) | {
|
||||
_draco_urls69.origine(_toutes69[k])
|
||||
for k in ("obsigate", "flowdeck", "tiktak", "kanbante")
|
||||
} - {""})
|
||||
# Hors prod : dev local + origines d'extension (Web Clipper, Bearer uniquement —
|
||||
# pas de cookie → `allow_credentials` ne s'applique pas à ces origines).
|
||||
app.add_middleware(
|
||||
|
||||
@@ -139,7 +139,7 @@ class ContentSecurityPolicyMiddleware(BaseHTTPMiddleware):
|
||||
# l'agent connu en config ; défaut = nom officiel).
|
||||
# Même origine pour frame-src : la console du service est
|
||||
# encadrée en iframe par le panneau (surimpression v3).
|
||||
"connect-src 'self' {agent} ws://{host} wss://{host}; "
|
||||
"connect-src 'self' {agent} {sisters} ws://{host} wss://{host}; "
|
||||
"media-src 'self' blob:; "
|
||||
"frame-src 'self' {agent}; "
|
||||
"object-src 'none'; "
|
||||
@@ -174,8 +174,17 @@ class ContentSecurityPolicyMiddleware(BaseHTTPMiddleware):
|
||||
request.headers.get("host", ""))
|
||||
agent = re.sub(r"[^0-9A-Za-z.\-:/]", "",
|
||||
draco_urls.origine(draco_urls.agent_url()))
|
||||
# Fusion #69 : le panneau Alertes unifiées lit les API
|
||||
# notifications des applications soeurs depuis cet hôte ;
|
||||
# leurs origines rejoignent connect-src (même résolution
|
||||
# draco_urls que les liens de la barre et frame-src).
|
||||
_toutes69 = draco_urls.toutes()
|
||||
sisters = " ".join(sorted({
|
||||
draco_urls.origine(_toutes69[k])
|
||||
for k in ("obsigate", "flowdeck", "tiktak", "kanbante")
|
||||
} - {""}))
|
||||
response.headers[self.CSP_HEADER] = self.CSP_VALUE.format(
|
||||
nonce=nonce, host=host, agent=agent
|
||||
nonce=nonce, host=host, agent=agent, sisters=sisters
|
||||
)
|
||||
return response
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
v7.82.0 (dev/prod) : les href des onglets ne sont plus figés —
|
||||
l'hôte les injecte depuis sa config (draco_urls(), noms officiels
|
||||
par défaut, noms en -dev déclarés dans le .env de l'environnement). #}
|
||||
<link rel="stylesheet" href="/static/css/draco-alertes.css?v={{ asset_version }}">
|
||||
<header class="draco-bar" data-current="flowdeck">
|
||||
<div class="draco-bar-zone draco-bar-gauche">
|
||||
<button type="button" class="draco-icon-btn" data-act="rail" aria-label="Barre latérale">☰</button>
|
||||
@@ -63,9 +64,10 @@
|
||||
<script nonce="{{ csp_nonce() }}">
|
||||
/* Configuration Flowdeck de la barre commune (Fusion ACC-1.1).
|
||||
Phase 1 : navigation entre apps et domaine mémorisé localement ;
|
||||
le rail pilote le hamburger natif, les alertes ouvrent la cloche
|
||||
native de la page ; la recherche fédérée et Spark arrivent avec
|
||||
les phases suivantes du programme Fusion. */
|
||||
le rail pilote le hamburger natif, les alertes ouvrent le
|
||||
panneau draco-alertes.js (Fusion #69, agrégation à la demande,
|
||||
pas une fédération temps réel ; la cloche native reste le
|
||||
repli si le module ne charge pas). */
|
||||
window.DRACO_BAR_CONFIG = {
|
||||
current: "flowdeck",
|
||||
domain: (function () { try { return localStorage.getItem("draco_domain") || "pro"; } catch (e) { return "pro"; } })(),
|
||||
@@ -81,8 +83,8 @@
|
||||
if (act === "domaine") { try { localStorage.setItem("draco_domain", el.dataset.dom); } catch (e) { } return; }
|
||||
if (act === "rail") { var h = document.querySelector(".hamburger-btn"); if (h) h.click(); return; }
|
||||
if (act === "alertes") {
|
||||
var b = document.querySelector(".fd-notif-bell button");
|
||||
if (b) { b.click(); } else { dire("Alertes unifiées : arrive avec la fédération (programme Fusion)."); }
|
||||
if (window.DRACO_ALERTES) { window.DRACO_ALERTES.open(); }
|
||||
else { var b = document.querySelector(".fd-notif-bell button"); if (b) { b.click(); } }
|
||||
return;
|
||||
}
|
||||
if (act === "palette") { dire("Recherche fédérée ⌘K : arrive avec la fédération (programme Fusion)."); return; }
|
||||
@@ -100,3 +102,4 @@
|
||||
}
|
||||
};
|
||||
</script>
|
||||
<script src="/static/js/draco-alertes.js?v={{ asset_version }}"></script>
|
||||
|
||||
Reference in New Issue
Block a user