mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-12-23 14:58:09 +00:00
fix(core): add missing tap to confirm screens to mercury
[no changelog]
This commit is contained in:
parent
b567d15732
commit
09fc0ebf3e
@ -328,6 +328,7 @@ async def handle_UnlockPath(msg: UnlockPath) -> protobuf.MessageType:
|
|||||||
title="Coinjoin",
|
title="Coinjoin",
|
||||||
description=TR.coinjoin__access_account,
|
description=TR.coinjoin__access_account,
|
||||||
verb=TR.buttons__access,
|
verb=TR.buttons__access,
|
||||||
|
prompt_screen=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
wire_types = (MessageType.GetAddress, MessageType.GetPublicKey, MessageType.SignTx)
|
wire_types = (MessageType.GetAddress, MessageType.GetPublicKey, MessageType.SignTx)
|
||||||
|
@ -155,6 +155,7 @@ async def _require_confirm_change_passphrase(use: bool) -> None:
|
|||||||
description=description,
|
description=description,
|
||||||
verb=verb,
|
verb=verb,
|
||||||
br_code=BRT_PROTECT_CALL,
|
br_code=BRT_PROTECT_CALL,
|
||||||
|
prompt_screen=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -171,6 +172,7 @@ async def _require_confirm_change_passphrase_source(
|
|||||||
TR.passphrase__title_source,
|
TR.passphrase__title_source,
|
||||||
description=description,
|
description=description,
|
||||||
br_code=BRT_PROTECT_CALL,
|
br_code=BRT_PROTECT_CALL,
|
||||||
|
prompt_screen=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -192,6 +194,7 @@ async def _require_confirm_change_display_rotation(rotation: int) -> None:
|
|||||||
description=TR.rotation__change_template,
|
description=TR.rotation__change_template,
|
||||||
description_param=label,
|
description_param=label,
|
||||||
br_code=BRT_PROTECT_CALL,
|
br_code=BRT_PROTECT_CALL,
|
||||||
|
prompt_screen=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -211,6 +214,7 @@ async def _require_confirm_change_autolock_delay(delay_ms: int) -> None:
|
|||||||
description=TR.auto_lock__change_template,
|
description=TR.auto_lock__change_template,
|
||||||
description_param=format_duration_ms(delay_ms, unit_plurals),
|
description_param=format_duration_ms(delay_ms, unit_plurals),
|
||||||
br_code=BRT_PROTECT_CALL,
|
br_code=BRT_PROTECT_CALL,
|
||||||
|
prompt_screen=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -223,6 +227,7 @@ async def _require_confirm_safety_checks(level: SafetyCheckLevel) -> None:
|
|||||||
TR.safety_checks__title,
|
TR.safety_checks__title,
|
||||||
description=TR.safety_checks__enforce_strict,
|
description=TR.safety_checks__enforce_strict,
|
||||||
br_code=BRT_PROTECT_CALL,
|
br_code=BRT_PROTECT_CALL,
|
||||||
|
prompt_screen=True,
|
||||||
)
|
)
|
||||||
elif level in (SafetyCheckLevel.PromptAlways, SafetyCheckLevel.PromptTemporarily):
|
elif level in (SafetyCheckLevel.PromptAlways, SafetyCheckLevel.PromptTemporarily):
|
||||||
description = (
|
description = (
|
||||||
@ -239,6 +244,7 @@ async def _require_confirm_safety_checks(level: SafetyCheckLevel) -> None:
|
|||||||
verb=TR.buttons__hold_to_confirm,
|
verb=TR.buttons__hold_to_confirm,
|
||||||
reverse=True,
|
reverse=True,
|
||||||
br_code=BRT_PROTECT_CALL,
|
br_code=BRT_PROTECT_CALL,
|
||||||
|
prompt_screen=True,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
raise ValueError # enum value out of range
|
raise ValueError # enum value out of range
|
||||||
@ -253,6 +259,7 @@ async def _require_confirm_experimental_features(enable: bool) -> None:
|
|||||||
TR.experimental_mode__enable,
|
TR.experimental_mode__enable,
|
||||||
reverse=True,
|
reverse=True,
|
||||||
br_code=BRT_PROTECT_CALL,
|
br_code=BRT_PROTECT_CALL,
|
||||||
|
prompt_screen=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -263,6 +270,7 @@ async def _require_confirm_hide_passphrase_from_host(enable: bool) -> None:
|
|||||||
TR.passphrase__title_hide,
|
TR.passphrase__title_hide,
|
||||||
description=TR.passphrase__hide,
|
description=TR.passphrase__hide,
|
||||||
br_code=BRT_PROTECT_CALL,
|
br_code=BRT_PROTECT_CALL,
|
||||||
|
prompt_screen=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -275,4 +283,5 @@ if utils.USE_HAPTIC:
|
|||||||
TR.haptic_feedback__enable if enable else TR.haptic_feedback__disable,
|
TR.haptic_feedback__enable if enable else TR.haptic_feedback__disable,
|
||||||
subtitle=TR.haptic_feedback__subtitle,
|
subtitle=TR.haptic_feedback__subtitle,
|
||||||
br_code=BRT_PROTECT_CALL,
|
br_code=BRT_PROTECT_CALL,
|
||||||
|
prompt_screen=True,
|
||||||
)
|
)
|
||||||
|
@ -25,6 +25,7 @@ async def authenticate_device(msg: AuthenticateDevice) -> AuthenticityProof:
|
|||||||
TR.authenticate__header,
|
TR.authenticate__header,
|
||||||
description=TR.authenticate__confirm_template.format(utils.MODEL_FULL_NAME),
|
description=TR.authenticate__confirm_template.format(utils.MODEL_FULL_NAME),
|
||||||
verb=TR.buttons__allow,
|
verb=TR.buttons__allow,
|
||||||
|
prompt_screen=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
header = b"AuthenticateDevice:"
|
header = b"AuthenticateDevice:"
|
||||||
|
@ -169,6 +169,7 @@ async def _require_confirm_change_language(
|
|||||||
description=TR.language__change_to_template.format(lang),
|
description=TR.language__change_to_template.format(lang),
|
||||||
verb="OK", # going for an international word, so it does not need translations
|
verb="OK", # going for an international word, so it does not need translations
|
||||||
br_code=ButtonRequestType.ProtectCall,
|
br_code=ButtonRequestType.ProtectCall,
|
||||||
|
prompt_screen=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -68,6 +68,7 @@ def _require_confirm_action(
|
|||||||
TR.wipe_code__title_settings,
|
TR.wipe_code__title_settings,
|
||||||
description=TR.wipe_code__turn_off,
|
description=TR.wipe_code__turn_off,
|
||||||
verb=TR.buttons__turn_off,
|
verb=TR.buttons__turn_off,
|
||||||
|
prompt_screen=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
if not msg.remove and has_wipe_code:
|
if not msg.remove and has_wipe_code:
|
||||||
|
@ -20,6 +20,7 @@ async def get_next_u2f_counter(msg: GetNextU2FCounter) -> NextU2FCounter:
|
|||||||
TR.u2f__title_get,
|
TR.u2f__title_get,
|
||||||
description=TR.u2f__get,
|
description=TR.u2f__get,
|
||||||
br_code=ButtonRequestType.ProtectCall,
|
br_code=ButtonRequestType.ProtectCall,
|
||||||
|
prompt_screen=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
return NextU2FCounter(u2f_counter=storage_device.next_u2f_counter())
|
return NextU2FCounter(u2f_counter=storage_device.next_u2f_counter())
|
||||||
|
@ -83,6 +83,7 @@ async def reboot_to_bootloader(msg: RebootToBootloader) -> NoReturn:
|
|||||||
TR.reboot_to_bootloader__title,
|
TR.reboot_to_bootloader__title,
|
||||||
TR.reboot_to_bootloader__restart,
|
TR.reboot_to_bootloader__restart,
|
||||||
verb=TR.buttons__restart,
|
verb=TR.buttons__restart,
|
||||||
|
prompt_screen=True,
|
||||||
)
|
)
|
||||||
boot_command = BootCommand.STOP_AND_WAIT
|
boot_command = BootCommand.STOP_AND_WAIT
|
||||||
boot_args = None
|
boot_args = None
|
||||||
|
@ -171,4 +171,6 @@ def require_confirm_sd_protect(msg: SdProtect) -> Awaitable[None]:
|
|||||||
else:
|
else:
|
||||||
raise ProcessError("Unknown operation")
|
raise ProcessError("Unknown operation")
|
||||||
|
|
||||||
return confirm_action("set_sd", TR.sd_card__title, description=text)
|
return confirm_action(
|
||||||
|
"set_sd", TR.sd_card__title, description=text, prompt_screen=True
|
||||||
|
)
|
||||||
|
@ -23,6 +23,7 @@ async def set_u2f_counter(msg: SetU2FCounter) -> Success:
|
|||||||
description_param=str(msg.u2f_counter),
|
description_param=str(msg.u2f_counter),
|
||||||
verb=TR.buttons__set,
|
verb=TR.buttons__set,
|
||||||
br_code=ButtonRequestType.ProtectCall,
|
br_code=ButtonRequestType.ProtectCall,
|
||||||
|
prompt_screen=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
storage_device.set_u2f_counter(msg.u2f_counter)
|
storage_device.set_u2f_counter(msg.u2f_counter)
|
||||||
|
@ -36,7 +36,13 @@ async def cipher_key_value(msg: CipherKeyValue) -> CipheredKeyValue:
|
|||||||
title = TR.misc__decrypt_value
|
title = TR.misc__decrypt_value
|
||||||
verb = TR.buttons__confirm
|
verb = TR.buttons__confirm
|
||||||
|
|
||||||
await confirm_action("cipher_key_value", title, description=msg.key, verb=verb)
|
await confirm_action(
|
||||||
|
"cipher_key_value",
|
||||||
|
title,
|
||||||
|
description=msg.key,
|
||||||
|
verb=verb,
|
||||||
|
prompt_screen=True,
|
||||||
|
)
|
||||||
|
|
||||||
node = keychain.derive(msg.address_n)
|
node = keychain.derive(msg.address_n)
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@ async def get_entropy(msg: GetEntropy) -> Entropy:
|
|||||||
TR.entropy__send,
|
TR.entropy__send,
|
||||||
TR.words__know_what_your_doing,
|
TR.words__know_what_your_doing,
|
||||||
br_code=ButtonRequestType.ProtectCall,
|
br_code=ButtonRequestType.ProtectCall,
|
||||||
|
prompt_screen=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
size = min(msg.size, 1024)
|
size = min(msg.size, 1024)
|
||||||
|
@ -65,6 +65,7 @@ async def require_confirm_watchkey() -> None:
|
|||||||
TR.monero__confirm_export,
|
TR.monero__confirm_export,
|
||||||
description=TR.monero__wanna_export_watchkey,
|
description=TR.monero__wanna_export_watchkey,
|
||||||
br_code=BRT_SignTx,
|
br_code=BRT_SignTx,
|
||||||
|
prompt_screen=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -74,6 +75,7 @@ async def require_confirm_keyimage_sync() -> None:
|
|||||||
TR.monero__confirm_ki_sync,
|
TR.monero__confirm_ki_sync,
|
||||||
description=TR.monero__wanna_sync_key_images,
|
description=TR.monero__wanna_sync_key_images,
|
||||||
br_code=BRT_SignTx,
|
br_code=BRT_SignTx,
|
||||||
|
prompt_screen=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -83,6 +85,7 @@ async def require_confirm_live_refresh() -> None:
|
|||||||
TR.monero__confirm_refresh,
|
TR.monero__confirm_refresh,
|
||||||
description=TR.monero__wanna_start_refresh,
|
description=TR.monero__wanna_start_refresh,
|
||||||
br_code=BRT_SignTx,
|
br_code=BRT_SignTx,
|
||||||
|
prompt_screen=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -95,6 +98,7 @@ async def require_confirm_tx_key(export_key: bool = False) -> None:
|
|||||||
TR.monero__confirm_export,
|
TR.monero__confirm_export,
|
||||||
description=description,
|
description=description,
|
||||||
br_code=BRT_SignTx,
|
br_code=BRT_SignTx,
|
||||||
|
prompt_screen=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -89,6 +89,7 @@ async def require_confirm_memo(memo_type: StellarMemoType, memo_text: str) -> No
|
|||||||
TR.stellar__no_memo_set,
|
TR.stellar__no_memo_set,
|
||||||
TR.stellar__exchanges_require_memo,
|
TR.stellar__exchanges_require_memo,
|
||||||
br_code=ButtonRequestType.ConfirmOutput,
|
br_code=ButtonRequestType.ConfirmOutput,
|
||||||
|
prompt_screen=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
await layouts.confirm_blob(
|
await layouts.confirm_blob(
|
||||||
|
@ -84,6 +84,7 @@ async def confirm_fido_reset() -> bool:
|
|||||||
action=TR.fido__erase_credentials,
|
action=TR.fido__erase_credentials,
|
||||||
description=TR.words__really_wanna,
|
description=TR.words__really_wanna,
|
||||||
reverse=True,
|
reverse=True,
|
||||||
|
prompt_screen=True,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
return (await confirm) is trezorui2.CONFIRMED
|
return (await confirm) is trezorui2.CONFIRMED
|
||||||
|
@ -56,6 +56,17 @@ def go_next(debug: "DebugLink", wait: bool = False) -> "LayoutContent" | None:
|
|||||||
raise RuntimeError("Unknown model")
|
raise RuntimeError("Unknown model")
|
||||||
|
|
||||||
|
|
||||||
|
def tap_to_confirm(debug: "DebugLink", wait: bool = False) -> "LayoutContent" | None:
|
||||||
|
if debug.model in (models.T2T1,):
|
||||||
|
return debug.read_layout() # type: ignore
|
||||||
|
elif debug.model in (models.T2B1,):
|
||||||
|
return debug.read_layout() # type: ignore
|
||||||
|
elif debug.model in (models.T3T1,):
|
||||||
|
return debug.click(buttons.TAP_TO_CONFIRM, wait=wait)
|
||||||
|
else:
|
||||||
|
raise RuntimeError("Unknown model")
|
||||||
|
|
||||||
|
|
||||||
def go_back(
|
def go_back(
|
||||||
debug: "DebugLink", wait: bool = False, r_middle: bool = False
|
debug: "DebugLink", wait: bool = False, r_middle: bool = False
|
||||||
) -> "LayoutContent" | None:
|
) -> "LayoutContent" | None:
|
||||||
|
@ -29,7 +29,7 @@ from .. import translations as TR
|
|||||||
from ..device_tests.bitcoin.payment_req import make_coinjoin_request
|
from ..device_tests.bitcoin.payment_req import make_coinjoin_request
|
||||||
from ..tx_cache import TxCache
|
from ..tx_cache import TxCache
|
||||||
from . import recovery
|
from . import recovery
|
||||||
from .common import go_next, unlock_gesture
|
from .common import go_next, tap_to_confirm, unlock_gesture
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from trezorlib.debuglink import DebugLink, LayoutContent
|
from trezorlib.debuglink import DebugLink, LayoutContent
|
||||||
@ -70,6 +70,8 @@ def set_autolock_delay(device_handler: "BackgroundDeviceHandler", delay_ms: int)
|
|||||||
)
|
)
|
||||||
|
|
||||||
layout = go_next(debug, wait=True)
|
layout = go_next(debug, wait=True)
|
||||||
|
if debug.model in (models.T3T1,):
|
||||||
|
layout = tap_to_confirm(debug, wait=True)
|
||||||
assert layout.main_component() == "Homescreen"
|
assert layout.main_component() == "Homescreen"
|
||||||
assert device_handler.result() == "Settings applied"
|
assert device_handler.result() == "Settings applied"
|
||||||
|
|
||||||
|
@ -74,6 +74,7 @@ class Situation(Enum):
|
|||||||
PIN_SETUP = 2
|
PIN_SETUP = 2
|
||||||
PIN_CHANGE = 3
|
PIN_CHANGE = 3
|
||||||
WIPE_CODE_SETUP = 4
|
WIPE_CODE_SETUP = 4
|
||||||
|
PIN_INPUT_CANCEL = 5
|
||||||
|
|
||||||
|
|
||||||
@contextmanager
|
@contextmanager
|
||||||
@ -88,10 +89,16 @@ def prepare(
|
|||||||
# without reseeding "again", the results are still random.
|
# without reseeding "again", the results are still random.
|
||||||
debug.reseed(0)
|
debug.reseed(0)
|
||||||
|
|
||||||
|
tap = False
|
||||||
|
|
||||||
# Setup according to the wanted situation
|
# Setup according to the wanted situation
|
||||||
if situation == Situation.PIN_INPUT:
|
if situation == Situation.PIN_INPUT:
|
||||||
# Any action triggering the PIN dialogue
|
# Any action triggering the PIN dialogue
|
||||||
device_handler.run(device.apply_settings, auto_lock_delay_ms=300_000) # type: ignore
|
device_handler.run(device.apply_settings, auto_lock_delay_ms=300_000) # type: ignore
|
||||||
|
tap = True
|
||||||
|
if situation == Situation.PIN_INPUT_CANCEL:
|
||||||
|
# Any action triggering the PIN dialogue
|
||||||
|
device_handler.run(device.apply_settings, auto_lock_delay_ms=300_000) # type: ignore
|
||||||
elif situation == Situation.PIN_SETUP:
|
elif situation == Situation.PIN_SETUP:
|
||||||
# Set new PIN
|
# Set new PIN
|
||||||
device_handler.run(device.change_pin) # type: ignore
|
device_handler.run(device.change_pin) # type: ignore
|
||||||
@ -130,7 +137,13 @@ def prepare(
|
|||||||
debug.wait_layout()
|
debug.wait_layout()
|
||||||
_assert_pin_entry(debug)
|
_assert_pin_entry(debug)
|
||||||
yield debug
|
yield debug
|
||||||
go_next(debug)
|
|
||||||
|
if debug.model in (models.T3T1,) and tap:
|
||||||
|
go_next(debug, wait=True)
|
||||||
|
debug.click(buttons.TAP_TO_CONFIRM)
|
||||||
|
else:
|
||||||
|
go_next(debug)
|
||||||
|
|
||||||
device_handler.result()
|
device_handler.result()
|
||||||
|
|
||||||
|
|
||||||
@ -290,7 +303,7 @@ def test_pin_incorrect(device_handler: "BackgroundDeviceHandler"):
|
|||||||
@pytest.mark.skip_t2b1("TODO: will we support cancelling on T2B1?")
|
@pytest.mark.skip_t2b1("TODO: will we support cancelling on T2B1?")
|
||||||
@pytest.mark.setup_client(pin=PIN4)
|
@pytest.mark.setup_client(pin=PIN4)
|
||||||
def test_pin_cancel(device_handler: "BackgroundDeviceHandler"):
|
def test_pin_cancel(device_handler: "BackgroundDeviceHandler"):
|
||||||
with PIN_CANCELLED, prepare(device_handler) as debug:
|
with PIN_CANCELLED, prepare(device_handler, Situation.PIN_INPUT_CANCEL) as debug:
|
||||||
_input_pin(debug, PIN4)
|
_input_pin(debug, PIN4)
|
||||||
_see_pin(debug)
|
_see_pin(debug)
|
||||||
_delete_pin(debug, len(PIN4))
|
_delete_pin(debug, len(PIN4))
|
||||||
|
Loading…
Reference in New Issue
Block a user