This is a pre-release. djust 0.9.0 has shipped since: read the djust 0.9.0 release notes.
Fixed
server_pushnow stores_recovery_html/_recovery_versionafter broadcast renders (#1202) — push-driven sessions previously left recovery state unset, so a clientrequest_htmlafter a failed VDOM patch (e.g.{% if %}shifting DOM structure on a broadcast) returnedrecoverable=falseand force-reloaded the page.server_pushnow mirrors thehandle_eventpattern of populating_recovery_html/_recovery_versionimmediately before dispatching the broadcast patches. Added 3 regression cases intests/unit/test_server_push.py(single-push, multi-push refresh, no-op-push leaves recovery state intact).
Security
- Code-scanning cleanup batch (4 fixes + 15 false-positive dismissals) — 19 open CodeQL / Dependabot alerts addressed:
- JS open-redirect defense-in-depth (
src/03-websocket.js:519): the fallbackwindow.location.href = nav.topath now validates the target is a same-origin absolute path. Rejects protocol-relative URLs (//evil.com), absolute URLs to other origins, andjavascript:/data:schemes. Closes CodeQL #2195. - postcss bumped 8.5.9 → 8.5.10 in
package-lock.json— transitive via vitest → vite. Closes Dependabot #90 (XSS via unescaped</style>in CSS stringify output, GHSA). - Empty
except AttributeError: passinmixins/sticky.py:210now logs at DEBUG with a comment explaining the expected case (read-only proxy children that can't accept arequestattr). Closes CodeQL #2194. - Duplicate
import asyncioinmixins/request.py:322removed — module already imports asyncio at line 5. Closes CodeQL #2267. - 15 false-positive dismissals with documented reasoning:
- 8× py/log-injection (#2254, #2253, #2239, #2238, #2237, #2236, #2235, #2183) — log calls already pass user-controlled input through
sanitize_for_log()(the analyzer doesn't recognize the sanitizer). - 2× py/cyclic-import (#2231, #2230) — intentional lazy late-imports to break circular deps.
- 1× py/not-named-self (#2268) —
as_viewis a@classonlymethod;clsis correct. - 2× py/unused-global-variable (#2272, #2175) — both are referenced multiple times (
_CUSTOM_FILTERS_BRIDGEDx4,_GCS_CHUNK_MIN_SIZEx3). - 1× py/catch-base-exception (#2273) — diagnostic CI script that must catch SystemExit subclasses; documented via
noqa: BLE001. - 1× js/useless-assignment (#2174) — minified bundle artifact, not source; the 52 source modules in
static/djust/src/are authoritative.
- 8× py/log-injection (#2254, #2253, #2239, #2238, #2237, #2236, #2235, #2183) — log calls already pass user-controlled input through
- JS open-redirect defense-in-depth (