You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The PWA service worker ships a dar:purge message handler (#200/#208 — verifies origin, deletes all dar:v1:* caches). But nothing on the frontend sends it, and the SPA has no logout affordance at all (login #190 landed; logout did not). grep for dar:purge / caches.delete / client.logout in frontend/apps/web/src returns nothing.
Risk
Low today. Every API read is Cache-Control: no-store, so the SW never caches a payload — there's nothing to leak to a later user of the same browser. This is an incomplete defense-in-depth control, not an active vulnerability. It becomes load-bearing the moment a consumer opts into any cacheable read policy (the proposed PWA_API_CACHE_SECONDS).
Security review follow-up (recent-code review, 2026-05-27).
The PWA service worker ships a
dar:purgemessage handler (#200/#208 — verifies origin, deletes alldar:v1:*caches). But nothing on the frontend sends it, and the SPA has no logout affordance at all (login #190 landed; logout did not).grepfordar:purge/caches.delete/client.logoutinfrontend/apps/web/srcreturns nothing.Risk
Low today. Every API read is
Cache-Control: no-store, so the SW never caches a payload — there's nothing to leak to a later user of the same browser. This is an incomplete defense-in-depth control, not an active vulnerability. It becomes load-bearing the moment a consumer opts into any cacheable read policy (the proposedPWA_API_CACHE_SECONDS).What's owed (frontend, ~small)
A logout flow in the SPA that, on logout:
client.logout()(the JSON endpoint exists, feat(auth): package serves its own login — replaces admin login when admin is off #168).navigator.serviceWorker.controller?.postMessage({ type: 'dar:purge' })— fires the SW handler.dar:localStorage namespace (theclearAll()helper noted in@dar/dataREADME).Plus a Logout affordance in the user menu / sidebar (Django-admin parity — the admin has logout).
Out of scope
The SW-side handler is already done (#200). This is purely the frontend trigger + UX.
— filed by the Security & Compliance Lead during the recent-code review.