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
fix(ws): cookie-first auth, fall back to token only on 4001
The WS client always appended ?token=<bearer> to the URL, but the
server rejects query-token auth by default (WS_QUERY_TOKEN_ENABLED is
false). The httpOnly session cookie was already attached to the
handshake by the browser — cookie auth would have worked, the client
just never gave it a chance. Result: every connection rejected, "WS
Connection timeout" loop in dev tools.
- public/js/ws.js: prefer cookie-only on first attempt. If close 4001
AND a Bearer token exists, retry once with token-in-query. Reset
on successful open so a rotated token is re-tried correctly.
Also adds an inline "Update available" banner to the What's New page
header (between title and version+GitHub controls — same row, no
header growth) per user request.
Release: v7.3.5
-**WebSocket connection failures** (rejected by server with `WS rejected: query token auth disabled`). The client always appended `?token=<bearer>` to the WS URL, but the server rejects query-token auth by default for security (set `WS_QUERY_TOKEN_ENABLED=true` to allow). The session cookie (httpOnly `dd_sid`) was already attached to the WS handshake by the browser, so cookie auth would have worked — the client just never gave it a chance.
10
+
11
+
Now the client tries **cookie-only first**. Only if that closes with code 4001 (auth failed) AND a Bearer token is in `sessionStorage` does it fall back to token-in-query for one retry. This keeps the security default intact for everyone using cookies, while preserving the fallback for browsers that block them (Edge Tracking Prevention etc.). Reset to cookie-first on every successful open so a rotated token gets re-tried correctly. ([public/js/ws.js:6-25, 44-56, 68-91](public/js/ws.js))
12
+
13
+
### Added
14
+
15
+
-**Inline "Update available" banner** in the What's New page header. When `UpdateNotifier._state.hasUpdate === true`, a small accent-colored chip appears between the H2 and the version+GitHub controls — same row, no header growth. Click → opens the same release-notes modal as the sidebar badge. Hidden when up-to-date or feature disabled. ([public/js/pages/whatsnew.js:1369-1418](public/js/pages/whatsnew.js))
16
+
5
17
## [7.3.3] - 2026-04-25 — System → Updates surfaces app updates too
6
18
7
19
The v7.3.0 update notifier was reachable from the sidebar badge and System Settings → General — but **not** from System → Updates, which is the page users naturally reach for "is there an update for X?" That page only checked Docker Engine + OS updates, with the Docker Dash row showing only the running version (no comparison to GitHub latest).
title: 'WS cookie-first auth + What\'s New update banner',
16
+
changes: [
17
+
{type: 'fix',text: 'WebSocket failed to connect ("WS rejected: query token auth disabled" in server logs). The client always appended ?token=<bearer> to the WS URL, but the server rejects query-token auth by default for security. The session cookie (httpOnly dd_sid) was already attached to the WS handshake by the browser — cookie auth would have worked, the client just never tried it that way. Now: cookie-only first, fall back to token-in-query only after 4001. Reset on every successful open so token rotations get re-tried.'},
18
+
{type: 'feature',text: 'When a newer release is available on GitHub, the What\'s New page header shows a small accent-colored "Update available: vX.Y.Z" chip between the title and the version/GitHub controls. Same row, no header growth. Click → opens the release-notes modal.'},
0 commit comments