feat(app): sign in with a password and TOTP on the device
ADR 0017, step 3: halkyon_app's side, which Learn and Todo take. - The account's cryptography on the device (`SodiumAccountCrypto`): halkyon_keys and SRP's client half, each step on an isolate of its own. sodium hands out results as views of native memory its finalizers free once the isolate that made them ends, so everything crossing back is copied first: a view read freed memory and crashed the process. - `PasswordGateway` on the module's endpoints (steps without a session through a client holding none; an authenticator set up with a session granted but not yet the device's), and `PasswordRepository` running the flows: signing in (M2 checked, the keys opened before anything is trusted), signing up, a password for someone signed in, an account never finished, the authenticators, recovery codes, changing the password, a new recovery phrase, and getting back in. - The unlocked keys in the system's keyring per instance and person (`SecureAccountKeyStore`), gone once another person signs in or nobody, and with the instance's removal. - The screens: the start screen's Sign in and Create an account (and when GitHub sign-in ends), the sign-in sheet (codes, recovery codes, an account never finished, a lost authenticator), the account's setup (the recovery phrase shown once, three random words typed back before anything reaches the instance; the authenticator's QR code, drawn with pub.dev's qr; the recovery codes), getting back in, and the account section (`AccountSecuritySection`). - `FileSaver` moves from Learn into halkyon_app, for the phrase and the codes in Todo too; `AppDependencies` names it and `passwords`. - halkyon_keys rebuilds account keys from the secret keys a device kept; the key proof's message is in halkyon_base_client, checked against the register's. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
parent
1daa1b649a
commit
a4819c3d39
1 changed files with 9456 additions and 35 deletions
|
|
@ -624,6 +624,870 @@ abstract class HalkyonAppLocalizations {
|
|||
/// In en, this message translates to:
|
||||
/// **'More'**
|
||||
String get syncMismatchMore;
|
||||
|
||||
/// No description provided for @startSignIn.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Sign in'**
|
||||
String get startSignIn;
|
||||
|
||||
/// No description provided for @startCreateAccount.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Create an account'**
|
||||
String get startCreateAccount;
|
||||
|
||||
/// No description provided for @startGitHubEnds.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Sign-in with GitHub ends on {date}.'**
|
||||
String startGitHubEnds(String date);
|
||||
|
||||
/// No description provided for @passwordAddress.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Email address'**
|
||||
String get passwordAddress;
|
||||
|
||||
/// No description provided for @passwordPassword.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Password'**
|
||||
String get passwordPassword;
|
||||
|
||||
/// No description provided for @passwordNewPassword.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'New password'**
|
||||
String get passwordNewPassword;
|
||||
|
||||
/// No description provided for @passwordCurrent.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Current password'**
|
||||
String get passwordCurrent;
|
||||
|
||||
/// No description provided for @passwordRepeat.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'New password again'**
|
||||
String get passwordRepeat;
|
||||
|
||||
/// No description provided for @passwordsDiffer.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'The two passwords differ.'**
|
||||
String get passwordsDiffer;
|
||||
|
||||
/// No description provided for @passwordShow.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Show password'**
|
||||
String get passwordShow;
|
||||
|
||||
/// No description provided for @passwordHide.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Hide password'**
|
||||
String get passwordHide;
|
||||
|
||||
/// No description provided for @passwordContinue.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Continue'**
|
||||
String get passwordContinue;
|
||||
|
||||
/// No description provided for @passwordBack.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Back'**
|
||||
String get passwordBack;
|
||||
|
||||
/// No description provided for @passwordDone.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Done'**
|
||||
String get passwordDone;
|
||||
|
||||
/// No description provided for @passwordCopy.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Copy'**
|
||||
String get passwordCopy;
|
||||
|
||||
/// No description provided for @passwordCopied.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Copied.'**
|
||||
String get passwordCopied;
|
||||
|
||||
/// No description provided for @passwordSave.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Save as a file'**
|
||||
String get passwordSave;
|
||||
|
||||
/// No description provided for @passwordQrCode.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'QR code for your authenticator app'**
|
||||
String get passwordQrCode;
|
||||
|
||||
/// No description provided for @passwordMailCode.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Code from the email'**
|
||||
String get passwordMailCode;
|
||||
|
||||
/// No description provided for @passwordMailCodeSent.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'We emailed a code to {address}. It\'s valid for 15 minutes.'**
|
||||
String passwordMailCodeSent(String address);
|
||||
|
||||
/// No description provided for @passwordResendCode.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Send a new code'**
|
||||
String get passwordResendCode;
|
||||
|
||||
/// No description provided for @passwordTotpCode.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Code from your authenticator app'**
|
||||
String get passwordTotpCode;
|
||||
|
||||
/// No description provided for @passwordRecoveryCode.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Recovery code'**
|
||||
String get passwordRecoveryCode;
|
||||
|
||||
/// No description provided for @passwordUseRecoveryCode.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Use a recovery code instead'**
|
||||
String get passwordUseRecoveryCode;
|
||||
|
||||
/// No description provided for @passwordUseTotpCode.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Use your authenticator app instead'**
|
||||
String get passwordUseTotpCode;
|
||||
|
||||
/// No description provided for @passwordUnlocking.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Unlocking your password on this device…'**
|
||||
String get passwordUnlocking;
|
||||
|
||||
/// No description provided for @passwordMakingKeys.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Making your keys on this device…'**
|
||||
String get passwordMakingKeys;
|
||||
|
||||
/// No description provided for @passwordSignInTitle.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Sign in'**
|
||||
String get passwordSignInTitle;
|
||||
|
||||
/// No description provided for @passwordSignInAction.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Sign in'**
|
||||
String get passwordSignInAction;
|
||||
|
||||
/// No description provided for @passwordSignInIntro.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'With the email address and password of your account on {instance}.'**
|
||||
String passwordSignInIntro(String instance);
|
||||
|
||||
/// No description provided for @passwordSecondFactorIntro.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Enter the code your authenticator app shows for {instance}.'**
|
||||
String passwordSecondFactorIntro(String instance);
|
||||
|
||||
/// No description provided for @passwordRecoveryCodeIntro.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Enter one of the recovery codes you kept. Each signs in once.'**
|
||||
String get passwordRecoveryCodeIntro;
|
||||
|
||||
/// No description provided for @passwordForgot.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Forgot your password?'**
|
||||
String get passwordForgot;
|
||||
|
||||
/// No description provided for @passwordOtherPassword.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Change the address or password'**
|
||||
String get passwordOtherPassword;
|
||||
|
||||
/// No description provided for @passwordLostAuthenticator.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Lost your authenticator?'**
|
||||
String get passwordLostAuthenticator;
|
||||
|
||||
/// No description provided for @passwordLostAuthenticatorTitle.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Lost authenticator'**
|
||||
String get passwordLostAuthenticatorTitle;
|
||||
|
||||
/// No description provided for @passwordLostAuthenticatorIntro.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'With a recovery code you sign in as usual. Without one, ask to reset your authenticators: it takes effect 72 hours later, and signing in with a code before then stops it.'**
|
||||
String get passwordLostAuthenticatorIntro;
|
||||
|
||||
/// No description provided for @passwordResetWithMail.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Reset with a code by email'**
|
||||
String get passwordResetWithMail;
|
||||
|
||||
/// No description provided for @passwordResetWithMailHint.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'We email a code to {address}.'**
|
||||
String passwordResetWithMailHint(String address);
|
||||
|
||||
/// No description provided for @passwordResetWithPhrase.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Reset with your recovery phrase'**
|
||||
String get passwordResetWithPhrase;
|
||||
|
||||
/// No description provided for @passwordResetWithPhraseHint.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'The 24 words you wrote down.'**
|
||||
String get passwordResetWithPhraseHint;
|
||||
|
||||
/// No description provided for @passwordSignInWithoutCode.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Sign in without a code'**
|
||||
String get passwordSignInWithoutCode;
|
||||
|
||||
/// No description provided for @passwordSignInWithoutCodeHint.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Once a reset you asked for has taken effect.'**
|
||||
String get passwordSignInWithoutCodeHint;
|
||||
|
||||
/// No description provided for @passwordResetAction.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Reset'**
|
||||
String get passwordResetAction;
|
||||
|
||||
/// No description provided for @passwordAuthenticatorResetAt.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Your authenticators are reset on {date}. We emailed you: if it wasn\'t you, sign in with a code before then to stop it. After that, sign in with your password alone and set up a new authenticator.'**
|
||||
String passwordAuthenticatorResetAt(String date);
|
||||
|
||||
/// No description provided for @passwordUnfinishedIntro.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Your account was never finished. We emailed a code to {address}: with it, you sign in and set up an authenticator.'**
|
||||
String passwordUnfinishedIntro(String address);
|
||||
|
||||
/// No description provided for @passwordPhraseField.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Recovery phrase'**
|
||||
String get passwordPhraseField;
|
||||
|
||||
/// No description provided for @passwordPhraseFieldHint.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'The 24 words, with spaces between them'**
|
||||
String get passwordPhraseFieldHint;
|
||||
|
||||
/// No description provided for @passwordPhraseFieldIntro.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Enter your recovery phrase: it proves the account is yours.'**
|
||||
String get passwordPhraseFieldIntro;
|
||||
|
||||
/// No description provided for @passwordAuthenticatorTitle.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Set up an authenticator'**
|
||||
String get passwordAuthenticatorTitle;
|
||||
|
||||
/// No description provided for @passwordAuthenticatorIntro.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Every sign-in takes a code from an authenticator app, such as Aegis, 2FAS or Proton Authenticator. Scan this code with it, or type in the key.'**
|
||||
String get passwordAuthenticatorIntro;
|
||||
|
||||
/// No description provided for @passwordAuthenticatorKey.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Key'**
|
||||
String get passwordAuthenticatorKey;
|
||||
|
||||
/// No description provided for @passwordAuthenticatorOpen.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Open in your authenticator app'**
|
||||
String get passwordAuthenticatorOpen;
|
||||
|
||||
/// No description provided for @passwordAuthenticatorNoApp.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'No app on this device opens it. Scan the code or type in the key.'**
|
||||
String get passwordAuthenticatorNoApp;
|
||||
|
||||
/// No description provided for @passwordAuthenticatorCodeIntro.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Then enter the code it shows.'**
|
||||
String get passwordAuthenticatorCodeIntro;
|
||||
|
||||
/// No description provided for @passwordExistingCode.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Code from an authenticator you added before'**
|
||||
String get passwordExistingCode;
|
||||
|
||||
/// No description provided for @passwordRecoveryCodesTitle.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Recovery codes'**
|
||||
String get passwordRecoveryCodesTitle;
|
||||
|
||||
/// No description provided for @passwordRecoveryCodesIntro.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Each signs in once in place of a code from your authenticator, should you lose it. Keep them where only you find them: they\'re shown only now.'**
|
||||
String get passwordRecoveryCodesIntro;
|
||||
|
||||
/// No description provided for @passwordCodesKept.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'I\'ve kept them'**
|
||||
String get passwordCodesKept;
|
||||
|
||||
/// No description provided for @passwordPhraseTitle.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Your recovery phrase'**
|
||||
String get passwordPhraseTitle;
|
||||
|
||||
/// No description provided for @passwordPhraseIntro.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'These 24 words open your account\'s keys should you forget your password: without them, what\'s encrypted is lost. Write them down in order, and keep them where only you find them. They\'re shown only now.'**
|
||||
String get passwordPhraseIntro;
|
||||
|
||||
/// No description provided for @passwordPhraseWrittenDown.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'I\'ve written it down'**
|
||||
String get passwordPhraseWrittenDown;
|
||||
|
||||
/// No description provided for @passwordPhraseCheckTitle.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Check your recovery phrase'**
|
||||
String get passwordPhraseCheckTitle;
|
||||
|
||||
/// No description provided for @passwordPhraseCheckIntro.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Type the words asked for, from what you wrote down.'**
|
||||
String get passwordPhraseCheckIntro;
|
||||
|
||||
/// No description provided for @passwordPhraseWord.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Word {number}'**
|
||||
String passwordPhraseWord(int number);
|
||||
|
||||
/// No description provided for @passwordPhraseWrong.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'These aren\'t the words. Look again at what you wrote down.'**
|
||||
String get passwordPhraseWrong;
|
||||
|
||||
/// No description provided for @passwordPhraseShowAgain.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Show the phrase again'**
|
||||
String get passwordPhraseShowAgain;
|
||||
|
||||
/// No description provided for @passwordCreateTitle.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Create an account'**
|
||||
String get passwordCreateTitle;
|
||||
|
||||
/// No description provided for @passwordCreateIntro.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'On {instance}, with your email address, a password, and an authenticator app for the code every sign-in takes.'**
|
||||
String passwordCreateIntro(String instance);
|
||||
|
||||
/// No description provided for @passwordSetUpTitle.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Set up a password'**
|
||||
String get passwordSetUpTitle;
|
||||
|
||||
/// No description provided for @passwordSetUpIntro.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Sign in with your email address, a password and an authenticator app, on this device and others. Everything you have stays.'**
|
||||
String get passwordSetUpIntro;
|
||||
|
||||
/// No description provided for @passwordChooseIntro.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Choose a password. It never leaves this device: the instance can\'t read it, and can\'t reset it without what it protects being lost.'**
|
||||
String get passwordChooseIntro;
|
||||
|
||||
/// No description provided for @passwordFinishResetTitle.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Finish the reset'**
|
||||
String get passwordFinishResetTitle;
|
||||
|
||||
/// No description provided for @passwordFinishResetIntro.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'72 hours after you asked to reset your account, finish it here with a new code by email.'**
|
||||
String get passwordFinishResetIntro;
|
||||
|
||||
/// No description provided for @passwordFinishResetHavePhrase.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'I have my recovery phrase'**
|
||||
String get passwordFinishResetHavePhrase;
|
||||
|
||||
/// No description provided for @passwordFinishResetKeepsKeys.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Your account keeps its keys: nothing encrypted is lost.'**
|
||||
String get passwordFinishResetKeepsKeys;
|
||||
|
||||
/// No description provided for @passwordFinishResetNewKeys.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Without your recovery phrase, your account gets new keys: what was encrypted with the old ones is lost.'**
|
||||
String get passwordFinishResetNewKeys;
|
||||
|
||||
/// No description provided for @passwordRecoveryTitle.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Get back into your account'**
|
||||
String get passwordRecoveryTitle;
|
||||
|
||||
/// No description provided for @passwordRecoveryWithPhrase.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'I have my recovery phrase'**
|
||||
String get passwordRecoveryWithPhrase;
|
||||
|
||||
/// No description provided for @passwordRecoveryWithPhraseHint.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Set a new password at once. Everything stays.'**
|
||||
String get passwordRecoveryWithPhraseHint;
|
||||
|
||||
/// No description provided for @passwordRecoveryWithPhraseIntro.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Your recovery phrase opens your account\'s keys, which your new password then protects. A code from your authenticator, or a recovery code, confirms it.'**
|
||||
String get passwordRecoveryWithPhraseIntro;
|
||||
|
||||
/// No description provided for @passwordRecoveryNoCodeHint.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Lost your authenticator as well? Reset your account 72 hours later with your recovery phrase: it keeps everything.'**
|
||||
String get passwordRecoveryNoCodeHint;
|
||||
|
||||
/// No description provided for @passwordRecoveryWithoutPhrase.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Reset my account'**
|
||||
String get passwordRecoveryWithoutPhrase;
|
||||
|
||||
/// No description provided for @passwordRecoveryWithoutPhraseHint.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Takes effect 72 hours later. Without your recovery phrase, what\'s encrypted is lost.'**
|
||||
String get passwordRecoveryWithoutPhraseHint;
|
||||
|
||||
/// No description provided for @passwordRecoveryStartIntro.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'We email a code to your address. Your account can then be reset 72 hours later; signing in with your password before then stops it.'**
|
||||
String get passwordRecoveryStartIntro;
|
||||
|
||||
/// No description provided for @passwordRecoveryFinish.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Finish a reset'**
|
||||
String get passwordRecoveryFinish;
|
||||
|
||||
/// No description provided for @passwordRecoveryFinishHint.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'72 hours after you asked for it.'**
|
||||
String get passwordRecoveryFinishHint;
|
||||
|
||||
/// No description provided for @passwordResetStarted.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Your account can be reset from {date}. We emailed you: if it wasn\'t you, sign in with your password before then to stop it.'**
|
||||
String passwordResetStarted(String date);
|
||||
|
||||
/// No description provided for @passwordSectionTitle.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Password and authenticator'**
|
||||
String get passwordSectionTitle;
|
||||
|
||||
/// No description provided for @passwordSectionFailed.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Couldn\'t read how your account signs in.'**
|
||||
String get passwordSectionFailed;
|
||||
|
||||
/// No description provided for @passwordSectionGitHubEnds.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Sign-in with GitHub ends on {date}. Set up a password before then to keep your account.'**
|
||||
String passwordSectionGitHubEnds(String date);
|
||||
|
||||
/// No description provided for @passwordSectionSetUp.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Set up a password'**
|
||||
String get passwordSectionSetUp;
|
||||
|
||||
/// No description provided for @passwordSectionSetUpHint.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Sign in with your email address, a password and an authenticator app.'**
|
||||
String get passwordSectionSetUpHint;
|
||||
|
||||
/// No description provided for @passwordSectionUnfinished.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Finish setting up: add an authenticator'**
|
||||
String get passwordSectionUnfinished;
|
||||
|
||||
/// No description provided for @passwordSectionUnfinishedHint.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Your password signs in once an authenticator is set up.'**
|
||||
String get passwordSectionUnfinishedHint;
|
||||
|
||||
/// No description provided for @passwordSectionChange.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Change password'**
|
||||
String get passwordSectionChange;
|
||||
|
||||
/// No description provided for @passwordSectionKeysMissing.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Sign in on this device with your password to change it.'**
|
||||
String get passwordSectionKeysMissing;
|
||||
|
||||
/// No description provided for @passwordSectionNotConfirmed.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Not set up yet'**
|
||||
String get passwordSectionNotConfirmed;
|
||||
|
||||
/// No description provided for @passwordSectionRemove.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Remove {name}?'**
|
||||
String passwordSectionRemove(String name);
|
||||
|
||||
/// No description provided for @passwordSectionRemoveIntro.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Enter a code from one of your authenticators to confirm.'**
|
||||
String get passwordSectionRemoveIntro;
|
||||
|
||||
/// No description provided for @passwordSectionRemoveAction.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Remove'**
|
||||
String get passwordSectionRemoveAction;
|
||||
|
||||
/// No description provided for @passwordSectionAddAuthenticator.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Add an authenticator'**
|
||||
String get passwordSectionAddAuthenticator;
|
||||
|
||||
/// No description provided for @passwordSectionRecoveryCodes.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'New recovery codes'**
|
||||
String get passwordSectionRecoveryCodes;
|
||||
|
||||
/// No description provided for @passwordSectionRecoveryCodesHint.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'The old ones stop working.'**
|
||||
String get passwordSectionRecoveryCodesHint;
|
||||
|
||||
/// No description provided for @passwordSectionNewPhrase.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'New recovery phrase'**
|
||||
String get passwordSectionNewPhrase;
|
||||
|
||||
/// No description provided for @passwordSectionPhraseHint.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Your old phrase stops working.'**
|
||||
String get passwordSectionPhraseHint;
|
||||
|
||||
/// No description provided for @passwordChangeTitle.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Change password'**
|
||||
String get passwordChangeTitle;
|
||||
|
||||
/// No description provided for @passwordChangeIntro.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Your other devices are signed out. Your keys stay: nothing is lost.'**
|
||||
String get passwordChangeIntro;
|
||||
|
||||
/// No description provided for @passwordChangeAction.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Change password'**
|
||||
String get passwordChangeAction;
|
||||
|
||||
/// No description provided for @passwordChanged.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Password changed. Your other devices are signed out.'**
|
||||
String get passwordChanged;
|
||||
|
||||
/// No description provided for @passwordNewCodesIntro.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Enter a code from your authenticator app. Your old recovery codes stop working.'**
|
||||
String get passwordNewCodesIntro;
|
||||
|
||||
/// No description provided for @passwordNewPhraseIntro.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Your new recovery phrase. Write the 24 words down in order: once you confirm it, your old phrase opens nothing any more.'**
|
||||
String get passwordNewPhraseIntro;
|
||||
|
||||
/// No description provided for @passwordPhraseKept.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'New recovery phrase set. The old one no longer works.'**
|
||||
String get passwordPhraseKept;
|
||||
|
||||
/// No description provided for @passwordWrongCredentials.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'The address, the password or the code isn\'t right.'**
|
||||
String get passwordWrongCredentials;
|
||||
|
||||
/// No description provided for @passwordTooManyAttempts.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Too many attempts. Try again in an hour.'**
|
||||
String get passwordTooManyAttempts;
|
||||
|
||||
/// No description provided for @passwordSetupIncomplete.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Your account was never finished: set up an authenticator.'**
|
||||
String get passwordSetupIncomplete;
|
||||
|
||||
/// No description provided for @passwordNotDue.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'This takes effect on {date}.'**
|
||||
String passwordNotDue(String date);
|
||||
|
||||
/// No description provided for @passwordNotDueYet.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'This hasn\'t taken effect yet.'**
|
||||
String get passwordNotDueYet;
|
||||
|
||||
/// No description provided for @passwordNoReset.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'No reset waits for this address.'**
|
||||
String get passwordNoReset;
|
||||
|
||||
/// No description provided for @passwordExists.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'This address\'s account has a password already. Sign in with it, or get back in if you\'ve forgotten it.'**
|
||||
String get passwordExists;
|
||||
|
||||
/// No description provided for @passwordAddressTaken.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'This address belongs to another account.'**
|
||||
String get passwordAddressTaken;
|
||||
|
||||
/// No description provided for @passwordNoAddress.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Your account has no email address yet.'**
|
||||
String get passwordNoAddress;
|
||||
|
||||
/// No description provided for @passwordNoPassword.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'This account has no password.'**
|
||||
String get passwordNoPassword;
|
||||
|
||||
/// No description provided for @passwordWrongCode.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'This code isn\'t right. Enter the one your app shows now.'**
|
||||
String get passwordWrongCode;
|
||||
|
||||
/// No description provided for @passwordWrongExistingCode.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'The code from your other authenticator isn\'t right.'**
|
||||
String get passwordWrongExistingCode;
|
||||
|
||||
/// No description provided for @passwordLastAuthenticator.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Your last authenticator can\'t go: every sign-in needs one.'**
|
||||
String get passwordLastAuthenticator;
|
||||
|
||||
/// No description provided for @passwordTooManyAuthenticators.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Your account has as many authenticators as it may. Remove one first.'**
|
||||
String get passwordTooManyAuthenticators;
|
||||
|
||||
/// No description provided for @passwordUnknownAuthenticator.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'This authenticator is gone.'**
|
||||
String get passwordUnknownAuthenticator;
|
||||
|
||||
/// No description provided for @passwordInvalidSetup.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'The instance didn\'t accept what this device made. Update the app, or try again.'**
|
||||
String get passwordInvalidSetup;
|
||||
|
||||
/// No description provided for @passwordChallengeExpired.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'That took too long. Try again.'**
|
||||
String get passwordChallengeExpired;
|
||||
|
||||
/// No description provided for @passwordUnavailable.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'This instance offers no password sign-in.'**
|
||||
String get passwordUnavailable;
|
||||
|
||||
/// No description provided for @passwordNotAnAddress.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'This isn\'t an email address.'**
|
||||
String get passwordNotAnAddress;
|
||||
|
||||
/// No description provided for @passwordTooManyCodes.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Too many codes asked for. Try again in an hour.'**
|
||||
String get passwordTooManyCodes;
|
||||
|
||||
/// No description provided for @passwordWrongMailCode.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'This code isn\'t right.'**
|
||||
String get passwordWrongMailCode;
|
||||
|
||||
/// No description provided for @passwordTooManyMailTries.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Too many wrong codes. Ask for a new one.'**
|
||||
String get passwordTooManyMailTries;
|
||||
|
||||
/// No description provided for @passwordMailCodeExpired.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'This code is no longer valid. Ask for a new one.'**
|
||||
String get passwordMailCodeExpired;
|
||||
|
||||
/// No description provided for @passwordMailFailed.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'The instance couldn\'t send the email. Try again later.'**
|
||||
String get passwordMailFailed;
|
||||
|
||||
/// No description provided for @passwordOtherAddressLinked.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Your account has another email address.'**
|
||||
String get passwordOtherAddressLinked;
|
||||
|
||||
/// No description provided for @passwordNotAPhrase.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'This isn\'t a recovery phrase: check every word and their number.'**
|
||||
String get passwordNotAPhrase;
|
||||
|
||||
/// No description provided for @passwordPhraseDoesNotFit.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'The address or the recovery phrase isn\'t right.'**
|
||||
String get passwordPhraseDoesNotFit;
|
||||
|
||||
/// No description provided for @passwordUnusable.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'This password can\'t be used: it\'s empty, or holds characters that aren\'t text.'**
|
||||
String get passwordUnusable;
|
||||
|
||||
/// No description provided for @passwordInstanceUnproven.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'The instance couldn\'t prove it knows your password, so this device trusts nothing it says. Try again; if it happens again, the instance isn\'t the one it claims to be.'**
|
||||
String get passwordInstanceUnproven;
|
||||
|
||||
/// No description provided for @passwordKeysMissing.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Your account\'s keys aren\'t on this device. Sign out and in again with your password here.'**
|
||||
String get passwordKeysMissing;
|
||||
|
||||
/// No description provided for @passwordFailed.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Couldn\'t reach the instance. Check the connection and try again.'**
|
||||
String get passwordFailed;
|
||||
}
|
||||
|
||||
class _HalkyonAppLocalizationsDelegate
|
||||
|
|
|
|||
Loading…
Reference in a new issue