diff --git a/src/apps/common/request_pin.py b/src/apps/common/request_pin.py index 7d065b1a..9762275c 100644 --- a/src/apps/common/request_pin.py +++ b/src/apps/common/request_pin.py @@ -9,7 +9,7 @@ class PinCancelled(Exception): @ui.layout -async def request_pin(code: int = None, cancellable: bool = True) -> str: +async def request_pin(code = None, cancellable: bool = True) -> str: def onchange(): c = dialog.cancel @@ -18,15 +18,20 @@ async def request_pin(code: int = None, cancellable: bool = True) -> str: if c.content is not back: c.normal_style = ui.BTN_CLEAR['normal'] c.content = back + c.enable() c.taint() - c.render() else: lock = res.load(ui.ICON_LOCK) - if c.content is not lock and cancellable: + if not cancellable and c.content: + c.content = '' + c.disable() + c.taint() + elif c.content is not lock: c.normal_style = ui.BTN_CANCEL['normal'] c.content = lock + c.enable() c.taint() - c.render() + c.render() label = _get_label(code) matrix = PinMatrix(label, with_zero=True) @@ -35,9 +40,6 @@ async def request_pin(code: int = None, cancellable: bool = True) -> str: dialog.cancel.area = ui.grid(12) dialog.confirm.area = ui.grid(14) matrix.onchange() - if not cancellable: - dialog.cancel.content = '' - dialog.cancel.disable() while True: result = await dialog @@ -50,7 +52,9 @@ async def request_pin(code: int = None, cancellable: bool = True) -> str: raise PinCancelled() -def _get_label(code: int): +def _get_label(code): + if isinstance(code, str): + return code if code is None: code = PinMatrixRequestType.Current if code == PinMatrixRequestType.NewFirst: diff --git a/src/apps/management/change_pin.py b/src/apps/management/change_pin.py index f062c06e..4aa485f4 100644 --- a/src/apps/management/change_pin.py +++ b/src/apps/management/change_pin.py @@ -1,4 +1,4 @@ -from trezor import config, loop, ui +from trezor import config, loop, ui, wire from trezor.messages import FailureType, PinMatrixRequestType from trezor.messages.ButtonRequest import ButtonRequest from trezor.messages.ButtonRequestType import Other @@ -8,7 +8,7 @@ from trezor.messages import wire_types from trezor.pin import pin_to_int, show_pin_timeout from trezor.ui.text import Text from apps.common.confirm import require_confirm -from apps.common.request_pin import request_pin +from apps.common.request_pin import request_pin, PinCancelled async def change_pin(ctx, msg): @@ -62,11 +62,13 @@ def confirm_change_pin(ctx, msg): 'set new PIN?')) -async def request_pin_ack(ctx, code=None, *args, **kwargs): - if code is None: - code = Other - await ctx.call(ButtonRequest(code=code), wire_types.ButtonAck) - return await request_pin(*args, **kwargs) +async def request_pin_ack(ctx, *args, **kwargs): + # TODO: send PinMatrixRequest here, with specific code? + await ctx.call(ButtonRequest(code=Other), wire_types.ButtonAck) + try: + return await request_pin(*args, **kwargs) + except PinCancelled: + raise wire.FailureError(FailureType.ActionCancelled, 'Cancelled') async def request_pin_confirm(ctx, *args, **kwargs): diff --git a/src/apps/management/recovery_device.py b/src/apps/management/recovery_device.py index 00b1dcdf..34913f88 100644 --- a/src/apps/management/recovery_device.py +++ b/src/apps/management/recovery_device.py @@ -6,7 +6,7 @@ from trezor.messages.FailureType import ProcessError, UnexpectedMessage from trezor.messages.Success import Success from trezor.messages.wire_types import ButtonAck from trezor.pin import pin_to_int -from trezor.ui.keyboard import MnemonicKeyboard +from trezor.ui.mnemonic import MnemonicKeyboard from trezor.ui.text import Text from trezor.ui.word_select import WordSelector from trezor.utils import format_ordinal diff --git a/src/apps/management/reset_device.py b/src/apps/management/reset_device.py index cdfabf03..404032ff 100644 --- a/src/apps/management/reset_device.py +++ b/src/apps/management/reset_device.py @@ -7,7 +7,7 @@ from trezor.messages.EntropyRequest import EntropyRequest from trezor.messages.Success import Success from trezor.pin import pin_to_int from trezor.ui.confirm import HoldToConfirmDialog -from trezor.ui.keyboard import MnemonicKeyboard +from trezor.ui.mnemonic import MnemonicKeyboard from trezor.ui.scroll import Scrollpage, animate_swipe, paginate from trezor.ui.text import Text from trezor.utils import chunks, format_ordinal diff --git a/src/boot.py b/src/boot.py index cbef66ae..fd568150 100644 --- a/src/boot.py +++ b/src/boot.py @@ -4,6 +4,7 @@ from apps.common.request_pin import request_pin async def bootscreen(): + label = None while True: try: if not config.has_pin(): @@ -11,9 +12,11 @@ async def bootscreen(): return await lockscreen() while True: - pin = await request_pin() + pin = await request_pin(label) if config.unlock(pin_to_int(pin), show_pin_timeout): return + else: + label = 'Wrong PIN, enter again' except: # noqa: E722 pass diff --git a/src/trezor/ui/keyboard.py b/src/trezor/ui/mnemonic.py similarity index 100% rename from src/trezor/ui/keyboard.py rename to src/trezor/ui/mnemonic.py diff --git a/src/trezor/ui/passphrase.py b/src/trezor/ui/passphrase.py index 037fbb30..1ed22a41 100644 --- a/src/trezor/ui/passphrase.py +++ b/src/trezor/ui/passphrase.py @@ -189,3 +189,5 @@ class PassphraseKeyboard(ui.Widget): else: self.page = (self.page - 1) % len(KEYBOARD_KEYS) self.keys = key_buttons(KEYBOARD_KEYS[self.page]) + self.back.taint() + self.done.taint()