diff --git a/helper/helper/fido.py b/helper/helper/fido.py index cf2a41fa7..1b5934782 100644 --- a/helper/helper/fido.py +++ b/helper/helper/fido.py @@ -47,6 +47,14 @@ def __init__(self, retries, auth_blocked): ) +class InactivityException(RpcException): + def __init__(self): + super().__init__( + "user-action-timeout", + "Failed to add fingerprint due to user inactivity.", + ) + + def _ctap_id(ctap): return (ctap.info.aaguid, ctap.info.firmware_version) @@ -164,7 +172,11 @@ def reset(self, params, event, signal): self.ctap = Ctap2(connection) if target != _ctap_id(self.ctap): raise ValueError("Re-inserted YubiKey does not match initial device") - self.ctap.reset(event=event) + try: + self.ctap.reset(event=event) + except CtapError as e: + if e.code == CtapError.ERR.USER_ACTION_TIMEOUT: + raise InactivityException() self._info = self.ctap.get_info() self._auth_blocked = False self._token = None @@ -340,6 +352,9 @@ def add(self, params, event, signal): signal("capture", dict(remaining=enroller.remaining)) except CaptureError as e: signal("capture-error", dict(code=e.code)) + except CtapError as e: + if e.code == CtapError.ERR.USER_ACTION_TIMEOUT: + raise InactivityException() if name: self.bio.set_name(template_id, name) self._templates[template_id] = name diff --git a/lib/fido/views/add_fingerprint_dialog.dart b/lib/fido/views/add_fingerprint_dialog.dart index 26625fd99..f355b21b3 100755 --- a/lib/fido/views/add_fingerprint_dialog.dart +++ b/lib/fido/views/add_fingerprint_dialog.dart @@ -113,16 +113,23 @@ class _AddFingerprintDialogState extends ConsumerState }, onError: (error, stacktrace) { _log.error('Error adding fingerprint', error, stacktrace); Navigator.of(context).pop(); + final l10n = AppLocalizations.of(context)!; final String errorMessage; // TODO: Make this cleaner than importing desktop specific RpcError. if (error is RpcError) { - errorMessage = error.message; + if (error.status == 'user-action-timeout') { + errorMessage = l10n.l_adding_fp_failed_inactivity; + } else if (error.status == 'connection-error') { + errorMessage = l10n.l_failed_connecting_to_fido; + } else { + errorMessage = error.message; + } } else { errorMessage = error.toString(); } showMessage( context, - 'Error adding fingerprint: $errorMessage', + l10n.l_adding_fingerprint_failed(errorMessage), duration: const Duration(seconds: 4), ); }); diff --git a/lib/fido/views/reset_dialog.dart b/lib/fido/views/reset_dialog.dart index 9b27f687c..2dcc10e8c 100755 --- a/lib/fido/views/reset_dialog.dart +++ b/lib/fido/views/reset_dialog.dart @@ -97,7 +97,15 @@ class _ResetDialogState extends ConsumerState { final String errorMessage; // TODO: Make this cleaner than importing desktop specific RpcError. if (e is RpcError) { - errorMessage = e.message; + if (e.status == 'connection-error') { + errorMessage = l10n.l_failed_connecting_to_fido; + } else if (e.status == 'invalid-command') { + errorMessage = l10n.l_adding_fp_failed_wrong_yk; + } else if (e.status == 'user-action-timeout') { + errorMessage = l10n.l_adding_fp_failed_inactivity; + } else { + errorMessage = e.message; + } } else { errorMessage = e.toString(); } diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index ee786cdc8..8c4827712 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -406,6 +406,13 @@ "s_fingerprints": "Fingerabdrücke", "l_fingerprint_captured": "Fingerabdruck erfolgreich aufgenommen!", "s_fingerprint_added": "Fingerabdruck hinzugefügt", + "l_adding_fingerprint_failed": null, + "@l_adding_fingerprint_failed": { + "placeholders": {} + }, + "l_adding_fp_failed_inactivity": null, + "l_adding_fp_failed_wrong_yk": null, + "l_failed_connecting_to_fido": null, "l_setting_name_failed": "Fehler beim Setzen des Namens: {message}", "@l_setting_name_failed": { "placeholders": { diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 9d63a0366..c9e0aaf56 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -406,6 +406,13 @@ "s_fingerprints": "Fingerprints", "l_fingerprint_captured": "Fingerprint captured successfully!", "s_fingerprint_added": "Fingerprint added", + "l_adding_fingerprint_failed": "Error adding fingerprint: {message}", + "@l_adding_fingerprint_failed": { + "placeholders": {} + }, + "l_adding_fp_failed_inactivity": "Failed due to user inactivity", + "l_adding_fp_failed_wrong_yk": "Re-inserted YubiKey does not match initial device", + "l_failed_connecting_to_fido": "Failed connecting to FIDO interface", "l_setting_name_failed": "Error setting name: {message}", "@l_setting_name_failed": { "placeholders": { diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index fb0439d59..547861c4d 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -406,6 +406,13 @@ "s_fingerprints": "Empreintes", "l_fingerprint_captured": "Empreinte capturée avec succès!", "s_fingerprint_added": "Empreinte ajoutée", + "l_adding_fingerprint_failed": null, + "@l_adding_fingerprint_failed": { + "placeholders": {} + }, + "l_adding_fp_failed_inactivity": null, + "l_adding_fp_failed_wrong_yk": null, + "l_failed_connecting_to_fido": null, "l_setting_name_failed": "Erreur lors de l'ajout du nom: {message}", "@l_setting_name_failed": { "placeholders": { diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb index 53595019c..6e6bf6cad 100644 --- a/lib/l10n/app_ja.arb +++ b/lib/l10n/app_ja.arb @@ -406,6 +406,13 @@ "s_fingerprints": "指紋", "l_fingerprint_captured": "指紋の取得に成功しました!", "s_fingerprint_added": "指紋が追加されました", + "l_adding_fingerprint_failed": null, + "@l_adding_fingerprint_failed": { + "placeholders": {} + }, + "l_adding_fp_failed_inactivity": null, + "l_adding_fp_failed_wrong_yk": null, + "l_failed_connecting_to_fido": null, "l_setting_name_failed": "名前設定時名エラー:{message}", "@l_setting_name_failed": { "placeholders": { diff --git a/lib/l10n/app_pl.arb b/lib/l10n/app_pl.arb index 44cd4c221..7f081b2ab 100644 --- a/lib/l10n/app_pl.arb +++ b/lib/l10n/app_pl.arb @@ -406,6 +406,13 @@ "s_fingerprints": "Odciski palców", "l_fingerprint_captured": "Odcisk palca zarejestrowany pomyślnie!", "s_fingerprint_added": "Dodano odcisk palca", + "l_adding_fingerprint_failed": null, + "@l_adding_fingerprint_failed": { + "placeholders": {} + }, + "l_adding_fp_failed_inactivity": null, + "l_adding_fp_failed_wrong_yk": null, + "l_failed_connecting_to_fido": null, "l_setting_name_failed": "Błąd ustawienia nazwy: {message}", "@l_setting_name_failed": { "placeholders": {