CORS recherche/alertes (fusion #68/#69) : allowlist soeurs prod+dev explicites
CI / test (push) Failing after 3m51s

This commit is contained in:
2026-10-28 13:45:27 -04:00
parent 1234429a46
commit 409e67d57b
+12 -4
View File
@@ -9,9 +9,14 @@ testables sans base ni serveur.
recherche Gitea de la page ``/search`` (titres + corps, tous états, recherche Gitea de la page ``/search`` (titres + corps, tous états,
tous projets du workspace) et la regroupe par dépôt. tous projets du workspace) et la regroupe par dépôt.
- La CORS bornée n'autorise que ``GET /api/search``, et seulement - La CORS bornée n'autorise que ``GET /api/search``, et seulement
pour les origines sœurs résolues par ``app.config`` (explicite > pour les origines sœurs officielles **prod ET dev, listées
hôte de la requête > dérivation > défaut officiel — donc ``-dev`` explicitement** (``PROD_ORIGINS | DEV_ORIGINS``), **plus** les
reste ``-dev``), jamais ``*``. Le middleware est un ASGI pur : 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 il répond lui-même aux preflights OPTIONS (qui ne portent jamais
de cookies, donc qu'``AuthMiddleware`` refuserait sinon) et ajoute de cookies, donc qu'``AuthMiddleware`` refuserait sinon) et ajoute
les en-têtes aux réponses de recherche, sans toucher aux autres 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)) origin = origin_of((resolved or {}).get(key))
if origin: if origin:
origins.add(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( def cors_headers_for(