Compare commits

..
Author SHA1 Message Date
bruno 5d10b02537 Tests Kanbante : origines agent en CORS recherche
CI / test (push) Failing after 0s
CI / test (pull_request) Failing after 0s
2026-10-28 16:06:14 -04:00
bruno 739672f0cc Kanbante : CORS recherche autorise les origines agent (federation console, defaut 2)
CI / test (push) Failing after 0s
2026-10-28 16:06:12 -04:00
bruno 1b1c793919 Bump Kanbante 0.37.5 : changelog (alignement recherche console #68)
CI / test (push) Failing after 1s
2026-10-28 15:06:49 -04:00
bruno d11ca0cbff Bump Kanbante 0.37.5 (alignement recherche console #68)
CI / test (push) Failing after 0s
2026-10-28 15:06:45 -04:00
bruno 0e2df86be5 Merge pull request 'recherche : onglet Console Spark sur GET /api/v1/recherche (alignement)' (#41) from align-recherche-console into main
CI / test (push) Failing after 1s
2026-10-28 15:04:21 -04:00
4 changed files with 38 additions and 3 deletions
+4
View File
@@ -1,3 +1,7 @@
## 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.
## 0.37.4 — 2026-10-28 — Correctifs recherche/alertes/console : CORS sœurs prod+dev, recherche en onglets, alertes en onglets
- **CORS recherche/alertes (#68/#69)** : allowlist explicite des 8 origines sœurs prod+dev (`*.dracodev.net`, avec et sans `-dev`), jamais `*`, avec credentials — pour `app/recherche.py` et le middleware CORS de `GET /api/events`.
+1 -1
View File
@@ -177,7 +177,7 @@ from urllib.parse import urlparse
BASE_DIR = Path(__file__).resolve().parent.parent
APP_VERSION = "0.37.4"
APP_VERSION = "0.37.5"
def _env_bool(name: str, default: bool) -> bool:
+12 -2
View File
@@ -11,6 +11,8 @@ testables sans base ni serveur.
- 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 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
@@ -43,6 +45,14 @@ 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")
@@ -96,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))
@@ -105,7 +115,7 @@ def sister_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
return frozenset(origins) | PROD_ORIGINS | DEV_ORIGINS | AGENT_ORIGINS
def cors_headers_for(
+21
View File
@@ -45,6 +45,8 @@ def test_sister_origins_dev():
"https://flowdeck-dev.dracodev.net",
"https://tiktak-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(
{}, 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()