dragonflight/services/web-ui/public
Zac 0c3a4b625f feat(mam-api,web-ui): Google OAuth (OIDC) sign-in
Optional "Sign in with Google" with auto-provisioning, fully config-gated:
without GOOGLE_CLIENT_ID/SECRET and OAUTH_REDIRECT_URL the routes 404 and the
button is hidden, so deployments without SSO are unaffected.

- migration 028: users.google_sub (unique) + email; password_hash nullable
  for OAuth-only accounts
- src/auth/google-oauth.js: lazy google-auth-library, ID-token verify,
  GOOGLE_ALLOWED_DOMAIN enforcement, requires email_verified === true
- auth routes: /auth/google (state-CSRF redirect), /auth/google/callback,
  /auth/google/enabled; reuses establishSession
- web-ui: "Sign in with Google" on the login screen (shown only when enabled),
  friendly callback error handling
- .env.example documents all new vars

Security hardening (from review of this + the TOTP work):
- resolveGoogleUser links ONLY by google_sub, never by email — a Google login
  can never seize a pre-existing local account (account-takeover fix)
- a Google-linked account with TOTP still requires the second factor (ticket
  in session, /?mfa=1 step) instead of bypassing it
- /login/totp now applies the per-IP login backoff
- recovery-code consumption is atomic (WHERE used_at IS NULL + rowCount)
- concurrent first-login race on google_sub is caught and re-resolved
- tests: google-oauth config helpers + google-link takeover/dedup regression

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 02:51:59 +00:00
..
css fix: remove Google Fonts, fix editor link to :47435, fix page titles 2026-05-18 22:56:51 -04:00
downloads feat(uxp): ship the icon-rail panel redesign as v2.2.2 (recover from redesign branch) 2026-05-29 20:45:29 -04:00
fonts web-ui: wave-1 finish — self-host fonts + multi-stage Dockerfile 2026-05-21 16:32:55 +00:00
img feat(brand): add Wild Dragon logo + favicon 2026-05-18 14:11:29 +00:00
js rip out entire auth/login flow 2026-05-27 03:39:58 +00:00
app.jsx feat(mam-api,web-ui): per-project RBAC (v2 auth layer) 2026-05-30 02:37:36 +00:00
auth-gate.jsx ui: full audit pass (fixes #146, #147, #148, #149, #151, #152, #153, #154, #155) 2026-05-28 23:50:07 +00:00
data.jsx feat(web-ui): serve UXP (.ccx) plugin, remove legacy ZXP panel 2026-05-29 14:20:46 -04:00
favicon.ico feat(brand): add Wild Dragon logo + favicon 2026-05-18 14:11:29 +00:00
icons.jsx ui(web-ui): Projects above Library in nav + $ icon for Billing 2026-05-29 20:17:42 -04:00
index.html fix: use external MAM_API_URL for remote capture sidecars; add cluster metrics endpoint and dashboard resource graphs 2026-05-29 01:04:24 +00:00
modal-new-recorder.jsx feat(recorder): default All-Intra HEVC (NVENC) + custom bitrate, auto fps/res, source-bitrate warning 2026-05-29 17:04:00 -04:00
screens-admin.jsx feat(mam-api,web-ui): TOTP two-factor authentication 2026-05-30 02:42:57 +00:00
screens-asset.jsx fix(mam-api): /stream returns MP4 url + separate hls_url (fixes Premiere import) 2026-05-29 21:44:52 -04:00
screens-auth.jsx feat(mam-api,web-ui): Google OAuth (OIDC) sign-in 2026-05-30 02:51:59 +00:00
screens-editor.jsx ui: full audit pass (fixes #146, #147, #148, #149, #151, #152, #153, #154, #155) 2026-05-28 23:50:07 +00:00
screens-home.jsx feat(web-ui): serve UXP (.ccx) plugin, remove legacy ZXP panel 2026-05-29 14:20:46 -04:00
screens-ingest.jsx fix(web-ui): show live download % on YouTube import bar 2026-05-29 19:53:19 -04:00
screens-jobs.jsx feat(ui): add 'Cancel all failed' button to Jobs screen 2026-05-29 00:02:55 +00:00
screens-library.jsx ui: full audit pass (fixes #146, #147, #148, #149, #151, #152, #153, #154, #155) 2026-05-28 23:50:07 +00:00
screens-projects.jsx feat(mam-api,web-ui): per-project RBAC (v2 auth layer) 2026-05-30 02:37:36 +00:00
screens-resources.jsx fix: use external MAM_API_URL for remote capture sidecars; add cluster metrics endpoint and dashboard resource graphs 2026-05-29 01:04:24 +00:00
shell.jsx feat(mam-api,web-ui): per-project RBAC (v2 auth layer) 2026-05-30 02:37:36 +00:00
styles-asset.css ui: full audit pass (fixes #146, #147, #148, #149, #151, #152, #153, #154, #155) 2026-05-28 23:50:07 +00:00
styles-fixes.css fix: use external MAM_API_URL for remote capture sidecars; add cluster metrics endpoint and dashboard resource graphs 2026-05-29 01:04:24 +00:00
styles-modal.css feat(web-ui): Z-AMPP screen + component CSS: styles-modal.css 2026-05-22 08:03:57 -04:00
styles-rest.css ui: full audit pass (fixes #146, #147, #148, #149, #151, #152, #153, #154, #155) 2026-05-28 23:50:07 +00:00
styles-screens.css feat(ui): add 'Cancel all failed' button to Jobs screen 2026-05-29 00:02:55 +00:00
styles.css ui: full audit pass (fixes #146, #147, #148, #149, #151, #152, #153, #154, #155) 2026-05-28 23:50:07 +00:00
tweaks-panel.jsx Add Z-AMPP UI: visuals + tweaks-panel: tweaks-panel.jsx 2026-05-22 08:13:37 -04:00
visuals.jsx chore: 1.2 ship-prep sweep — close 38 issues 2026-05-27 02:06:14 +00:00