CORS recherche/alertes (fusion #68/#69) : allowlist soeurs prod+dev explicites
FlowDeck CI / lint (push) Failing after 0s
FlowDeck CI / test (push) Failing after 0s
FlowDeck CI / docker (push) Skipped

This commit is contained in:
2026-10-28 13:45:42 -04:00
parent c2df8d8c00
commit dd979f81a7
+18 -15
View File
@@ -8,15 +8,18 @@ Ce module n'autorise donc que :
- le chemin ``/api/search`` (jamais les autres routes, jamais les - le chemin ``/api/search`` (jamais les autres routes, jamais les
écritures) ; écritures) ;
- les origines sœurs : celles résolues par - les origines sœurs : les origines officielles **prod ET dev,
``app.services.draco_urls.toutes()`` (explicite > hôte > dérivation listées explicitement** (``PROD_ORIGINS | DEV_ORIGINS``), **plus**
> défaut officiel), **plus** les origines prod ou ``-dev`` celles résolues par ``app.services.draco_urls.toutes()``
officielles correspondant à l'hôte de la requête — ce second (explicite > hôte > dérivation > défaut officiel) — jamais ``*``.
ensemble est nécessaire car ce middleware s'exécute avant le Correctif 2026-10-28 (fusion #68/#69, matrice constatée par
middleware CSP qui pose le contexte d'hôte de la requête pour Bruno) : l'ancienne allowlist ne contenait que l'environnement
``draco_urls`` ; sans lui, une page servie par ``flowdeck-dev`` résolu (configuration seule, ce middleware s'exécutant avant le
verrait ses sœurs ``-dev`` refusées quand la configuration seule middleware CSP qui pose le contexte d'hôte, plus l'environnement
ne les déclare pas ; 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 - avec credentials (le cookie SSO ``draco_session``, accepté par
``/api/search`` depuis cette livraison, ou la session native). ``/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)) origin = origin_of((resolved or {}).get(key))
if origin: if origin:
origins.add(origin) origins.add(origin)
if is_dev_host(request_host): # Correctif 2026-10-28 : prod ET dev toujours — ``request_host``
origins |= DEV_ORIGINS # ne restreint plus l'allowlist (il ne servait qu'à ajouter
elif is_prod_host(request_host): # l'environnement de la requête, désormais inclus d'office).
origins |= PROD_ORIGINS # ``resolved`` n'ajoute que des origines de configuration sans
if not origins: # jamais retirer une origine officielle.
return PROD_ORIGINS | DEV_ORIGINS origins |= PROD_ORIGINS | DEV_ORIGINS
return frozenset(origins) return frozenset(origins)