Kanbante : CORS recherche autorise les origines agent (federation console, defaut 2) #42
+12
-2
@@ -11,6 +11,8 @@ testables sans base ni serveur.
|
|||||||
- 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 officielles **prod ET dev, listées
|
pour les origines sœurs officielles **prod ET dev, listées
|
||||||
explicitement** (``PROD_ORIGINS | DEV_ORIGINS``), **plus** les
|
explicitement** (``PROD_ORIGINS | DEV_ORIGINS``), **plus** les
|
||||||
|
origines du service d'agents (``AGENT_ORIGINS`` : console Spark
|
||||||
|
prod ET dev — fédération console, défaut 2), **plus** les
|
||||||
origines résolues par ``app.config`` — jamais ``*``. Correctif
|
origines résolues par ``app.config`` — jamais ``*``. Correctif
|
||||||
2026-10-28 (fusion #68/#69, matrice constatée par Bruno) :
|
2026-10-28 (fusion #68/#69, matrice constatée par Bruno) :
|
||||||
l'ancienne allowlist ne contenait que l'environnement résolu
|
l'ancienne allowlist ne contenait que l'environnement résolu
|
||||||
@@ -43,6 +45,14 @@ DEV_ORIGINS = frozenset({
|
|||||||
"https://tiktak-dev.dracodev.net",
|
"https://tiktak-dev.dracodev.net",
|
||||||
"https://kanbante-dev.dracodev.net",
|
"https://kanbante-dev.dracodev.net",
|
||||||
})
|
})
|
||||||
|
# Origines du service d'agents (console Spark) : la page de
|
||||||
|
# recherche de la console appelle /api/search depuis le navigateur
|
||||||
|
# avec le cookie SSO — sans ces deux origines, le navigateur refuse
|
||||||
|
# la lecture (fédération console, défaut 2). Jamais "*".
|
||||||
|
AGENT_ORIGINS = frozenset({
|
||||||
|
"https://agent.dracodev.net",
|
||||||
|
"https://agent-dev.dracodev.net",
|
||||||
|
})
|
||||||
|
|
||||||
# Clés du dictionnaire rendu par render() (app/main.py).
|
# Clés du dictionnaire rendu par render() (app/main.py).
|
||||||
_SOEUR_KEYS = ("obsigate", "flowdeck", "tiktak", "kanbante")
|
_SOEUR_KEYS = ("obsigate", "flowdeck", "tiktak", "kanbante")
|
||||||
@@ -96,7 +106,7 @@ def sister_origins(
|
|||||||
"kanbante": urls.public_url,
|
"kanbante": urls.public_url,
|
||||||
}
|
}
|
||||||
except Exception:
|
except Exception:
|
||||||
return PROD_ORIGINS | DEV_ORIGINS
|
return PROD_ORIGINS | DEV_ORIGINS | AGENT_ORIGINS
|
||||||
origins = set()
|
origins = set()
|
||||||
for key in _SOEUR_KEYS:
|
for key in _SOEUR_KEYS:
|
||||||
origin = origin_of((resolved or {}).get(key))
|
origin = origin_of((resolved or {}).get(key))
|
||||||
@@ -105,7 +115,7 @@ def sister_origins(
|
|||||||
# Correctif 2026-10-28 : prod ET dev toujours, quelle que soit
|
# Correctif 2026-10-28 : prod ET dev toujours, quelle que soit
|
||||||
# la résolution — ``resolved`` n'ajoute que des origines de
|
# la résolution — ``resolved`` n'ajoute que des origines de
|
||||||
# configuration sans jamais retirer une origine officielle.
|
# configuration sans jamais retirer une origine officielle.
|
||||||
return frozenset(origins) | PROD_ORIGINS | DEV_ORIGINS
|
return frozenset(origins) | PROD_ORIGINS | DEV_ORIGINS | AGENT_ORIGINS
|
||||||
|
|
||||||
|
|
||||||
def cors_headers_for(
|
def cors_headers_for(
|
||||||
|
|||||||
@@ -45,6 +45,8 @@ def test_sister_origins_dev():
|
|||||||
"https://flowdeck-dev.dracodev.net",
|
"https://flowdeck-dev.dracodev.net",
|
||||||
"https://tiktak-dev.dracodev.net",
|
"https://tiktak-dev.dracodev.net",
|
||||||
"https://kanbante-dev.dracodev.net",
|
"https://kanbante-dev.dracodev.net",
|
||||||
|
"https://agent.dracodev.net",
|
||||||
|
"https://agent-dev.dracodev.net",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -107,3 +109,22 @@ def test_sister_origins_hote_requete():
|
|||||||
assert "https://og-dev.dracodev.net" in sister_origins(
|
assert "https://og-dev.dracodev.net" in sister_origins(
|
||||||
{}, request_host="kanbante.dracodev.net"
|
{}, request_host="kanbante.dracodev.net"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_origines_agent_console():
|
||||||
|
# Fédération console (défaut 2) : la page de recherche de la
|
||||||
|
# console appelle /api/search depuis agent(. -dev) avec le
|
||||||
|
# cookie SSO — ces deux origines passent, prod ET dev, quelle
|
||||||
|
# que soit la résolution ; un tiers reste refusé.
|
||||||
|
assert cors_headers_for(
|
||||||
|
"https://agent.dracodev.net", RESOLVED_DEV) is not None
|
||||||
|
assert cors_headers_for(
|
||||||
|
"https://agent-dev.dracodev.net", {}) is not None
|
||||||
|
assert cors_headers_for(
|
||||||
|
"https://agent.dracodev.net",
|
||||||
|
RESOLVED_DEV)["Access-Control-Allow-Credentials"] == "true"
|
||||||
|
assert preflight_headers(
|
||||||
|
"https://agent-dev.dracodev.net", RESOLVED_DEV) is not None
|
||||||
|
assert "https://agent.dracodev.net" in sister_origins({})
|
||||||
|
assert "https://agent-dev.dracodev.net" in sister_origins({})
|
||||||
|
assert "https://agent-dev.dracodev.net" in sister_origins()
|
||||||
|
|||||||
Reference in New Issue
Block a user