From 5180c31b6ccee6ca40669388f8c5acbedee840ca Mon Sep 17 00:00:00 2001 From: bruno Date: Wed, 28 Oct 2026 16:06:17 -0400 Subject: [PATCH 1/2] ObsiGate : CORS recherche autorise les origines agent (federation console, defaut 2) --- backend/recherche_cors.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/backend/recherche_cors.py b/backend/recherche_cors.py index 14a3366..125a44d 100644 --- a/backend/recherche_cors.py +++ b/backend/recherche_cors.py @@ -10,6 +10,8 @@ Ce module n'autorise donc que : écritures) ; - les origines sœurs : les origines officielles **prod ET dev, listées explicitement** (``PROD_ORIGINS | DEV_ORIGINS``), **plus** + les origines du service d'agents (``AGENT_ORIGINS`` : console + Spark prod ET dev — fédération console, défaut 2), **plus** celles de ``backend.draco_config`` (``urls_publiques()`` : explicite > dérivation par l'hôte de l'agent > défaut officiel) — jamais ``*``. Correctif 2026-10-28 (fusion #68/#69, matrice @@ -48,6 +50,14 @@ DEV_ORIGINS = frozenset({ "https://tiktak-dev.dracodev.net", "https://kanbante-dev.dracodev.net", }) +# Origines du service d'agents (console Spark) : la page de +# recherche de la console appelle /api/search depuis le navigateur +# avec le cookie SSO — sans ces deux origines, le navigateur refuse +# la lecture (fédération console, défaut 2). Jamais "*". +AGENT_ORIGINS = frozenset({ + "https://agent.dracodev.net", + "https://agent-dev.dracodev.net", +}) # Clés de draco_config.urls_publiques() qui sont des applications sœurs. _SOEUR_KEYS = ("obsigate", "flowdeck", "tiktak", "kanbante") @@ -113,7 +123,7 @@ def sister_origins(resolved: dict | None = None, request_host: str | None = None # l'environnement de la requête, désormais inclus d'office). # ``resolved`` n'ajoute que des origines de configuration sans # jamais retirer une origine officielle. - origins |= PROD_ORIGINS | DEV_ORIGINS + origins |= PROD_ORIGINS | DEV_ORIGINS | AGENT_ORIGINS return frozenset(origins) -- 2.54.0 From 2579ec610e7b6d147ca8a04d46a384c1db3a3b23 Mon Sep 17 00:00:00 2001 From: bruno Date: Wed, 28 Oct 2026 16:06:19 -0400 Subject: [PATCH 2/2] Tests ObsiGate : origines agent en CORS recherche --- tests/test_recherche_cors.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/tests/test_recherche_cors.py b/tests/test_recherche_cors.py index 5ee067a..149dc21 100644 --- a/tests/test_recherche_cors.py +++ b/tests/test_recherche_cors.py @@ -49,6 +49,8 @@ def test_sister_origins_dev(): "https://flowdeck-dev.dracodev.net", "https://tiktak-dev.dracodev.net", "https://kanbante-dev.dracodev.net", + "https://agent.dracodev.net", + "https://agent-dev.dracodev.net", } @@ -83,3 +85,22 @@ def test_preflight_headers(): headers = preflight_headers("https://flowdeck-dev.dracodev.net", RESOLVED_DEV) assert headers["Access-Control-Allow-Methods"] == "GET, OPTIONS" assert preflight_headers("https://evil.example", RESOLVED_DEV) is None + + +def test_origines_agent_console(): + # Fédération console (défaut 2) : la page de recherche de la + # console appelle /api/search depuis agent(. -dev) avec le + # cookie SSO — ces deux origines passent, prod ET dev, quelle + # que soit la résolution ; un tiers reste refusé. + assert cors_headers_for( + "https://agent.dracodev.net", RESOLVED_DEV) is not None + assert cors_headers_for( + "https://agent-dev.dracodev.net", {}) is not None + assert cors_headers_for( + "https://agent.dracodev.net", + RESOLVED_DEV)["Access-Control-Allow-Credentials"] == "true" + assert preflight_headers( + "https://agent-dev.dracodev.net", RESOLVED_DEV) is not None + assert "https://agent.dracodev.net" in sister_origins({}) + assert "https://agent-dev.dracodev.net" in sister_origins({}) + assert "https://agent-dev.dracodev.net" in sister_origins() -- 2.54.0