CORS recherche/alertes : allowlist soeurs prod+dev explicites (fusion #68/#69) #37

Merged
bruno merged 4 commits from cors-recherche-alertes-68-69 into main 2026-10-28 14:25:25 -04:00
Showing only changes of commit 409e67d57b - Show all commits
+12 -4
View File
@@ -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(