fix: A20 phase 2 — chart/leaflet vendorisés + connect-src fermé (v7.27.0)
- Vendorisation : chart.js 4.5.1 + leaflet 1.9 (leaflet.js, leaflet.css,
5 images marker/layer) vers static/js/vendor/ (déjà ignoré par eslint) ;
les 3 URL CDN des vues chart/map (collections.py) pointent en local →
la CSP n'a plus AUCUN hôte tiers dans script-src ni style-src.
- connect-src fermé : `'self' ws://{host} wss://{host}` — Host de la
requête (uvicorn rejette déjà les Host invalides) + filtrage des
caractères hors base URL. Le `https:` universel (canal d'exfil) et les
ws:/wss: tout-hôtes disparaissent. Grep négatif : 0 fetch cross-origin
côté front.
- Google Fonts : entrées CSP mortes (0 référence dans le code) retirées
de style-src/font-src.
- img-src https: CONSERVÉ volontairement (unfurls YouTube/Vimeo… + tuiles
OSM inénumérables) — ponytail: commenté dans security.py.
Tests : test_csp_no_cdn_and_vendor (CSP sans CDN/Google, connect-src
exact 'self' ws://testserver wss://testserver, 4 assets vendor 200,
source collections.py sans CDN) + test_view_chart_renders mis à jour
(chemin vendor). Suite complète 1090/1090 (1089 + 1).
Reste A20 : unsafe-eval (Alpine x-data + htmx hx-on/hx-vars = eval)
→ build @alpinejs/csp + couverture E2E des vues d'abord (même logique
que la décision A39).
suite **1090/1090** · ruff OK · docs à jour
This commit is contained in:
@@ -1,5 +1,36 @@
|
||||
# Changelog - FlowDeck
|
||||
|
||||
## v7.27.0 (2026-10-01) — Audit : A20 phase 2 (CDN retiré, connect-src fermé)
|
||||
|
||||
### Changed
|
||||
|
||||
- **Vendorisation** : chart.js 4.5.1 + leaflet 1.9 (js, css, 5 images
|
||||
marker/layer) téléchargés vers `static/js/vendor/` ; les 3 URL CDN des
|
||||
vues chart/map (`collections.py`) pointent en local → **la CSP n'a plus
|
||||
aucun hôte tiers** dans `script-src` ni `style-src`
|
||||
- **`connect-src` fermé** : `'self' ws://{host} wss://{host}` (Host de la
|
||||
requête, caractères hors base URL filtrés) — le `https:` universel
|
||||
(canal d'exfil JS) et les `ws:`/`wss:` tout-hôtes disparaissent.
|
||||
Grep négatif : 0 fetch cross-origin côté front
|
||||
- **Google Fonts** : entrées CSP mortes (0 référence dans le code) retirées
|
||||
de `style-src`/`font-src`
|
||||
- `img-src https:` **conservé volontairement** (unfurls YouTube/Vimeo… et
|
||||
tuiles OSM inénumérables) — `ponytail:` commenté dans `security.py`
|
||||
|
||||
### Tests
|
||||
|
||||
- `test_csp_no_cdn_and_vendor` : CSP sans CDN/Google, connect-src exact
|
||||
(`'self' ws://testserver wss://testserver`), 4 assets vendor servis (200),
|
||||
source `collections.py` sans référence CDN
|
||||
- `test_view_chart_renders` : assert sur le chemin vendor
|
||||
- Suite complète : **1090/1090**
|
||||
|
||||
### Notes
|
||||
|
||||
- Reste A20 : `unsafe-eval` (Alpine x-data + htmx hx-on/hx-vars = eval)
|
||||
→ build `@alpinejs/csp` + couverture E2E des vues d'abord (même logique
|
||||
que la décision A39)
|
||||
|
||||
## v7.26.0 (2026-10-01) — Audit : A21 phase 2c (190 routes hors loop)
|
||||
|
||||
### Changed
|
||||
|
||||
Reference in New Issue
Block a user