• fix: A20 phase 2 — chart/leaflet vendorisés + connect-src fermé (v7.27.0)
    FlowDeck CI / lint (push) Successful in 1m54s
    FlowDeck CI / docker (push) Canceled after 0s
    FlowDeck CI / test (push) Canceled after 10m41s

    bruno released this 2026-10-01 22:49:48 -04:00 | 93 commits to main since this release

    • 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

    Downloads