screentinker/frontend/js/views
ScreenTinker 3617a1a116 Link start cannot be navigated to: a bearer token does not survive it
"Authentication required" on every click of Link. The Settings button did
`location.href = /api/auth/oidc/<slug>/link/start`, which is a top-level
navigation -- and this app's session lives in localStorage and travels as an
Authorization header, so the request arrived anonymous and requireAuth refused
it, correctly.

The login /start route works precisely because it needs no session. Copying its
shape for a route that does need one was the mistake.

The client now FETCHES link start with its token and navigates to the URL it
returns. The transaction cookie is still set by that response, because a
same-origin fetch stores Set-Cookie normally, so the callback is unchanged.
beginOidc grew an asJson flag rather than a second copy of the PKCE/state/nonce
setup, so login and link still cannot drift apart.

Both mutations fail the new test: navigating straight at the route, and having
the server redirect instead of answering with JSON.
2026-08-12 14:44:23 -05:00
..
activity.js Stop eight dashboard views reporting success for requests the server refused 2026-07-30 21:21:56 -05:00
admin-player-debug.js Add player debug overlay and server-side error telemetry sink 2026-05-15 15:20:42 -05:00
admin.js Escape user-controlled data at the HTML sinks it actually reaches 2026-08-11 11:44:10 -05:00
billing.js Escape user-controlled data at the HTML sinks it actually reaches 2026-08-11 11:44:10 -05:00
content-library.js Escape user-controlled data at the HTML sinks it actually reaches 2026-08-11 11:44:10 -05:00
dashboard.js QA: close four ways a control or an asset lied about itself 2026-08-06 16:12:29 -05:00
designer.js Escape user-controlled data at the HTML sinks it actually reaches 2026-08-11 11:44:10 -05:00
device-detail.js Escape user-controlled data at the HTML sinks it actually reaches 2026-08-11 11:44:10 -05:00
force-password-change.js feat(admin): admin-provisioned user creation + first-login gate (#10) 2026-06-05 11:03:56 -05:00
help.js Describe a portrait video wall as portrait, and stop a wall hiding its screens 2026-08-06 09:46:31 -05:00
kiosk.js Stop eight dashboard views reporting success for requests the server refused 2026-07-30 21:21:56 -05:00
layout-editor.js Portrait templates, a canvas that matches the layout, and a playlist mockup 2026-08-05 13:23:15 -05:00
login.js Let an existing account move to SSO, and ask who you are before how 2026-08-12 11:48:11 -05:00
no-workspace.js feat(signup): optional org-on-create for self-service signups (#12) 2026-06-05 11:16:27 -05:00
onboarding.js Default a video playlist item to the clip's own length (#237) 2026-08-06 09:36:53 -05:00
playlists.js Merge #239: let the playlist preview skip to any item 2026-08-06 09:52:20 -05:00
reports.js Escape user-controlled data at the HTML sinks it actually reaches 2026-08-11 11:44:10 -05:00
schedule.js Stop eight dashboard views reporting success for requests the server refused 2026-07-30 21:21:56 -05:00
settings.js Link start cannot be navigated to: a bearer token does not survive it 2026-08-12 14:44:23 -05:00
teams.js Stop eight dashboard views reporting success for requests the server refused 2026-07-30 21:21:56 -05:00
video-wall.js Escape user-controlled data at the HTML sinks it actually reaches 2026-08-11 11:44:10 -05:00
widgets.js Keep the widget editor's Preview isolated, whatever the org setting says 2026-08-11 15:53:57 -05:00
workspace-members.js Escape user-controlled data at the HTML sinks it actually reaches 2026-08-11 11:44:10 -05:00