From dd979f81a798d323cd531b81ba99fb529a50908c Mon Sep 17 00:00:00 2001 From: bruno Date: Wed, 28 Oct 2026 13:45:42 -0400 Subject: [PATCH] CORS recherche/alertes (fusion #68/#69) : allowlist soeurs prod+dev explicites --- app/middleware/recherche_cors.py | 33 +++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/app/middleware/recherche_cors.py b/app/middleware/recherche_cors.py index ed2f323..0c6d029 100644 --- a/app/middleware/recherche_cors.py +++ b/app/middleware/recherche_cors.py @@ -8,15 +8,18 @@ Ce module n'autorise donc que : - le chemin ``/api/search`` (jamais les autres routes, jamais les écritures) ; -- les origines sœurs : celles résolues par - ``app.services.draco_urls.toutes()`` (explicite > hôte > dérivation - > défaut officiel), **plus** les origines prod ou ``-dev`` - officielles correspondant à l'hôte de la requête — ce second - ensemble est nécessaire car ce middleware s'exécute avant le - middleware CSP qui pose le contexte d'hôte de la requête pour - ``draco_urls`` ; sans lui, une page servie par ``flowdeck-dev`` - verrait ses sœurs ``-dev`` refusées quand la configuration seule - ne les déclare pas ; +- les origines sœurs : les origines officielles **prod ET dev, + listées explicitement** (``PROD_ORIGINS | DEV_ORIGINS``), **plus** + celles résolues par ``app.services.draco_urls.toutes()`` + (explicite > hôte > dérivation > défaut officiel) — jamais ``*``. + Correctif 2026-10-28 (fusion #68/#69, matrice constatée par + Bruno) : l'ancienne allowlist ne contenait que l'environnement + résolu (configuration seule, ce middleware s'exécutant avant le + middleware CSP qui pose le contexte d'hôte, plus l'environnement + de l'hôte de la requête) — jamais les deux à la fois. Une page + servie dans l'autre environnement voyait donc sa section + afficher « Injoignable depuis cet hôte (CORS ou réseau) », et + c'est Flowdeck qui échouait depuis tous les hôtes ; - avec credentials (le cookie SSO ``draco_session``, accepté par ``/api/search`` depuis cette livraison, ou la session native). @@ -105,12 +108,12 @@ def sister_origins(resolved: dict | None = None, request_host: str | None = None origin = origin_of((resolved or {}).get(key)) if origin: origins.add(origin) - if is_dev_host(request_host): - origins |= DEV_ORIGINS - elif is_prod_host(request_host): - origins |= PROD_ORIGINS - if not origins: - return PROD_ORIGINS | DEV_ORIGINS + # Correctif 2026-10-28 : prod ET dev toujours — ``request_host`` + # ne restreint plus l'allowlist (il ne servait qu'à ajouter + # 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 return frozenset(origins)