1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-12-23 23:08:14 +00:00

core: refactor usage of input_signals

this prevents a certain class of UI test failure. It also localizes the
use of debuglink signals into the layout classes instead of call sites,
which is a design we were already using for confirm_signals
This commit is contained in:
matejcik 2020-04-27 15:50:58 +02:00 committed by matejcik
parent b4900f2ab9
commit 246998910a
11 changed files with 67 additions and 39 deletions

View File

@ -11,9 +11,6 @@ from trezor.ui import ICON_CONFIG, draw_simple
from trezor.ui.passphrase import CANCELLED, PassphraseKeyboard from trezor.ui.passphrase import CANCELLED, PassphraseKeyboard
from trezor.ui.text import Text from trezor.ui.text import Text
if __debug__:
from apps.debug import input_signal
_MAX_PASSPHRASE_LEN = const(50) _MAX_PASSPHRASE_LEN = const(50)
@ -62,10 +59,7 @@ async def _request_on_device(ctx: wire.Context) -> str:
await ctx.call(ButtonRequest(code=ButtonRequestType.PassphraseEntry), ButtonAck) await ctx.call(ButtonRequest(code=ButtonRequestType.PassphraseEntry), ButtonAck)
keyboard = PassphraseKeyboard("Enter passphrase", _MAX_PASSPHRASE_LEN) keyboard = PassphraseKeyboard("Enter passphrase", _MAX_PASSPHRASE_LEN)
if __debug__: passphrase = await ctx.wait(keyboard)
passphrase = await ctx.wait(keyboard, input_signal())
else:
passphrase = await ctx.wait(keyboard)
if passphrase is CANCELLED: if passphrase is CANCELLED:
raise wire.ActionCancelled("Passphrase entry cancelled") raise wire.ActionCancelled("Passphrase entry cancelled")

View File

@ -13,9 +13,6 @@ from apps.common.sdcard import SdCardUnavailable, request_sd_salt
if False: if False:
from typing import Any, NoReturn, Optional, Tuple from typing import Any, NoReturn, Optional, Tuple
if __debug__:
from apps.debug import input_signal
def can_lock_device() -> bool: def can_lock_device() -> bool:
"""Return True if the device has a PIN set or SD-protect enabled.""" """Return True if the device has a PIN set or SD-protect enabled."""
@ -40,10 +37,7 @@ async def request_pin(
dialog = PinDialog(prompt, subprompt, allow_cancel) dialog = PinDialog(prompt, subprompt, allow_cancel)
while True: while True:
if __debug__: pin = await ctx.wait(dialog)
pin = await ctx.wait(dialog, input_signal())
else:
pin = await ctx.wait(dialog)
if pin is CANCELLED: if pin is CANCELLED:
raise wire.PinCancelled raise wire.PinCancelled
assert isinstance(pin, str) assert isinstance(pin, str)

View File

@ -69,7 +69,7 @@ if __debug__:
elif msg.swipe == DebugSwipeDirection.RIGHT: elif msg.swipe == DebugSwipeDirection.RIGHT:
await swipe_chan.put(swipe.SWIPE_RIGHT) await swipe_chan.put(swipe.SWIPE_RIGHT)
if msg.input is not None: if msg.input is not None:
await input_chan.put(msg.input) await input_chan.put(ui.Result(msg.input))
loop.schedule(debuglink_decision_dispatcher()) loop.schedule(debuglink_decision_dispatcher())

View File

@ -4,7 +4,7 @@ from trezor.ui import display
from trezor.ui.button import Button, ButtonClear, ButtonMono, ButtonMonoConfirm from trezor.ui.button import Button, ButtonClear, ButtonMono, ButtonMonoConfirm
if False: if False:
from typing import Optional from typing import Optional, Tuple
from trezor.ui.button import ButtonContent, ButtonStyleStateType from trezor.ui.button import ButtonContent, ButtonStyleStateType
@ -207,3 +207,10 @@ class Bip39Keyboard(ui.Layout):
self.dispatch(event, x, y) self.dispatch(event, x, y)
else: else:
self.on_timeout() self.on_timeout()
if __debug__:
def create_tasks(self) -> Tuple[loop.Task, ...]:
from apps.debug import input_signal
return super().create_tasks() + (input_signal(),)

View File

@ -4,7 +4,7 @@ from trezor.ui import display
from trezor.ui.button import Button, ButtonClear, ButtonMono, ButtonMonoConfirm from trezor.ui.button import Button, ButtonClear, ButtonMono, ButtonMonoConfirm
if False: if False:
from typing import Optional from typing import Optional, Tuple
from trezor.ui.button import ButtonContent, ButtonStyleStateType from trezor.ui.button import ButtonContent, ButtonStyleStateType
@ -217,3 +217,10 @@ class Slip39Keyboard(ui.Layout):
self.dispatch(event, x, y) self.dispatch(event, x, y)
else: else:
self.on_timeout() self.on_timeout()
if __debug__:
def create_tasks(self) -> Tuple[loop.Task, ...]:
from apps.debug import input_signal
return super().create_tasks() + (input_signal(),)

View File

@ -17,9 +17,6 @@ from .keyboard_bip39 import Bip39Keyboard
from .keyboard_slip39 import Slip39Keyboard from .keyboard_slip39 import Slip39Keyboard
from .recover import RecoveryAborted from .recover import RecoveryAborted
if __debug__:
from apps.debug import input_signal
if False: if False:
from typing import List, Optional, Callable, Iterable, Tuple, Union from typing import List, Optional, Callable, Iterable, Tuple, Union
from trezor.messages.ResetDevice import EnumTypeBackupType from trezor.messages.ResetDevice import EnumTypeBackupType
@ -45,13 +42,11 @@ async def request_word_count(ctx: wire.GenericContext, dry_run: bool) -> int:
text = Text("Recovery mode", ui.ICON_RECOVERY) text = Text("Recovery mode", ui.ICON_RECOVERY)
text.normal("Number of words?") text.normal("Number of words?")
if __debug__: count = await ctx.wait(WordSelector(text))
count = await ctx.wait(WordSelector(text), input_signal()) # WordSelector can return int, or string if the value came from debuglink
count = int(count) # if input_signal was triggered, count is a string # ctx.wait has a return type Any
else: # Hence, it is easier to convert the returned value to int explicitly
count = await ctx.wait(WordSelector(text)) return int(count)
return count # type: ignore
async def request_mnemonic( async def request_mnemonic(
@ -67,11 +62,8 @@ async def request_mnemonic(
) # type: Union[Slip39Keyboard, Bip39Keyboard] ) # type: Union[Slip39Keyboard, Bip39Keyboard]
else: else:
keyboard = Bip39Keyboard("Type word %s of %s:" % (i + 1, word_count)) keyboard = Bip39Keyboard("Type word %s of %s:" % (i + 1, word_count))
if __debug__:
word = await ctx.wait(keyboard, input_signal())
else:
word = await ctx.wait(keyboard)
word = await ctx.wait(keyboard)
words.append(word) words.append(word)
try: try:

View File

@ -14,6 +14,10 @@ from trezor.ui.text import Text
from apps.common.confirm import confirm, require_confirm, require_hold_to_confirm from apps.common.confirm import confirm, require_confirm, require_hold_to_confirm
from apps.common.layout import show_success from apps.common.layout import show_success
if False:
from trezor import loop
from typing import List, Tuple
if __debug__: if __debug__:
from apps import debug from apps import debug
@ -184,11 +188,7 @@ async def _confirm_word(ctx, share_index, share_words, offset, count, group_inde
# let the user pick a word # let the user pick a word
select = MnemonicWordSelect(choices, share_index, checked_index, count, group_index) select = MnemonicWordSelect(choices, share_index, checked_index, count, group_index)
if __debug__: selected_word = await ctx.wait(select)
selected_word = await ctx.wait(select, debug.input_signal())
else:
selected_word = await ctx.wait(select)
# confirm it is the correct one # confirm it is the correct one
return selected_word == checked_word return selected_word == checked_word
@ -647,9 +647,12 @@ class MnemonicWordSelect(ui.Layout):
if __debug__: if __debug__:
def read_content(self): def read_content(self) -> List[str]:
return self.text.read_content() + [b.text for b in self.buttons] return self.text.read_content() + [b.text for b in self.buttons]
def create_tasks(self) -> Tuple[loop.Task, ...]:
return super().create_tasks() + (debug.input_signal(),)
async def show_reset_device_warning(ctx, backup_type: BackupType = BackupType.Bip39): async def show_reset_device_warning(ctx, backup_type: BackupType = BackupType.Bip39):
text = Text("Create new wallet", ui.ICON_RESET, new_lines=False) text = Text("Create new wallet", ui.ICON_RESET, new_lines=False)

View File

@ -244,4 +244,15 @@ class PassphraseKeyboard(ui.Layout):
raise ui.Result(self.input.text) raise ui.Result(self.input.text)
def create_tasks(self) -> Tuple[loop.Task, ...]: def create_tasks(self) -> Tuple[loop.Task, ...]:
return self.handle_input(), self.handle_rendering(), self.handle_paging() tasks = (
self.handle_input(),
self.handle_rendering(),
self.handle_paging(),
) # type: Tuple[loop.Task, ...]
if __debug__:
from apps.debug import input_signal
return tasks + (input_signal(),)
else:
return tasks

View File

@ -12,7 +12,8 @@ from trezor.ui.button import (
) )
if False: if False:
from typing import Iterable, Optional from trezor import loop
from typing import Iterable, Optional, Tuple
def digit_area(i: int) -> ui.Area: def digit_area(i: int) -> ui.Area:
@ -150,3 +151,10 @@ class PinDialog(ui.Layout):
def on_confirm(self) -> None: def on_confirm(self) -> None:
if self.input.pin: if self.input.pin:
raise ui.Result(self.input.pin) raise ui.Result(self.input.pin)
if __debug__:
def create_tasks(self) -> Tuple[loop.Task, ...]:
from apps.debug import input_signal
return super().create_tasks() + (input_signal(),)

View File

@ -1,6 +1,10 @@
from trezor import ui from trezor import ui
from trezor.ui.button import Button from trezor.ui.button import Button
if False:
from trezor import loop
from typing import Tuple
# todo improve? # todo improve?
@ -40,3 +44,10 @@ class WordSelector(ui.Layout):
def on_w33(self) -> None: def on_w33(self) -> None:
raise ui.Result(33) raise ui.Result(33)
if __debug__:
def create_tasks(self) -> Tuple[loop.Task, ...]:
from apps.debug import input_signal
return super().create_tasks() + (input_signal(),)

View File

@ -112,6 +112,7 @@ if False:
async def write(self, msg: protobuf.MessageType) -> None: async def write(self, msg: protobuf.MessageType) -> None:
... ...
# XXX modify type signature so that the return value must be of the same type?
async def wait(self, *tasks: Awaitable) -> Any: async def wait(self, *tasks: Awaitable) -> Any:
... ...