feat(app): signing in with SimpleLogin, its sheet and the start screen's offer (ADR 0020)
All checks were successful
CI / check (push) Successful in 31m49s
CI / deploy (push) Has been skipped

Where the instance offers SimpleLogin, the start screen offers it first,
saying that the instance keeps only the SimpleLogin ID, and opens a sheet
that waits for SimpleLogin's page in the browser (Cancel ends the wait),
then: for someone new, the choice between creating an account (the
suggested handle or another, checked with the instance, the password
twice, the recovery phrase shown once and three of its words typed back,
nothing reaching the instance before) and linking theirs again with its
handle and recovery phrase; for an account, its password opening its
keys; for an account of before, the keys made with the handle it lacks.
SimpleLoginCubit holds the steps, each refusal shown where it is mended
(a handle's on the handle, a sign-in to begin again on the browser's),
and closing the sheet stops waiting on the loopback.

The suggested handle is never checked: the instance suggests none that
anybody has, and every answer about a handle counts against its limit
(D5). The fake's handle rule is now the module's.

Learn and Todo build it with SimpleLogin's browser (halkyon_oidc_flutter,
now a direct dependency of both, with their names on the loopback's
page), their schemes and their loopback ports (43823, 43824), as the
instance's forwarding page has them. Their tests offer no SimpleLogin;
halkyon_app's test the sheet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-10-24 01:21:29 +02:00
commit 3a93dc4fd8
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -912,4 +912,143 @@ class HalkyonAppLocalizationsDe extends HalkyonAppLocalizations {
@override
String get passwordSignedInBefore =>
'Nur ein seitdem angemeldetes Gerät kann diese Warnung ausblenden: Melde dich auf diesem neu an oder ändere dein Passwort.';
@override
String get simpleLoginContinue => 'Weiter mit SimpleLogin';
@override
String simpleLoginNote(String instance) {
return 'SimpleLogin ist die Anmeldung von Proton, und ein Proton-Konto funktioniert dort auch. SimpleLogin erfährt, dass du $instance nutzt, und $instance speichert nur deine SimpleLogin-ID: Dein Name schlägt einmal ein Handle vor, sonst wird nichts gespeichert.';
}
@override
String get simpleLoginTitle => 'Mit SimpleLogin anmelden';
@override
String get simpleLoginAddTitle => 'SimpleLogin hinzufügen';
@override
String get simpleLoginInBrowser => 'Mach in deinem Browser weiter.';
@override
String get simpleLoginNewcomerTitle => 'Neu hier?';
@override
String simpleLoginNewcomerIntro(String instance) {
return 'Zu deinem SimpleLogin-Konto gibt es auf $instance noch kein Konto.';
}
@override
String get simpleLoginCreateHint =>
'Wähle ein Handle und ein Passwort; du bekommst eine Wiederherstellungsphrase.';
@override
String get simpleLoginHaveOne => 'Ich habe schon eins';
@override
String get simpleLoginHaveOneHint =>
'Verknüpfe es wieder mit deinem Handle und deiner Wiederherstellungsphrase.';
@override
String get simpleLoginHandleIntro =>
'Andere finden dich über dein Handle. Es bleibt privat, bis du etwas veröffentlichst oder dein Profil ausfüllst, und lässt sich bis zu deiner ersten Veröffentlichung ändern.';
@override
String get simpleLoginHandle => 'Handle';
@override
String simpleLoginHandleFree(String handle) {
return '@$handle ist frei';
}
@override
String get simpleLoginPasswordIntro =>
'Wähle ein Passwort: Du gibst es ein, wenn du dich auf einem anderen Gerät anmeldest. Es verlässt dieses Gerät nie: Die Instanz kann es nicht lesen und nicht zurücksetzen, ohne dass verloren geht, was es schützt.';
@override
String get simpleLoginCreate => 'Konto erstellen';
@override
String get simpleLoginUnlockTitle => 'Dein Passwort';
@override
String simpleLoginUnlockIntroAs(String handle) {
return 'Mit SimpleLogin als @$handle angemeldet. Dein Passwort öffnet deine Schlüssel auf diesem Gerät.';
}
@override
String get simpleLoginUnlockIntro =>
'Mit SimpleLogin angemeldet. Dein Passwort öffnet deine Schlüssel auf diesem Gerät.';
@override
String get simpleLoginOpen => 'Öffnen';
@override
String get simpleLoginMendTitle => 'Konto verknüpfen';
@override
String get simpleLoginMendIntro =>
'Dein SimpleLogin-Konto ist nicht mehr das, das dein Konto kennt. Verknüpfe sie wieder mit deinem Handle und deiner Wiederherstellungsphrase: Deine anderen Geräte werden dann abgemeldet.';
@override
String get simpleLoginMend => 'Verknüpfen';
@override
String get simpleLoginWrongPassword => 'Das Passwort stimmt nicht.';
@override
String get simpleLoginMendDoesNotFit =>
'Das Handle oder die Wiederherstellungsphrase stimmt nicht.';
@override
String get simpleLoginUnavailable =>
'Diese Instanz bietet die Anmeldung mit SimpleLogin nicht an.';
@override
String get simpleLoginDenied =>
'Die Anmeldung bei SimpleLogin wurde abgelehnt, also wurde nichts geteilt.';
@override
String get simpleLoginNoBrowser =>
'Es gibt keinen Browser, der die Seite von SimpleLogin öffnen kann.';
@override
String get simpleLoginStartAgain =>
'Die Anmeldung hat zu lange gedauert, oder eine andere ist an ihre Stelle getreten. Beginne sie noch einmal.';
@override
String get simpleLoginRejected =>
'SimpleLogin hat die Anmeldung nicht bestätigt. Beginne sie noch einmal.';
@override
String get simpleLoginProviderUnavailable =>
'Die Instanz erreicht SimpleLogin gerade nicht. Versuch es später noch einmal.';
@override
String get simpleLoginTakenByAnotherPerson =>
'Dieses SimpleLogin-Konto gehört hier zu einem anderen Konto.';
@override
String get simpleLoginOtherIdentityLinked =>
'Dein Konto hat schon ein anderes SimpleLogin-Konto.';
@override
String get simpleLoginTooManyAttempts =>
'Von diesem Netz aus wurden zu viele Anmeldungen begonnen. Versuch es in einer Stunde noch einmal.';
@override
String get simpleLoginHandleInvalid =>
'Ein Handle besteht aus 1 bis 30 Buchstaben (a bis z), Ziffern oder Unterstrichen.';
@override
String get simpleLoginHandleReserved =>
'Dieses Handle ist der Instanz vorbehalten.';
@override
String get simpleLoginHandleTaken =>
'Dieses Handle hat schon jemand anderes.';
@override
String get simpleLoginTooManyHandleChecks =>
'Es wurden zu viele Handles ausprobiert. Versuch es in einer Stunde noch einmal.';
}