fix(core): improve error popups

pull/3011/head
grdddj 1 year ago committed by Martin Milata
parent 74246150e5
commit 393bc48b6b

@ -56,7 +56,7 @@ async def request_pin(
async def request_pin_confirm(ctx: Context, *args: Any, **kwargs: Any) -> str:
from trezor.ui.layouts import confirm_reenter_pin, pin_mismatch
from trezor.ui.layouts import confirm_reenter_pin, pin_mismatch_popup
while True:
pin1 = await request_pin(ctx, "Enter new PIN", *args, **kwargs)
@ -64,7 +64,7 @@ async def request_pin_confirm(ctx: Context, *args: Any, **kwargs: Any) -> str:
pin2 = await request_pin(ctx, "Re-enter new PIN", *args, **kwargs)
if pin1 == pin2:
return pin1
await pin_mismatch(ctx)
await pin_mismatch_popup(ctx)
async def request_pin_and_sd_salt(

@ -102,17 +102,17 @@ async def _request_wipe_code_confirm(ctx: Context, pin: str) -> str:
from apps.common.request_pin import request_pin
from trezor.ui.layouts import (
confirm_reenter_pin,
pin_mismatch,
wipe_code_same_as_pin,
pin_mismatch_popup,
wipe_code_same_as_pin_popup,
)
while True:
code1 = await request_pin(ctx, "Enter new wipe code")
if code1 == pin:
await wipe_code_same_as_pin(ctx)
await wipe_code_same_as_pin_popup(ctx)
continue
await confirm_reenter_pin(ctx, br_type="set_wipe_code", is_wipe_code=True)
code2 = await request_pin(ctx, "Re-enter wipe code")
if code1 == code2:
return code1
await pin_mismatch(ctx, br_type="set_wipe_code", is_wipe_code=True)
await pin_mismatch_popup(ctx, is_wipe_code=True)

@ -8,7 +8,7 @@ import storage.device as storage_device
from trezor import config, io, log, loop, utils, wire, workflow
from trezor.crypto import hashlib
from trezor.crypto.curve import nist256p1
from trezor.ui.layouts import show_popup
from trezor.ui.layouts import show_error_popup
from apps.base import set_homescreen
from apps.common import cbor
@ -611,14 +611,14 @@ async def _confirm_fido(title: str, credential: Credential) -> bool:
async def _confirm_bogus_app(title: str) -> None:
if _last_auth_valid:
await show_popup(
await show_error_popup(
title,
"This device is already registered with this application.",
"Already registered.",
timeout_ms=_POPUP_TIMEOUT_MS,
)
else:
await show_popup(
await show_error_popup(
title,
"This device is not registered with this application.",
"Not registered.",
@ -834,12 +834,12 @@ class Fido2ConfirmExcluded(Fido2ConfirmMakeCredential):
await send_cmd(cmd, self.iface)
self.finished = True
await show_popup(
await show_error_popup(
"FIDO2 Register",
"This device is already registered with {}.",
"Already registered.",
self._cred.rp_id, # description_param
_POPUP_TIMEOUT_MS,
timeout_ms=_POPUP_TIMEOUT_MS,
)
@ -917,7 +917,7 @@ class Fido2ConfirmNoPin(State):
await send_cmd(cmd, self.iface)
self.finished = True
await show_popup(
await show_error_popup(
"FIDO2 Verify User",
"Please enable PIN protection.",
"Unable to verify user.",
@ -940,12 +940,12 @@ class Fido2ConfirmNoCredentials(Fido2ConfirmGetAssertion):
await send_cmd(cmd, self.iface)
self.finished = True
await show_popup(
await show_error_popup(
"FIDO2 Authenticate",
"This device is not registered with\n{}.",
"Not registered.",
self._creds[0].app_name(), # description_param
_POPUP_TIMEOUT_MS,
timeout_ms=_POPUP_TIMEOUT_MS,
)

@ -280,7 +280,7 @@ async def show_error_and_raise(
raise NotImplementedError
async def show_popup(
async def show_error_popup(
title: str,
description: str,
subtitle: str | None = None,

@ -487,8 +487,8 @@ async def show_error_and_raise(
ctx,
RustLayout(
trezorui2.show_error(
title=content,
description=subheader or "",
title=subheader or "",
description=content,
button=button.upper(),
allow_cancel=False,
)
@ -1098,21 +1098,27 @@ async def confirm_signverify(
)
async def show_popup(
async def show_error_popup(
title: str,
description: str,
subtitle: str | None = None,
description_param: str = "",
timeout_ms: int = 3000,
*,
button: str = "",
timeout_ms: int = 0,
) -> None:
if not button and not timeout_ms:
raise ValueError("Either button or timeout_ms must be set")
if subtitle:
title += f"\n{subtitle}"
await RustLayout(
trezorui2.show_error(
title=title,
description=description.format(description_param),
button="",
button=button,
time_ms=timeout_ms,
allow_cancel=False,
)
)
@ -1192,38 +1198,26 @@ async def confirm_reenter_pin(
)
async def pin_mismatch(
async def pin_mismatch_popup(
ctx: GenericContext,
br_type: str = "set_pin",
br_code: ButtonRequestType = BR_TYPE_OTHER,
is_wipe_code: bool = False,
) -> None:
title = "WIPE CODE MISMATCH" if is_wipe_code else "PIN MISMATCH"
await button_request(ctx, "pin_mismatch", code=BR_TYPE_OTHER)
title = "Wipe code mismatch" if is_wipe_code else "PIN mismatch"
description = "wipe codes" if is_wipe_code else "PINs"
return await confirm_action(
ctx,
br_type,
return await show_error_popup(
title,
action=f"The {description} you entered do not match.\n\nPlease try again.",
verb="TRY AGAIN",
verb_cancel=None,
br_code=br_code,
f"The {description} you entered do not match.",
button="TRY AGAIN",
)
async def wipe_code_same_as_pin(
ctx: GenericContext,
br_type: str = "set_wipe_code",
br_code: ButtonRequestType = BR_TYPE_OTHER,
) -> None:
return await confirm_action(
ctx,
br_type,
"INVALID WIPE CODE",
action="The wipe code must be different from your PIN.\n\nPlease try again.",
verb="TRY AGAIN",
verb_cancel=None,
br_code=br_code,
async def wipe_code_same_as_pin_popup(ctx: GenericContext) -> None:
await button_request(ctx, "wipe_code_same_as_pin", code=BR_TYPE_OTHER)
return await show_error_popup(
"Invalid wipe code",
"The wipe code must be different from your PIN.",
button="TRY AGAIN",
)

@ -19,7 +19,7 @@ import pytest
from trezorlib import btc, device, messages
from trezorlib.client import MAX_PIN_LENGTH, PASSPHRASE_TEST_PATH
from trezorlib.debuglink import TrezorClientDebugLink as Client
from trezorlib.exceptions import Cancelled, TrezorFailure
from trezorlib.exceptions import TrezorFailure
from ..input_flows import InputFlowNewCodeMismatch
@ -97,7 +97,7 @@ def test_set_remove_wipe_code(client: Client):
def test_set_wipe_code_mismatch(client: Client):
with client, pytest.raises(Cancelled):
with client, pytest.raises(TrezorFailure):
IF = InputFlowNewCodeMismatch(client, WIPE_CODE4, WIPE_CODE6)
client.set_input_flow(IF.get())

@ -122,7 +122,7 @@ def test_set_failed(client: Client):
# Check that there's no PIN protection
_check_no_pin(client)
with client, pytest.raises(Cancelled):
with client, pytest.raises(TrezorFailure):
IF = InputFlowNewCodeMismatch(client, PIN4, PIN60)
client.set_input_flow(IF.get())

@ -133,6 +133,10 @@ class InputFlowNewCodeMismatch(InputFlowBase):
yield from input_two_different_pins()
yield # PIN mismatch
self.debug.press_yes() # try again
yield # PIN entry again
self.debug.press_no() # cancel
@ -158,7 +162,6 @@ class InputFlowCodeChangeFail(InputFlowBase):
yield # enter new pin again (but different)
self.debug.input(self.new_pin_2)
# So the mismatch screen is visible
yield # PIN mismatch
self.debug.press_yes() # try again

@ -726,11 +726,11 @@
"TT_test_pin.py::test_pin_long": "34692638906727bd3ebf89468aa8d4658866f1aac7775e8cae28bb337d588b3d",
"TT_test_pin.py::test_pin_long_delete": "eea0b6485700cce2bc6c13e6d1971e4add11355aa155edf2fcb9bb699dfb0654",
"TT_test_pin.py::test_pin_longer_than_max": "6a7e55fd6d3ff117ee5deb40f1c07cf8d3248931a29e4de6498d813744af2981",
"TT_test_pin.py::test_pin_same_as_wipe_code": "8a4174aa065036cd6f111edd668384951fd6184bd18e174cf177925e3933083b",
"TT_test_pin.py::test_pin_same_as_wipe_code": "f309e8ffbb4e55a934038b73c8c4f1d250f66b6136d806ddb82fda88aa62648b",
"TT_test_pin.py::test_pin_setup": "470ba3c1e991f14b99ef0256774dcb25ec8efa2e24951f923e9439e1f5d9e71d",
"TT_test_pin.py::test_pin_setup_mismatch": "bc3d883b79a2edef4cc38f0284afe8afcb5f7cc49d601a371a131859bfb628cb",
"TT_test_pin.py::test_pin_setup_mismatch": "2f4de6411cddb4cc29dad201de1b388267aa0a579652c87ada7b22661debe343",
"TT_test_pin.py::test_pin_short": "b5377990e4a1f324133601e3ca4726cde7af50b3e2c3f53738022ed9108a6a79",
"TT_test_pin.py::test_wipe_code_same_as_pin": "c674e074339d04370bfc99c846bc055cf1ba135ee1c44d22f7307c42057451d3",
"TT_test_pin.py::test_wipe_code_same_as_pin": "d6257f611689fa0e5616bd47861dcc4dad6c48d2d1f642ce923a66cae3dbb236",
"TT_test_pin.py::test_wipe_code_setup": "677797c95ed903fbf03f6e872610855aec253ac5a45bd211dbda96e02464df60",
"TT_test_recovery.py::test_recovery_bip39": "614e9204c01c379b4b88ba618addd50f22cf9f75492f2363cdca14acee1c883f",
"TT_test_recovery.py::test_recovery_slip39_basic": "73e2c4e4c4cb75206a5b739e4196035a4a3eef83a434a880ac27a8c7b5a3a0e2",
@ -1696,7 +1696,7 @@
"TT_reset_recovery-test_reset_backup.py::test_skip_backup_msg[BackupType.Slip39_Advanced-backup-dcbda5cf": "dbadedde1fd638f72f33590ae32425a0a645c9a0818a5030f0bd9adbe961c2bf",
"TT_reset_recovery-test_reset_backup.py::test_skip_backup_msg[BackupType.Slip39_Basic-backup_fl-1577de4d": "245fafadd5b9181f1a512414ce9c486fff2b9c76044c4855bc143e4f5fd28592",
"TT_reset_recovery-test_reset_bip39_t2.py::test_already_initialized": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_reset_recovery-test_reset_bip39_t2.py::test_failed_pin": "722134783cb2abc73cd695ee1d1ede6f0de8d5402409e656f722208343d81a39",
"TT_reset_recovery-test_reset_bip39_t2.py::test_failed_pin": "1902731b7775c17a45864707b5609c61b5f3de702391357b89dc85a424774301",
"TT_reset_recovery-test_reset_bip39_t2.py::test_reset_device": "fa804eaa19c56485ae7f156ba47a3c9642aa70e65295a19e018cf7e0c7156d25",
"TT_reset_recovery-test_reset_bip39_t2.py::test_reset_device_192": "cf6b6b9b6c760f229725028cb9413ffc8fe31563045d8b13361a17c040e8a41f",
"TT_reset_recovery-test_reset_bip39_t2.py::test_reset_device_pin": "73f2cc80c5a9d03fb31b6508cbe20832db16dbb32b6edab5aaf108ba062fd840",
@ -1799,15 +1799,15 @@
"TT_test_msg_backup_device.py::test_interrupt_backup_fails": "cdf801e16b046079569e4055f43a86a45d7eace58793427ef5433f71e75961f9",
"TT_test_msg_backup_device.py::test_no_backup_fails": "fada9d38ec099b3c6a4fd8bf994bb1f3431e40085128b4e0cd9deb8344dec53e",
"TT_test_msg_backup_device.py::test_no_backup_show_entropy_fails": "e00c46a70bc5bbfdd3bb6da5a712698e7c79bc8ebd78262ec0f13ef9ee6aec95",
"TT_test_msg_change_wipe_code_t2.py::test_set_pin_to_wipe_code": "f0c7493358ebfca355a677822efb1bb9a860715f6746ee76a16311f9e4c5dd7f",
"TT_test_msg_change_wipe_code_t2.py::test_set_remove_wipe_code": "d397af1119fdbdca182ca58ae47f978f66a4cb05b91c0b54922cf4914a58beca",
"TT_test_msg_change_wipe_code_t2.py::test_set_wipe_code_mismatch": "6a4e349e960b95e75d29f96c5619906a23c63283fdf6b933026a546596f08d54",
"TT_test_msg_change_wipe_code_t2.py::test_set_wipe_code_to_pin": "e98b69f7a44b1f19cf579ea48ebadecd84d979c4e6852b46320b4e04572a8429",
"TT_test_msg_changepin_t2.py::test_change_failed": "6ab25151a51ff5f57fbdb01e4c7af8cbeb10508d6c91277f7c5defc6e50d236f",
"TT_test_msg_changepin_t2.py::test_change_invalid_current": "8a94b2df5c14297b9ffc7529bac4af9c867efa5a87796db7aa78750be400062e",
"TT_test_msg_change_wipe_code_t2.py::test_set_pin_to_wipe_code": "a9bd775d5fa279ae44eb9498b59eb6af5a78f6ebcae46563ab0d33962d50c82f",
"TT_test_msg_change_wipe_code_t2.py::test_set_remove_wipe_code": "36ce2fa2d74131cc8fed47d335ff485524402d30fe0f5de14e6f9e590ddc00e4",
"TT_test_msg_change_wipe_code_t2.py::test_set_wipe_code_mismatch": "4882e50989dd4dcebaba685785c713f0ee54b80be13cf66c8c2d4ab111062f33",
"TT_test_msg_change_wipe_code_t2.py::test_set_wipe_code_to_pin": "a98ad32b9cf93579b798a76aa60370e2444493307c5743093351edd03b15b008",
"TT_test_msg_changepin_t2.py::test_change_failed": "565e26dcb8d24f1ad18f4fe03ac8d114fda94a46a0c31f7960497777718845b4",
"TT_test_msg_changepin_t2.py::test_change_invalid_current": "c11d3f8d788f61a7213bb2dba71ae0517e686e6cb73653addafa5f60d611afbe",
"TT_test_msg_changepin_t2.py::test_change_pin": "4897e28024f677075b5a2fe941876e87bf6ffe5a1ec40d3658d643f6c042aabb",
"TT_test_msg_changepin_t2.py::test_remove_pin": "1a415b1d0d626bf52c08f948f8761ad84f18550931ba34e422c0ee58862f060e",
"TT_test_msg_changepin_t2.py::test_set_failed": "a0377c8b0d194f65bf7b6532aa04488cb5a2c81b9cb43e351d5a31c0013c4d0b",
"TT_test_msg_changepin_t2.py::test_set_failed": "59e8d307d78714fabc1fabf86d0ff763407b951ccb90883df5e1f2ef03d2ea09",
"TT_test_msg_changepin_t2.py::test_set_pin": "9c9787d1fe80cf530e6c92079a36d440effca54587eb9f5a6b7fdd34406dae17",
"TT_test_msg_loaddevice.py::test_load_device_1": "3643774c15de3f99b82fff125bc05b9af066f5c08b7861a117f0c05da79ba1c5",
"TT_test_msg_loaddevice.py::test_load_device_2": "e37151e13b8a880033a82c065a41271d19f8c4a2b3c34985a7f5f04c1f4f0010",
@ -1845,7 +1845,7 @@
"TT_test_protection_levels.py::test_wipe_device": "af075bdd0d287154aeee0aa6f8a1066be24f2aab8a6f5f4ab7e1bdd26af380e9",
"TT_test_sdcard.py::test_sd_format": "45731c43d45fd5d86cdc462a1dbbde1ad83a02fdb5abffa2e8bf54af2f0cd1ee",
"TT_test_sdcard.py::test_sd_no_format": "3590feffa9193c304105fba0afae84bc93e54f1a4706490bd63b9d56a202a1a7",
"TT_test_sdcard.py::test_sd_protect_unlock": "1e500d3abe7d308a451267df9da4b0a3167ffe25e16c42ee219ca449c38fd500",
"TT_test_sdcard.py::test_sd_protect_unlock": "674dd28470342a9cffe39da611f55dd0ae217db3d965da99bc3cbef8f8521bbf",
"TT_test_session.py::test_cannot_resume_ended_session": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_test_session.py::test_clear_session": "4978f02d2c97e997eaf8417e511dfdfdbe9675f82e7d849117ba5cf6ce653c53",
"TT_test_session.py::test_derive_cardano_empty_session": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
@ -1880,7 +1880,7 @@
"TT_tezos-test_sign_tx.py::test_tezos_smart_contract_delegation": "90ed61bc1f075503fa7fc1d9a4137d38b8c9a0ff12a86ed19d936c6758ccd9f0",
"TT_tezos-test_sign_tx.py::test_tezos_smart_contract_transfer": "bec3ec92587c50ee286e1257954a9248c28dfd5eb09cefbbd89f35357ce35021",
"TT_tezos-test_sign_tx.py::test_tezos_smart_contract_transfer_to_contract": "b4aee29d5b8c16f60cc2eb87cc4a5c63402141a9409ddcc7ec0d2af272aab79d",
"TT_webauthn-test_msg_webauthn.py::test_add_remove": "48e680f749e86f04a5da52a23b1ec23aee8d526af66b30438d423dda7b5be53a",
"TT_webauthn-test_msg_webauthn.py::test_add_remove": "40f10f46427749ccb4b5573ccbb7e6ba5d2871abfca6ce201bfa20b97150b19f",
"TT_webauthn-test_u2f_counter.py::test_u2f_counter": "d46453a7846a8fd8a5f513937104c82cf8662f76be39017dbc217abf0eb3600a",
"TT_zcash-test_sign_tx.py::test_external_presigned": "0020164adcd1f8558664940a171683e1c6a43da9612344a84822d1bebc68a654",
"TT_zcash-test_sign_tx.py::test_one_two": "d2975b997628fb3a82c3fcb5c792f79c7fa64cba3c350517408fb863db8e759e",

Loading…
Cancel
Save