From 409e67d57b8ef6bc3e4ac76eebd8d85b15e501fe Mon Sep 17 00:00:00 2001 From: bruno Date: Wed, 28 Oct 2026 13:45:27 -0400 Subject: [PATCH] CORS recherche/alertes (fusion #68/#69) : allowlist soeurs prod+dev explicites --- app/recherche.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/app/recherche.py b/app/recherche.py index 381c520..0f8ba5d 100644 --- a/app/recherche.py +++ b/app/recherche.py @@ -9,9 +9,14 @@ testables sans base ni serveur. recherche Gitea de la page ``/search`` (titres + corps, tous états, tous projets du workspace) et la regroupe par dépôt. - La CORS bornée n'autorise que ``GET /api/search``, et seulement - pour les origines sœurs résolues par ``app.config`` (explicite > - hôte de la requête > dérivation > défaut officiel — donc ``-dev`` - reste ``-dev``), jamais ``*``. Le middleware est un ASGI pur : + pour les origines sœurs officielles **prod ET dev, listées + explicitement** (``PROD_ORIGINS | DEV_ORIGINS``), **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 + (prod OU dev), donc une page de l'autre environnement voyait sa + section afficher « Injoignable depuis cet hôte (CORS ou réseau) ». + Le middleware est un ASGI pur : il répond lui-même aux preflights OPTIONS (qui ne portent jamais de cookies, donc qu'``AuthMiddleware`` refuserait sinon) et ajoute les en-têtes aux réponses de recherche, sans toucher aux autres @@ -97,7 +102,10 @@ def sister_origins( origin = origin_of((resolved or {}).get(key)) if origin: origins.add(origin) - return frozenset(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 def cors_headers_for(