fix(draco): résolution dev/prod par l'hôte de la requête (7.82.4)
Le mode console du panneau restait une page morte sur flowdeck-dev : CSP frame-src/connect-src et DRACO_PANNEAU_CONFIG.agent_url pointaient l'agent prod (pas encore installée). Deux trous de la 7.82.3 : agent_url() sans aucune dérivation, et aucune résolution lisant l'hôte de la requête. Pour tout ce qui est rendu à une requête (barre/DRACO_URLS, iframe du panneau, CSP, boutons et redirections SSO) : explicite > hôte public de la requête (motif fermé ^(og|flowdeck|tiktak|kanbante|agent)(SUFFIXE).dracodev.net$, suffixe appliqué aux sœurs et à l'agent) > dérivation par les adresses de l'agent connues en config (élargie : agent_url() se dérive de l'URL d'événements explicite) > défaut officiel. L'hôte est posé par le middleware CSP dans un ContextVar (patron du nonce CSP) : iframe et CSP de la même réponse consomment la même origine résolue. Contextes sans requête inchangés sinon. Tests : +12 dans test_draco_urls_devprod.py (25/25) — Host dev sans aucun env → tout en -dev ; Host prod → officiels ; Host LAN → repli config/défauts ; explicite gagne sur l'hôte ; motif fermé. Suite complète : 4 failed / 26 errors identiques sur arbre propre (familles préexistantes MCP/realtime/my_tasks/gallery/sync).
This commit is contained in:
@@ -1,5 +1,54 @@
|
||||
# Changelog - FlowDeck
|
||||
|
||||
## v7.82.4 (2026-10-25) — Résolution dev/prod par l'hôte de la requête : le mode console du panneau revit en dev
|
||||
|
||||
- **Bug corrigé (dev)** : sur flowdeck-dev, le mode console du
|
||||
panneau Spark restait une page morte — prouvé en direct avant
|
||||
correctif : la 7.82.3 tournait bien (`GET /api/health` →
|
||||
`7.82.3`), mais sa CSP servait `frame-src 'self'
|
||||
https://agent.dracodev.net` (et `connect-src` idem), pointant
|
||||
l'agent **prod, pas encore installée**, et la source de l'iframe
|
||||
console (`DRACO_PANNEAU_CONFIG.agent_url`, rendue par
|
||||
`base.html`) valait la même origine morte. Deux trous laissés par
|
||||
la v7.82.3 : (1) `agent_url()` n'avait **aucune dérivation** —
|
||||
même avec `AGENT_EVENEMENTS_URL` en `-dev`, l'agent lui-même
|
||||
retombait sur le nom officiel ; (2) **aucune** résolution ne
|
||||
lisait l'hôte de la requête — un `.env` dev sans
|
||||
`DRACO_AGENT_URL` ni `AGENT_EVENEMENTS_URL` retombait
|
||||
entièrement sur la prod.
|
||||
- **Cure** (`app/services/draco_urls.py`, `app/middleware/security.py`) :
|
||||
pour tout ce qui est **rendu à une requête** (liens de la barre /
|
||||
`DRACO_URLS` servi, source de l'iframe du panneau, origine agent
|
||||
des CSP `frame-src`/`connect-src`, boutons et redirections SSO —
|
||||
émettrice via `DRACO_SSO_URL` résolu, callback =
|
||||
`OAUTH_REDIRECT_URI` dont l'origine est sa propre origine
|
||||
résolue), l'ordre de résolution devient : 1) variable explicite
|
||||
de l'installation, prioritaire et inchangée ; 2) **hôte public de
|
||||
la requête** (posé par le middleware CSP dans un `ContextVar`,
|
||||
même patron que le nonce CSP ; `X-Forwarded-Host` sinon `Host`) —
|
||||
motif fermé `^(og|flowdeck|tiktak|kanbante|agent)(<SUFFIXE>)\.dracodev\.net$`,
|
||||
suffixe optionnel (`-dev`, vide en prod) appliqué à toutes les
|
||||
sœurs **et à l'agent** ; jamais de suffixe inventé depuis un hôte
|
||||
arbitraire, hors motif (LAN, IP) on passe à la suite ; 3)
|
||||
dérivation par les adresses de l'agent connues en configuration,
|
||||
**élargie** (URL d'événements **ou** base du service — notamment
|
||||
`agent_url()` se dérive désormais de l'URL d'événements
|
||||
explicite) — aussi la résolution des contextes **sans requête**,
|
||||
inchangée sinon ; 4) défaut officiel. L'iframe du panneau et la
|
||||
CSP de la même réponse consomment la **même** origine résolue :
|
||||
les deux lisent `agent_url()` pendant la même requête.
|
||||
- Tests : `tests/test_draco_urls_devprod.py` +12 (25/25 au total) —
|
||||
requête `Host: flowdeck-dev.dracodev.net` et **aucune variable
|
||||
d'environnement** → barre, iframe, CSP et SSO rendus entièrement
|
||||
en `-dev` ; Host prod → noms officiels ; Host LAN → repli
|
||||
config/défauts ; explicite gagne sur l'hôte ; motif fermé
|
||||
(hôtes arbitraires → aucune dérivation) ; agent dérivé du seul
|
||||
`AGENT_EVENEMENTS_URL` ; contextes sans requête inchangés.
|
||||
Suite complète relue : **4 failed / 26 errors, identiques sur
|
||||
arbre propre** (1307 passed en propre ; familles préexistantes
|
||||
MCP/realtime/my_tasks/gallery/sync, sans rapport avec ce
|
||||
correctif) — 1319 passed avec le correctif. Ruff vert.
|
||||
|
||||
## v7.82.3 (2026-10-25) — URLs sœurs dérivées de l'environnement de l'agent
|
||||
|
||||
- **Bug corrigé (dev)** : les URL sœurs servies par `draco_urls()`
|
||||
|
||||
Reference in New Issue
Block a user