From 739672f0cc90b814a57803c7f65e510fa8885baa Mon Sep 17 00:00:00 2001 From: bruno Date: Wed, 28 Oct 2026 16:06:12 -0400 Subject: [PATCH 1/2] Kanbante : CORS recherche autorise les origines agent (federation console, defaut 2) --- app/recherche.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/app/recherche.py b/app/recherche.py index 0f8ba5d..3e14864 100644 --- a/app/recherche.py +++ b/app/recherche.py @@ -11,6 +11,8 @@ testables sans base ni serveur. - La CORS bornée n'autorise que ``GET /api/search``, et seulement pour les origines sœurs 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** les origines résolues par ``app.config`` — jamais ``*``. Correctif 2026-10-28 (fusion #68/#69, matrice constatée par Bruno) : l'ancienne allowlist ne contenait que l'environnement résolu @@ -43,6 +45,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 du dictionnaire rendu par render() (app/main.py). _SOEUR_KEYS = ("obsigate", "flowdeck", "tiktak", "kanbante") @@ -96,7 +106,7 @@ def sister_origins( "kanbante": urls.public_url, } except Exception: - return PROD_ORIGINS | DEV_ORIGINS + return PROD_ORIGINS | DEV_ORIGINS | AGENT_ORIGINS origins = set() for key in _SOEUR_KEYS: origin = origin_of((resolved or {}).get(key)) @@ -105,7 +115,7 @@ def sister_origins( # Correctif 2026-10-28 : prod ET dev toujours, quelle que soit # la résolution — ``resolved`` n'ajoute que des origines de # configuration sans jamais retirer une origine officielle. - return frozenset(origins) | PROD_ORIGINS | DEV_ORIGINS + return frozenset(origins) | PROD_ORIGINS | DEV_ORIGINS | AGENT_ORIGINS def cors_headers_for( -- 2.54.0 From 5d10b02537bb38197bf9cb66414bfee783b8d02b Mon Sep 17 00:00:00 2001 From: bruno Date: Wed, 28 Oct 2026 16:06:14 -0400 Subject: [PATCH 2/2] Tests Kanbante : origines agent en CORS recherche --- tests/test_recherche.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/tests/test_recherche.py b/tests/test_recherche.py index a484bcc..99b2ade 100644 --- a/tests/test_recherche.py +++ b/tests/test_recherche.py @@ -45,6 +45,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", } @@ -107,3 +109,22 @@ def test_sister_origins_hote_requete(): assert "https://og-dev.dracodev.net" in sister_origins( {}, request_host="kanbante.dracodev.net" ) + + +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