Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5d10b02537 | ||
|
|
739672f0cc |
@@ -1,7 +1,3 @@
|
||||
## 0.37.6 — 2026-10-28 — Corrections console/recherche : CORS console Spark
|
||||
|
||||
- **CORS recherche (PR #43)** : la recherche Kanbante autorise désormais la console Spark (agent prod+dev) en inter-origines — les pages console peuvent appeler la recherche de l'hôte sans erreur CORS/réseau.
|
||||
|
||||
## 0.37.5 — 2026-10-28 — Alignement recherche console : onglet Console Spark sur /api/v1/recherche
|
||||
|
||||
- **Recherche (#68)** : l'onglet Console Spark de `/recherche` appelle désormais `GET /api/v1/recherche` (au lieu de `/api/search`) et reconstruit les liens profonds console (`?section=…&objet=…`, `disc=`, `activite=`) — les résultats console réels s'affichent enfin dans la page hôte.
|
||||
|
||||
+1
-1
@@ -177,7 +177,7 @@ from urllib.parse import urlparse
|
||||
|
||||
BASE_DIR = Path(__file__).resolve().parent.parent
|
||||
|
||||
APP_VERSION = "0.37.6"
|
||||
APP_VERSION = "0.37.5"
|
||||
|
||||
|
||||
def _env_bool(name: str, default: bool) -> bool:
|
||||
|
||||
+8
-7
@@ -10,10 +10,9 @@ testables sans base ni serveur.
|
||||
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 officielles **prod ET dev, listées
|
||||
explicitement** (``PROD_ORIGINS | DEV_ORIGINS``), **plus les
|
||||
origines de la console Spark** (``AGENT_ORIGINS`` : agent prod ET
|
||||
dev — fédération de la recherche depuis la console, 2026-10-28),
|
||||
**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
|
||||
2026-10-28 (fusion #68/#69, matrice constatée par Bruno) :
|
||||
l'ancienne allowlist ne contenait que l'environnement résolu
|
||||
@@ -46,13 +45,15 @@ DEV_ORIGINS = frozenset({
|
||||
"https://tiktak-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).
|
||||
_SOEUR_KEYS = ("obsigate", "flowdeck", "tiktak", "kanbante")
|
||||
|
||||
@@ -105,7 +106,7 @@ def sister_origins(
|
||||
"kanbante": urls.public_url,
|
||||
}
|
||||
except Exception:
|
||||
return PROD_ORIGINS | DEV_ORIGINS
|
||||
return PROD_ORIGINS | DEV_ORIGINS | AGENT_ORIGINS
|
||||
origins = set()
|
||||
for key in _SOEUR_KEYS:
|
||||
origin = origin_of((resolved or {}).get(key))
|
||||
|
||||
+20
-14
@@ -34,7 +34,7 @@ def test_origin_of():
|
||||
|
||||
|
||||
def test_sister_origins_dev():
|
||||
# Correctif 2026-10-28 : 10 origines officielles (8 sœurs + 2 agent), prod ET dev,
|
||||
# Correctif 2026-10-28 : 8 origines officielles, prod ET dev,
|
||||
# quelle que soit la résolution.
|
||||
assert sister_origins(RESOLVED_DEV) == {
|
||||
"https://og.dracodev.net",
|
||||
@@ -50,19 +50,6 @@ def test_sister_origins_dev():
|
||||
}
|
||||
|
||||
|
||||
|
||||
def test_cors_headers_agent_console_autorise():
|
||||
# Fédération depuis la console (2026-10-28) : les origines agent
|
||||
# prod ET dev passent, avec credentials ; un tiers reste refusé.
|
||||
for origine in ("https://agent.dracodev.net",
|
||||
"https://agent-dev.dracodev.net"):
|
||||
headers = cors_headers_for(origine, RESOLVED_DEV)
|
||||
assert headers is not None
|
||||
assert headers["Access-Control-Allow-Origin"] == origine
|
||||
assert headers["Access-Control-Allow-Credentials"] == "true"
|
||||
assert cors_headers_for("https://agent.dracodev.net.evil.example",
|
||||
RESOLVED_DEV) is None
|
||||
|
||||
def test_cors_headers():
|
||||
headers = cors_headers_for("https://tiktak-dev.dracodev.net", RESOLVED_DEV)
|
||||
assert headers["Access-Control-Allow-Origin"] == "https://tiktak-dev.dracodev.net"
|
||||
@@ -122,3 +109,22 @@ def test_sister_origins_hote_requete():
|
||||
assert "https://og-dev.dracodev.net" in sister_origins(
|
||||
{}, 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