feat(auth): account lifecycle — Google linking, passwords, suspension & deletion plumbing
- Link a Google account to a password account, and adopt the Google identity onto a matching email account instead of 500ing on a duplicate; set or change a password from Settings. - Expose has_google/has_password on /api/me for the Sign-in methods UI. - Mark Google logins email-verified (backfill existing rows, migration 0024); stop a routine login from clobbering an admin-assigned role (env ADMIN_EMAILS stays the bootstrap admin). - Suspension login-gates (password + Google callback + current_user) with a rate-limited 'suspended' notice; shared purge_user (cascade delete + access-request cleanup + Google-grant revoke) behind self- and admin-deletion; single app_base source for user-facing email links.
This commit is contained in:
parent
c0dde06920
commit
2aa13a6433
9 changed files with 507 additions and 43 deletions
|
|
@ -61,7 +61,32 @@
|
|||
"deleteTitle": "Konto löschen?",
|
||||
"deleteConfirm": "Dies löscht dein Konto und alle deine Daten (Abos, Tags, angesehen/gespeichert/ausgeblendet, Playlists, Einstellungen) dauerhaft. Es kann nicht rückgängig gemacht werden.",
|
||||
"deleteConfirmButton": "Alles löschen",
|
||||
"demoNotice": "Dies ist das gemeinsame Demo-Konto. Es hat keine YouTube-Verbindung — du kannst die gesamte gemeinsame Bibliothek durchsuchen, filtern und sortieren, Playlists erstellen und Dinge ausprobieren, aber nichts berührt ein echtes YouTube-Konto."
|
||||
"demoNotice": "Dies ist das gemeinsame Demo-Konto. Es hat keine YouTube-Verbindung — du kannst die gesamte gemeinsame Bibliothek durchsuchen, filtern und sortieren, Playlists erstellen und Dinge ausprobieren, aber nichts berührt ein echtes YouTube-Konto.",
|
||||
"signInMethods": "Anmeldemethoden",
|
||||
"googleLink": {
|
||||
"title": "Google-Konto",
|
||||
"connected": "Verbunden",
|
||||
"connectedHint": "Dein Google-Konto ist verknüpft. Du kannst dich mit Google anmelden und unten den YouTube-Zugriff erteilen.",
|
||||
"connectHint": "Verknüpfe ein Google-Konto, um dich mit Google anzumelden und den YouTube-Zugriff für deinen Feed zu aktivieren.",
|
||||
"connect": "Google verknüpfen",
|
||||
"linked": "Google-Konto verknüpft.",
|
||||
"conflict": "Dieses Google-Konto ist bereits mit einem anderen Siftlode-Konto verknüpft.",
|
||||
"mismatch": "Das ist ein anderes Google-Konto als das bereits hier verknüpfte. Melde dich mit dem verknüpften an.",
|
||||
"error": "Das Google-Konto konnte nicht verknüpft werden. Bitte versuche es erneut."
|
||||
},
|
||||
"password": {
|
||||
"title": "Passwort",
|
||||
"setHint": "Ein Passwort ist gesetzt. Du kannst dich mit E-Mail und Passwort anmelden.",
|
||||
"unsetHint": "Noch kein Passwort — lege eines fest, um dich mit deiner E-Mail anzumelden (zusätzlich zu oder anstelle von Google).",
|
||||
"set": "Passwort festlegen",
|
||||
"change": "Passwort ändern",
|
||||
"current": "Aktuelles Passwort",
|
||||
"new": "Neues Passwort (min. 10 Zeichen)",
|
||||
"save": "Passwort speichern",
|
||||
"saving": "Speichern…",
|
||||
"saved": "Passwort für {{email}} aktualisiert.",
|
||||
"failed": "Das Passwort konnte nicht aktualisiert werden."
|
||||
}
|
||||
},
|
||||
"demo": {
|
||||
"title": "Demo-Zugang",
|
||||
|
|
@ -87,7 +112,7 @@
|
|||
"addPlaceholder": "E-Mail direkt hinzufügen…",
|
||||
"add": "Hinzufügen",
|
||||
"decided": "{{count}} entschieden",
|
||||
"approved": "Genehmigt — sie können sich jetzt anmelden",
|
||||
"approved": "{{email}} genehmigt — sie können sich jetzt anmelden",
|
||||
"approveFailed": "Genehmigung fehlgeschlagen",
|
||||
"denyFailed": "Ablehnung fehlgeschlagen",
|
||||
"addedToWhitelist": "Zur Whitelist hinzugefügt",
|
||||
|
|
|
|||
|
|
@ -61,7 +61,32 @@
|
|||
"deleteTitle": "Delete your account?",
|
||||
"deleteConfirm": "This permanently erases your account and all your data (subscriptions, tags, watch/saved/hidden state, playlists, settings). It can't be undone.",
|
||||
"deleteConfirmButton": "Delete everything",
|
||||
"demoNotice": "This is the shared demo account. It has no YouTube connection — you can browse the whole shared library, filter and sort it, build playlists and try things out, but nothing touches a real YouTube account."
|
||||
"demoNotice": "This is the shared demo account. It has no YouTube connection — you can browse the whole shared library, filter and sort it, build playlists and try things out, but nothing touches a real YouTube account.",
|
||||
"signInMethods": "Sign-in methods",
|
||||
"googleLink": {
|
||||
"title": "Google account",
|
||||
"connected": "Connected",
|
||||
"connectedHint": "Your Google account is linked. You can sign in with Google and grant YouTube access below.",
|
||||
"connectHint": "Link a Google account to sign in with Google and to enable YouTube access for your feed.",
|
||||
"connect": "Connect Google",
|
||||
"linked": "Google account linked.",
|
||||
"conflict": "That Google account is already linked to a different Siftlode account.",
|
||||
"mismatch": "That's a different Google account than the one already linked here. Sign in with the linked one.",
|
||||
"error": "Couldn't link the Google account. Please try again."
|
||||
},
|
||||
"password": {
|
||||
"title": "Password",
|
||||
"setHint": "A password is set. You can sign in with your email and password.",
|
||||
"unsetHint": "No password yet — set one to sign in with your email instead of (or as well as) Google.",
|
||||
"set": "Set password",
|
||||
"change": "Change password",
|
||||
"current": "Current password",
|
||||
"new": "New password (min. 10 characters)",
|
||||
"save": "Save password",
|
||||
"saving": "Saving…",
|
||||
"saved": "Password updated for {{email}}.",
|
||||
"failed": "Couldn't update the password."
|
||||
}
|
||||
},
|
||||
"demo": {
|
||||
"title": "Demo access",
|
||||
|
|
@ -87,7 +112,7 @@
|
|||
"addPlaceholder": "Add an email directly…",
|
||||
"add": "Add",
|
||||
"decided": "{{count}} decided",
|
||||
"approved": "Approved — they can sign in now",
|
||||
"approved": "Approved {{email}} — they can sign in now",
|
||||
"approveFailed": "Approve failed",
|
||||
"denyFailed": "Deny failed",
|
||||
"addedToWhitelist": "Added to the whitelist",
|
||||
|
|
|
|||
|
|
@ -61,7 +61,32 @@
|
|||
"deleteTitle": "Törlöd a fiókodat?",
|
||||
"deleteConfirm": "Ez véglegesen törli a fiókodat és minden adatodat (feliratkozások, címkék, megnézett/mentett/elrejtett állapot, lejátszási listák, beállítások). Nem vonható vissza.",
|
||||
"deleteConfirmButton": "Minden törlése",
|
||||
"demoNotice": "Ez a közös demo fiók. Nincs YouTube-kapcsolata — böngészheted a teljes közös könyvtárat, szűrheted és rendezheted, listákat építhetsz és kipróbálhatsz dolgokat, de semmi nem nyúl valódi YouTube-fiókhoz."
|
||||
"demoNotice": "Ez a közös demo fiók. Nincs YouTube-kapcsolata — böngészheted a teljes közös könyvtárat, szűrheted és rendezheted, listákat építhetsz és kipróbálhatsz dolgokat, de semmi nem nyúl valódi YouTube-fiókhoz.",
|
||||
"signInMethods": "Bejelentkezési módok",
|
||||
"googleLink": {
|
||||
"title": "Google-fiók",
|
||||
"connected": "Csatlakoztatva",
|
||||
"connectedHint": "A Google-fiókod össze van kapcsolva. Bejelentkezhetsz Google-lel, és alább engedélyezheted a YouTube-hozzáférést.",
|
||||
"connectHint": "Kapcsolj össze egy Google-fiókot, hogy Google-lel jelentkezhess be, és engedélyezhesd a YouTube-hozzáférést a feededhez.",
|
||||
"connect": "Google összekapcsolása",
|
||||
"linked": "Google-fiók összekapcsolva.",
|
||||
"conflict": "Ez a Google-fiók már egy másik Siftlode-fiókhoz van kapcsolva.",
|
||||
"mismatch": "Ez nem az a Google-fiók, amely ide már össze van kapcsolva. Az összekapcsolttal jelentkezz be.",
|
||||
"error": "Nem sikerült összekapcsolni a Google-fiókot. Próbáld újra."
|
||||
},
|
||||
"password": {
|
||||
"title": "Jelszó",
|
||||
"setHint": "Van beállított jelszó. Bejelentkezhetsz e-mail-címmel és jelszóval.",
|
||||
"unsetHint": "Még nincs jelszó — állíts be egyet, hogy e-mail-címmel is bejelentkezhess (a Google mellett vagy helyett).",
|
||||
"set": "Jelszó beállítása",
|
||||
"change": "Jelszó módosítása",
|
||||
"current": "Jelenlegi jelszó",
|
||||
"new": "Új jelszó (min. 10 karakter)",
|
||||
"save": "Jelszó mentése",
|
||||
"saving": "Mentés…",
|
||||
"saved": "Jelszó frissítve ehhez: {{email}}.",
|
||||
"failed": "Nem sikerült frissíteni a jelszót."
|
||||
}
|
||||
},
|
||||
"demo": {
|
||||
"title": "Demo hozzáférés",
|
||||
|
|
@ -87,7 +112,7 @@
|
|||
"addPlaceholder": "E-mail közvetlen hozzáadása…",
|
||||
"add": "Hozzáadás",
|
||||
"decided": "{{count}} eldöntve",
|
||||
"approved": "Jóváhagyva — most már be tud jelentkezni",
|
||||
"approved": "Jóváhagyva: {{email}} — most már be tud jelentkezni",
|
||||
"approveFailed": "A jóváhagyás sikertelen",
|
||||
"denyFailed": "Az elutasítás sikertelen",
|
||||
"addedToWhitelist": "Hozzáadva a fehérlistához",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue