diff --git a/app/middleware/security.py b/app/middleware/security.py index 1a65711..0541cf6 100644 --- a/app/middleware/security.py +++ b/app/middleware/security.py @@ -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