From fc3e61f266e5be3a7467a77773dd4b897cbe566e Mon Sep 17 00:00:00 2001 From: bruno Date: Wed, 28 Oct 2026 12:11:46 -0400 Subject: [PATCH] Recherche partout (#68) : Recherche-partout-68-CSP --- app/middleware/security.py | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/app/middleware/security.py b/app/middleware/security.py index 1a65711..12b647f 100644 --- a/app/middleware/security.py +++ b/app/middleware/security.py @@ -174,9 +174,29 @@ class ContentSecurityPolicyMiddleware(BaseHTTPMiddleware): request.headers.get("host", "")) agent = re.sub(r"[^0-9A-Za-z.\-:/]", "", draco_urls.origine(draco_urls.agent_url())) - response.headers[self.CSP_HEADER] = self.CSP_VALUE.format( + csp = self.CSP_VALUE.format( nonce=nonce, host=host, agent=agent ) + # Recherche partout (#68) : la page /recherche appelle les + # API de recherche des sœurs depuis le navigateur — sa + # connect-src doit les nommer, sinon le navigateur bloque + # les appels avant même CORS. Les autres pages gardent la + # CSP inchangée. `draco_urls` est déjà importé dans ce + # dispatch (contexte d'hôte posé plus haut). + if request.url.path == "/recherche": + try: + soeurs = " ".join(sorted({ + draco_urls.origine(draco_urls.toutes()[k]) + for k in ("obsigate", "tiktak", "kanbante") + })) + csp = csp.replace( + "connect-src 'self' " + agent + " ", + "connect-src 'self' " + agent + " " + soeurs + " ", + 1, + ) + except Exception: + pass + response.headers[self.CSP_HEADER] = csp return response @@ -288,3 +308,4 @@ class RateLimitMiddleware(BaseHTTPMiddleware): for k in expired: del self._store[k] self._last_prune = now +