recherche: jeton URL_AGENT + connect-src agent pour la page /recherche
CI / lint (pull_request) Failing after 3s
CI / security (pull_request) Failing after 2s
CI / test (pull_request) Skipped
CI / build (pull_request) Skipped
CI / e2e (pull_request) Skipped

This commit is contained in:
2026-10-28 14:45:13 -04:00
parent 03e8abf8c8
commit e4da00cf17
+12 -7
View File
@@ -966,12 +966,15 @@ if FRONTEND_DIR.exists():
frontend/recherche.html est servi avec les jetons {{URL_*}} frontend/recherche.html est servi avec les jetons {{URL_*}}
remplacés par urls_publiques() (même contrat que le fragment remplacés par urls_publiques() (même contrat que le fragment
de barre) et le nonce CSP frais ; la réponse pose sa propre de barre, jeton {{URL_AGENT}} inclus pour l'onglet Console
CSP (préservée par SecurityHeadersMiddleware, qui ne la pose Spark de la barre re-vendangée) et le nonce CSP frais ; la
que si elle est absente) dont le connect-src autorise les réponse pose sa propre CSP (préservée par
origines sœurs — sinon le navigateur bloquerait les appels SecurityHeadersMiddleware, qui ne la pose que si elle est
sœurs avant même CORS. La CSP par défaut (same-origin) reste absente) dont le connect-src autorise les origines sœurs ET
inchangée pour toutes les autres pages. l'origine de l'agent — sinon le navigateur bloquerait les
appels sœurs et l'appel console (onglet Console Spark,
GET /api/v1/recherche) avant même CORS. La CSP par défaut
(same-origin) reste inchangée pour toutes les autres pages.
""" """
import json as _json import json as _json
@@ -989,6 +992,7 @@ if FRONTEND_DIR.exists():
("{{URL_FLOWDECK}}", "flowdeck"), ("{{URL_FLOWDECK}}", "flowdeck"),
("{{URL_TIKTAK}}", "tiktak"), ("{{URL_TIKTAK}}", "tiktak"),
("{{URL_KANBANTE}}", "kanbante"), ("{{URL_KANBANTE}}", "kanbante"),
("{{URL_AGENT}}", "agent"),
): ):
html = html.replace(jeton, urls.get(cle, "")) html = html.replace(jeton, urls.get(cle, ""))
script = ( script = (
@@ -1003,7 +1007,8 @@ if FRONTEND_DIR.exists():
html = inject_csp_nonce(html, request.state.csp_nonce) html = inject_csp_nonce(html, request.state.csp_nonce)
soeurs = " ".join(sorted({ soeurs = " ".join(sorted({
origin_of(urls.get(cle, "")) or "" origin_of(urls.get(cle, "")) or ""
for cle in ("obsigate", "flowdeck", "tiktak", "kanbante") for cle in ("obsigate", "flowdeck", "tiktak", "kanbante",
"agent")
} - {""})) } - {""}))
csp = ( csp = (
"default-src 'self'; " "default-src 'self'; "