feat(auth)!: codes by mail no longer sign in
ADR 0017, step 3 (D4: nobody signs in with email codes yet, so the password replaces them outright). `emailCode.verifyCode`, `emailSignIn.signIn` and the switch token go, with the register's `verifySignInCode` and `completeEmailSwitch` and their operations between services. `emailCode.sendCode` stays, now without a session (signing up and getting back in have none), as what proves an address for a password's setup, a sign-up, a setup never finished and the resets; `accountRecovery.sendCode`, which did that for the resets, goes. The `switchChallengeId` column stays: Serverpod's challenges still link a completion token, and older servers read it during a deploy. The apps: halkyon_app's email sign-in (its bloc, sheet, gateway calls and the start screen's Continue with email) goes; Learn's profile and Todo's account sheet show `AccountSecuritySection` (a password set up by someone anonymous or signing in with GitHub, whose end it names; the authenticators; changing the password; new recovery codes and phrase), which reads anew after every change the repository makes. BREAKING CHANGE: Learn's `minimumAppBuild` is 22: builds up to 21 sign in with the endpoints that went. Todo was never released and stays at build 1. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
parent
735dfa892a
commit
ae57cbe864
5 changed files with 429 additions and 3835 deletions
|
|
@ -42,36 +42,11 @@
|
|||
"startSignedOut": "Abgemeldet",
|
||||
"startOn": "Starte auf {instance}:",
|
||||
"startWithGitHub": "Mit GitHub anmelden",
|
||||
"startWithEmail": "Mit E-Mail fortfahren",
|
||||
"startWithoutAccount": "Ohne Konto starten",
|
||||
"startAnonymous": "Dein Fortschritt wird auf diesem Gerät gespeichert. Melde dich an, um ihn zu behalten.",
|
||||
"startGitHubFailed": "Anmeldung mit GitHub fehlgeschlagen.",
|
||||
"startNoGitHubAccount": "Noch kein Konto hier meldet sich mit diesem GitHub-Konto an.",
|
||||
"startOtherInstance": "Andere Instanz verwenden",
|
||||
"emailSignInTitle": "Mit E-Mail fortfahren",
|
||||
"emailSignInIntro": "Wir schicken dir einen Code zum Anmelden. Diese Instanz behält nur einen Fingerabdruck deiner Adresse, nie die Adresse selbst, und schreibt ihr nur, wenn du einen Code anforderst.",
|
||||
"emailSignInAddress": "E-Mail-Adresse",
|
||||
"emailSignInSend": "Code senden",
|
||||
"emailSignInCodeSent": "Wir haben einen Code an {address} geschickt. Er gilt 15 Minuten.",
|
||||
"emailSignInResent": "Ein neuer Code ist unterwegs.",
|
||||
"emailSignInCode": "Code",
|
||||
"emailSignInContinue": "Weiter",
|
||||
"emailSignInResend": "Neuen Code senden",
|
||||
"emailSignInOtherAddress": "Andere Adresse verwenden",
|
||||
"emailSignInSwitchTitle": "Zum Konto von {address} wechseln?",
|
||||
"emailSignInSwitchConfirm": "Wechseln",
|
||||
"emailSignInSwitchStay": "Anonym bleiben",
|
||||
"emailSignInTaken": "Mit {address} meldet sich schon ein anderes Konto an. Um zu ihm zu wechseln, melde dich zuerst ab.",
|
||||
"emailSignInUnavailable": "Diese Instanz bietet keine Anmeldung mit E-Mail an.",
|
||||
"emailSignInNotAnAddress": "Das ist keine E-Mail-Adresse.",
|
||||
"emailSignInTooManyCodes": "Zu viele Codes in der letzten Stunde. Versuche es später noch einmal.",
|
||||
"emailSignInWrongCode": "Dieser Code stimmt nicht.",
|
||||
"emailSignInTooManyTries": "Zu viele falsche Codes. Fordere einen neuen an.",
|
||||
"emailSignInCodeExpired": "Dieser Code gilt nicht mehr. Fordere einen neuen an.",
|
||||
"emailSignInOtherAddressLinked": "Du meldest dich schon mit einer anderen Adresse an.",
|
||||
"emailSignInMailFailed": "Die Instanz konnte die Mail nicht senden. Versuche es später noch einmal.",
|
||||
"emailSignInUsePassword": "Dieses Konto meldet sich mit seinem Passwort und einer Authenticator-App an.",
|
||||
"emailSignInFailed": "Die Instanz war nicht erreichbar. Versuche es noch einmal.",
|
||||
"syncTitle": "Synchronisierung",
|
||||
"syncNow": "Jetzt synchronisieren",
|
||||
"syncStateSyncing": "Wird synchronisiert…",
|
||||
|
|
|
|||
|
|
@ -142,57 +142,11 @@
|
|||
}
|
||||
},
|
||||
"startWithGitHub": "Sign in with GitHub",
|
||||
"startWithEmail": "Continue with email",
|
||||
"startWithoutAccount": "Start without an account",
|
||||
"startAnonymous": "Progress is saved on this device. Sign in to keep it.",
|
||||
"startGitHubFailed": "Couldn't sign in with GitHub.",
|
||||
"startNoGitHubAccount": "No account here signs in with this GitHub account yet.",
|
||||
"startOtherInstance": "Use another instance",
|
||||
"emailSignInTitle": "Continue with email",
|
||||
"emailSignInIntro": "We mail you a code to sign in. This instance keeps only a fingerprint of your address, never the address itself, and writes to it only when you ask for a code.",
|
||||
"emailSignInAddress": "Email address",
|
||||
"emailSignInSend": "Send code",
|
||||
"emailSignInCodeSent": "We mailed a code to {address}. It's valid for 15 minutes.",
|
||||
"@emailSignInCodeSent": {
|
||||
"placeholders": {
|
||||
"address": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"emailSignInResent": "A new code is on its way.",
|
||||
"emailSignInCode": "Code",
|
||||
"emailSignInContinue": "Continue",
|
||||
"emailSignInResend": "Send a new code",
|
||||
"emailSignInOtherAddress": "Use another address",
|
||||
"emailSignInSwitchTitle": "Switch to the account of {address}?",
|
||||
"@emailSignInSwitchTitle": {
|
||||
"placeholders": {
|
||||
"address": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"emailSignInSwitchConfirm": "Switch",
|
||||
"emailSignInSwitchStay": "Stay anonymous",
|
||||
"emailSignInTaken": "{address} already signs in to another account. To switch to it, sign out first.",
|
||||
"@emailSignInTaken": {
|
||||
"placeholders": {
|
||||
"address": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"emailSignInUnavailable": "This instance doesn't offer signing in with email.",
|
||||
"emailSignInNotAnAddress": "This isn't an email address.",
|
||||
"emailSignInTooManyCodes": "Too many codes in the last hour. Try again later.",
|
||||
"emailSignInWrongCode": "That code isn't right.",
|
||||
"emailSignInTooManyTries": "Too many wrong codes. Ask for a new one.",
|
||||
"emailSignInCodeExpired": "This code is no longer valid. Ask for a new one.",
|
||||
"emailSignInOtherAddressLinked": "You already sign in with another address.",
|
||||
"emailSignInMailFailed": "The instance couldn't send the mail. Try again later.",
|
||||
"emailSignInUsePassword": "This account signs in with its password and an authenticator app.",
|
||||
"emailSignInFailed": "Couldn't reach the instance. Try again.",
|
||||
"syncTitle": "Sync",
|
||||
"syncNow": "Sync now",
|
||||
"syncStateSyncing": "Syncing…",
|
||||
|
|
|
|||
|
|
@ -355,12 +355,6 @@ abstract class HalkyonAppLocalizations {
|
|||
/// **'Sign in with GitHub'**
|
||||
String get startWithGitHub;
|
||||
|
||||
/// No description provided for @startWithEmail.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Continue with email'**
|
||||
String get startWithEmail;
|
||||
|
||||
/// No description provided for @startWithoutAccount.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
|
|
@ -391,150 +385,6 @@ abstract class HalkyonAppLocalizations {
|
|||
/// **'Use another instance'**
|
||||
String get startOtherInstance;
|
||||
|
||||
/// No description provided for @emailSignInTitle.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Continue with email'**
|
||||
String get emailSignInTitle;
|
||||
|
||||
/// No description provided for @emailSignInIntro.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'We mail you a code to sign in. This instance keeps only a fingerprint of your address, never the address itself, and writes to it only when you ask for a code.'**
|
||||
String get emailSignInIntro;
|
||||
|
||||
/// No description provided for @emailSignInAddress.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Email address'**
|
||||
String get emailSignInAddress;
|
||||
|
||||
/// No description provided for @emailSignInSend.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Send code'**
|
||||
String get emailSignInSend;
|
||||
|
||||
/// No description provided for @emailSignInCodeSent.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'We mailed a code to {address}. It\'s valid for 15 minutes.'**
|
||||
String emailSignInCodeSent(String address);
|
||||
|
||||
/// No description provided for @emailSignInResent.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'A new code is on its way.'**
|
||||
String get emailSignInResent;
|
||||
|
||||
/// No description provided for @emailSignInCode.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Code'**
|
||||
String get emailSignInCode;
|
||||
|
||||
/// No description provided for @emailSignInContinue.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Continue'**
|
||||
String get emailSignInContinue;
|
||||
|
||||
/// No description provided for @emailSignInResend.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Send a new code'**
|
||||
String get emailSignInResend;
|
||||
|
||||
/// No description provided for @emailSignInOtherAddress.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Use another address'**
|
||||
String get emailSignInOtherAddress;
|
||||
|
||||
/// No description provided for @emailSignInSwitchTitle.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Switch to the account of {address}?'**
|
||||
String emailSignInSwitchTitle(String address);
|
||||
|
||||
/// No description provided for @emailSignInSwitchConfirm.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Switch'**
|
||||
String get emailSignInSwitchConfirm;
|
||||
|
||||
/// No description provided for @emailSignInSwitchStay.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Stay anonymous'**
|
||||
String get emailSignInSwitchStay;
|
||||
|
||||
/// No description provided for @emailSignInTaken.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'{address} already signs in to another account. To switch to it, sign out first.'**
|
||||
String emailSignInTaken(String address);
|
||||
|
||||
/// No description provided for @emailSignInUnavailable.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'This instance doesn\'t offer signing in with email.'**
|
||||
String get emailSignInUnavailable;
|
||||
|
||||
/// No description provided for @emailSignInNotAnAddress.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'This isn\'t an email address.'**
|
||||
String get emailSignInNotAnAddress;
|
||||
|
||||
/// No description provided for @emailSignInTooManyCodes.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Too many codes in the last hour. Try again later.'**
|
||||
String get emailSignInTooManyCodes;
|
||||
|
||||
/// No description provided for @emailSignInWrongCode.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'That code isn\'t right.'**
|
||||
String get emailSignInWrongCode;
|
||||
|
||||
/// No description provided for @emailSignInTooManyTries.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Too many wrong codes. Ask for a new one.'**
|
||||
String get emailSignInTooManyTries;
|
||||
|
||||
/// No description provided for @emailSignInCodeExpired.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'This code is no longer valid. Ask for a new one.'**
|
||||
String get emailSignInCodeExpired;
|
||||
|
||||
/// No description provided for @emailSignInOtherAddressLinked.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'You already sign in with another address.'**
|
||||
String get emailSignInOtherAddressLinked;
|
||||
|
||||
/// No description provided for @emailSignInMailFailed.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'The instance couldn\'t send the mail. Try again later.'**
|
||||
String get emailSignInMailFailed;
|
||||
|
||||
/// No description provided for @emailSignInUsePassword.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'This account signs in with its password and an authenticator app.'**
|
||||
String get emailSignInUsePassword;
|
||||
|
||||
/// No description provided for @emailSignInFailed.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Couldn\'t reach the instance. Try again.'**
|
||||
String get emailSignInFailed;
|
||||
|
||||
/// No description provided for @syncTitle.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
|
|
|
|||
|
|
@ -165,9 +165,6 @@ class HalkyonAppLocalizationsDe extends HalkyonAppLocalizations {
|
|||
@override
|
||||
String get startWithGitHub => 'Mit GitHub anmelden';
|
||||
|
||||
@override
|
||||
String get startWithEmail => 'Mit E-Mail fortfahren';
|
||||
|
||||
@override
|
||||
String get startWithoutAccount => 'Ohne Konto starten';
|
||||
|
||||
|
|
@ -185,93 +182,6 @@ class HalkyonAppLocalizationsDe extends HalkyonAppLocalizations {
|
|||
@override
|
||||
String get startOtherInstance => 'Andere Instanz verwenden';
|
||||
|
||||
@override
|
||||
String get emailSignInTitle => 'Mit E-Mail fortfahren';
|
||||
|
||||
@override
|
||||
String get emailSignInIntro =>
|
||||
'Wir schicken dir einen Code zum Anmelden. Diese Instanz behält nur einen Fingerabdruck deiner Adresse, nie die Adresse selbst, und schreibt ihr nur, wenn du einen Code anforderst.';
|
||||
|
||||
@override
|
||||
String get emailSignInAddress => 'E-Mail-Adresse';
|
||||
|
||||
@override
|
||||
String get emailSignInSend => 'Code senden';
|
||||
|
||||
@override
|
||||
String emailSignInCodeSent(String address) {
|
||||
return 'Wir haben einen Code an $address geschickt. Er gilt 15 Minuten.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get emailSignInResent => 'Ein neuer Code ist unterwegs.';
|
||||
|
||||
@override
|
||||
String get emailSignInCode => 'Code';
|
||||
|
||||
@override
|
||||
String get emailSignInContinue => 'Weiter';
|
||||
|
||||
@override
|
||||
String get emailSignInResend => 'Neuen Code senden';
|
||||
|
||||
@override
|
||||
String get emailSignInOtherAddress => 'Andere Adresse verwenden';
|
||||
|
||||
@override
|
||||
String emailSignInSwitchTitle(String address) {
|
||||
return 'Zum Konto von $address wechseln?';
|
||||
}
|
||||
|
||||
@override
|
||||
String get emailSignInSwitchConfirm => 'Wechseln';
|
||||
|
||||
@override
|
||||
String get emailSignInSwitchStay => 'Anonym bleiben';
|
||||
|
||||
@override
|
||||
String emailSignInTaken(String address) {
|
||||
return 'Mit $address meldet sich schon ein anderes Konto an. Um zu ihm zu wechseln, melde dich zuerst ab.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get emailSignInUnavailable =>
|
||||
'Diese Instanz bietet keine Anmeldung mit E-Mail an.';
|
||||
|
||||
@override
|
||||
String get emailSignInNotAnAddress => 'Das ist keine E-Mail-Adresse.';
|
||||
|
||||
@override
|
||||
String get emailSignInTooManyCodes =>
|
||||
'Zu viele Codes in der letzten Stunde. Versuche es später noch einmal.';
|
||||
|
||||
@override
|
||||
String get emailSignInWrongCode => 'Dieser Code stimmt nicht.';
|
||||
|
||||
@override
|
||||
String get emailSignInTooManyTries =>
|
||||
'Zu viele falsche Codes. Fordere einen neuen an.';
|
||||
|
||||
@override
|
||||
String get emailSignInCodeExpired =>
|
||||
'Dieser Code gilt nicht mehr. Fordere einen neuen an.';
|
||||
|
||||
@override
|
||||
String get emailSignInOtherAddressLinked =>
|
||||
'Du meldest dich schon mit einer anderen Adresse an.';
|
||||
|
||||
@override
|
||||
String get emailSignInMailFailed =>
|
||||
'Die Instanz konnte die Mail nicht senden. Versuche es später noch einmal.';
|
||||
|
||||
@override
|
||||
String get emailSignInUsePassword =>
|
||||
'Dieses Konto meldet sich mit seinem Passwort und einer Authenticator-App an.';
|
||||
|
||||
@override
|
||||
String get emailSignInFailed =>
|
||||
'Die Instanz war nicht erreichbar. Versuche es noch einmal.';
|
||||
|
||||
@override
|
||||
String get syncTitle => 'Synchronisierung';
|
||||
|
||||
|
|
|
|||
|
|
@ -163,9 +163,6 @@ class HalkyonAppLocalizationsEn extends HalkyonAppLocalizations {
|
|||
@override
|
||||
String get startWithGitHub => 'Sign in with GitHub';
|
||||
|
||||
@override
|
||||
String get startWithEmail => 'Continue with email';
|
||||
|
||||
@override
|
||||
String get startWithoutAccount => 'Start without an account';
|
||||
|
||||
|
|
@ -183,92 +180,6 @@ class HalkyonAppLocalizationsEn extends HalkyonAppLocalizations {
|
|||
@override
|
||||
String get startOtherInstance => 'Use another instance';
|
||||
|
||||
@override
|
||||
String get emailSignInTitle => 'Continue with email';
|
||||
|
||||
@override
|
||||
String get emailSignInIntro =>
|
||||
'We mail you a code to sign in. This instance keeps only a fingerprint of your address, never the address itself, and writes to it only when you ask for a code.';
|
||||
|
||||
@override
|
||||
String get emailSignInAddress => 'Email address';
|
||||
|
||||
@override
|
||||
String get emailSignInSend => 'Send code';
|
||||
|
||||
@override
|
||||
String emailSignInCodeSent(String address) {
|
||||
return 'We mailed a code to $address. It\'s valid for 15 minutes.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get emailSignInResent => 'A new code is on its way.';
|
||||
|
||||
@override
|
||||
String get emailSignInCode => 'Code';
|
||||
|
||||
@override
|
||||
String get emailSignInContinue => 'Continue';
|
||||
|
||||
@override
|
||||
String get emailSignInResend => 'Send a new code';
|
||||
|
||||
@override
|
||||
String get emailSignInOtherAddress => 'Use another address';
|
||||
|
||||
@override
|
||||
String emailSignInSwitchTitle(String address) {
|
||||
return 'Switch to the account of $address?';
|
||||
}
|
||||
|
||||
@override
|
||||
String get emailSignInSwitchConfirm => 'Switch';
|
||||
|
||||
@override
|
||||
String get emailSignInSwitchStay => 'Stay anonymous';
|
||||
|
||||
@override
|
||||
String emailSignInTaken(String address) {
|
||||
return '$address already signs in to another account. To switch to it, sign out first.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get emailSignInUnavailable =>
|
||||
'This instance doesn\'t offer signing in with email.';
|
||||
|
||||
@override
|
||||
String get emailSignInNotAnAddress => 'This isn\'t an email address.';
|
||||
|
||||
@override
|
||||
String get emailSignInTooManyCodes =>
|
||||
'Too many codes in the last hour. Try again later.';
|
||||
|
||||
@override
|
||||
String get emailSignInWrongCode => 'That code isn\'t right.';
|
||||
|
||||
@override
|
||||
String get emailSignInTooManyTries =>
|
||||
'Too many wrong codes. Ask for a new one.';
|
||||
|
||||
@override
|
||||
String get emailSignInCodeExpired =>
|
||||
'This code is no longer valid. Ask for a new one.';
|
||||
|
||||
@override
|
||||
String get emailSignInOtherAddressLinked =>
|
||||
'You already sign in with another address.';
|
||||
|
||||
@override
|
||||
String get emailSignInMailFailed =>
|
||||
'The instance couldn\'t send the mail. Try again later.';
|
||||
|
||||
@override
|
||||
String get emailSignInUsePassword =>
|
||||
'This account signs in with its password and an authenticator app.';
|
||||
|
||||
@override
|
||||
String get emailSignInFailed => 'Couldn\'t reach the instance. Try again.';
|
||||
|
||||
@override
|
||||
String get syncTitle => 'Sync';
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue