feat(app): an authenticator's key copied, marked sensitive, and its code six digits

A phone without a camera whose authenticator doesn't open otpauth: had no
way but typing the key. It is copied again, the key alone (ADR 0017
amended, the developer's decision of 3 Nov 2026): on Android through each
app's SensitiveClipboard.kt, marked EXTRA_IS_SENSITIVE, so Gboard and the
system show no preview and keep it out of their histories; elsewhere through
Flutter's clipboard. Emptied 60 seconds later if the clipboard still holds
it. The recovery phrase and codes stay never copied.

The code's field counted "/7", taking an optional space for a seventh
character: it now takes six digits alone, a pasted space dropped, and counts
nothing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-11-03 22:07:35 +01:00
commit 8c70ad98a1
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64
5 changed files with 470 additions and 36 deletions

View file

@ -126,6 +126,7 @@
"passwordAuthenticatorTitle": "Authenticator einrichten",
"passwordAuthenticatorIntro": "Jede Anmeldung braucht einen Code aus einer Authenticator-App wie Aegis, 2FAS oder Proton Authenticator. Scanne diesen Code damit oder tippe den Schlüssel ein.",
"passwordAuthenticatorKey": "Schlüssel",
"passwordAuthenticatorKeyCopied": "Schlüssel kopiert. In einer Minute wird er aus der Zwischenablage entfernt.",
"passwordAuthenticatorOpen": "In deiner Authenticator-App öffnen",
"passwordAuthenticatorNoApp": "Keine App auf diesem Gerät öffnet ihn. Scanne den Code oder tippe den Schlüssel ein.",
"passwordAuthenticatorCodeIntro": "Gib dann den Code ein, den sie zeigt.",

View file

@ -413,6 +413,10 @@
"passwordAuthenticatorTitle": "Set up an authenticator",
"passwordAuthenticatorIntro": "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.",
"passwordAuthenticatorKey": "Key",
"passwordAuthenticatorKeyCopied": "Key copied. It's taken off the clipboard again in a minute.",
"@passwordAuthenticatorKeyCopied": {
"description": "After the authenticator's key was copied during its setup; the app empties the clipboard 60 seconds later."
},
"passwordAuthenticatorOpen": "Open in your authenticator app",
"passwordAuthenticatorNoApp": "No app on this device opens it. Scan the code or type in the key.",
"passwordAuthenticatorCodeIntro": "Then enter the code it shows.",

View file

@ -859,6 +859,12 @@ abstract class HalkyonAppLocalizations {
/// **'Key'**
String get passwordAuthenticatorKey;
/// After the authenticator's key was copied during its setup; the app empties the clipboard 60 seconds later.
///
/// In en, this message translates to:
/// **'Key copied. It\'s taken off the clipboard again in a minute.'**
String get passwordAuthenticatorKeyCopied;
/// No description provided for @passwordAuthenticatorOpen.
///
/// In en, this message translates to:

View file

@ -485,6 +485,10 @@ class HalkyonAppLocalizationsDe extends HalkyonAppLocalizations {
@override
String get passwordAuthenticatorKey => 'Schlüssel';
@override
String get passwordAuthenticatorKeyCopied =>
'Schlüssel kopiert. In einer Minute wird er aus der Zwischenablage entfernt.';
@override
String get passwordAuthenticatorOpen => 'In deiner Authenticator-App öffnen';

View file

@ -475,6 +475,10 @@ class HalkyonAppLocalizationsEn extends HalkyonAppLocalizations {
@override
String get passwordAuthenticatorKey => 'Key';
@override
String get passwordAuthenticatorKeyCopied =>
'Key copied. It\'s taken off the clipboard again in a minute.';
@override
String get passwordAuthenticatorOpen => 'Open in your authenticator app';