mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-01-20 20:31:06 +00:00
src: handle wire msgs while waiting for ui
This commit is contained in:
parent
a46f7b2fad
commit
8f1ed5edce
@ -19,9 +19,9 @@ async def confirm(ctx, content, code=None, *args, **kwargs):
|
|||||||
dialog = ConfirmDialog(content, *args, **kwargs)
|
dialog = ConfirmDialog(content, *args, **kwargs)
|
||||||
|
|
||||||
if __debug__:
|
if __debug__:
|
||||||
waiter = loop.wait(signal, dialog)
|
waiter = ctx.wait(signal, dialog)
|
||||||
else:
|
else:
|
||||||
waiter = dialog
|
waiter = ctx.wait(dialog)
|
||||||
return await waiter == CONFIRMED
|
return await waiter == CONFIRMED
|
||||||
|
|
||||||
|
|
||||||
@ -34,9 +34,9 @@ async def hold_to_confirm(ctx, content, code=None, *args, **kwargs):
|
|||||||
dialog = HoldToConfirmDialog(content, 'Hold to confirm', *args, **kwargs)
|
dialog = HoldToConfirmDialog(content, 'Hold to confirm', *args, **kwargs)
|
||||||
|
|
||||||
if __debug__:
|
if __debug__:
|
||||||
waiter = loop.wait(signal, dialog)
|
waiter = ctx.wait(signal, dialog)
|
||||||
else:
|
else:
|
||||||
waiter = dialog
|
waiter = ctx.wait(dialog)
|
||||||
return await waiter == CONFIRMED
|
return await waiter == CONFIRMED
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
from trezor import ui, wire
|
from trezor import loop, ui, wire
|
||||||
from trezor.messages import ButtonRequestType, wire_types
|
from trezor.messages import ButtonRequestType, wire_types
|
||||||
from trezor.messages.ButtonRequest import ButtonRequest
|
from trezor.messages.ButtonRequest import ButtonRequest
|
||||||
from trezor.messages.FailureType import ActionCancelled, ProcessError
|
from trezor.messages.FailureType import ActionCancelled, ProcessError
|
||||||
@ -24,7 +24,8 @@ async def request_passphrase_entry(ctx):
|
|||||||
if ack.MESSAGE_WIRE_TYPE == wire_types.Cancel:
|
if ack.MESSAGE_WIRE_TYPE == wire_types.Cancel:
|
||||||
raise wire.FailureError(ActionCancelled, 'Passphrase cancelled')
|
raise wire.FailureError(ActionCancelled, 'Passphrase cancelled')
|
||||||
|
|
||||||
return await EntrySelector(text)
|
selector = EntrySelector(text)
|
||||||
|
return await ctx.wait(selector)
|
||||||
|
|
||||||
|
|
||||||
@ui.layout
|
@ui.layout
|
||||||
@ -43,7 +44,8 @@ async def request_passphrase_ack(ctx, on_device):
|
|||||||
if on_device:
|
if on_device:
|
||||||
if ack.passphrase is not None:
|
if ack.passphrase is not None:
|
||||||
raise wire.FailureError(ProcessError, 'Passphrase provided when it should not be')
|
raise wire.FailureError(ProcessError, 'Passphrase provided when it should not be')
|
||||||
passphrase = await PassphraseKeyboard('Enter passphrase')
|
keyboard = PassphraseKeyboard('Enter passphrase')
|
||||||
|
passphrase = await ctx.wait(keyboard)
|
||||||
if passphrase == CANCELLED:
|
if passphrase == CANCELLED:
|
||||||
raise wire.FailureError(ActionCancelled, 'Passphrase cancelled')
|
raise wire.FailureError(ActionCancelled, 'Passphrase cancelled')
|
||||||
else:
|
else:
|
||||||
|
@ -66,7 +66,7 @@ async def request_pin_ack(ctx, *args, **kwargs):
|
|||||||
# TODO: send PinMatrixRequest here, with specific code?
|
# TODO: send PinMatrixRequest here, with specific code?
|
||||||
await ctx.call(ButtonRequest(code=Other), wire_types.ButtonAck)
|
await ctx.call(ButtonRequest(code=Other), wire_types.ButtonAck)
|
||||||
try:
|
try:
|
||||||
return await request_pin(*args, **kwargs)
|
return await ctx.wait(request_pin(*args, **kwargs))
|
||||||
except PinCancelled:
|
except PinCancelled:
|
||||||
raise wire.FailureError(FailureType.ActionCancelled, 'Cancelled')
|
raise wire.FailureError(FailureType.ActionCancelled, 'Cancelled')
|
||||||
|
|
||||||
|
@ -60,7 +60,7 @@ async def request_wordcount(ctx):
|
|||||||
|
|
||||||
content = Text('Device recovery', ui.ICON_RECOVERY, 'Number of words?')
|
content = Text('Device recovery', ui.ICON_RECOVERY, 'Number of words?')
|
||||||
select = WordSelector(content)
|
select = WordSelector(content)
|
||||||
count = await select
|
count = await ctx.wait(select)
|
||||||
|
|
||||||
return count
|
return count
|
||||||
|
|
||||||
@ -73,7 +73,7 @@ async def request_mnemonic(ctx, count: int) -> str:
|
|||||||
board = MnemonicKeyboard()
|
board = MnemonicKeyboard()
|
||||||
for i in range(count):
|
for i in range(count):
|
||||||
board.prompt = 'Type the %s word:' % format_ordinal(i + 1)
|
board.prompt = 'Type the %s word:' % format_ordinal(i + 1)
|
||||||
word = await board
|
word = await ctx.wait(board)
|
||||||
words.append(word)
|
words.append(word)
|
||||||
|
|
||||||
return ' '.join(words)
|
return ' '.join(words)
|
||||||
|
@ -155,7 +155,8 @@ async def show_mnemonic(ctx, mnemonic: str):
|
|||||||
words_per_page = const(4)
|
words_per_page = const(4)
|
||||||
words = list(enumerate(mnemonic.split()))
|
words = list(enumerate(mnemonic.split()))
|
||||||
pages = list(chunks(words, words_per_page))
|
pages = list(chunks(words, words_per_page))
|
||||||
await paginate(show_mnemonic_page, len(pages), first_page, pages)
|
paginator = paginate(show_mnemonic_page, len(pages), first_page, pages)
|
||||||
|
await ctx.wait(paginator)
|
||||||
|
|
||||||
|
|
||||||
@ui.layout
|
@ui.layout
|
||||||
@ -171,13 +172,22 @@ async def show_mnemonic_page(page: int, page_count: int, pages: list):
|
|||||||
await animate_swipe()
|
await animate_swipe()
|
||||||
|
|
||||||
|
|
||||||
@ui.layout
|
|
||||||
async def check_mnemonic(ctx, mnemonic: str) -> bool:
|
async def check_mnemonic(ctx, mnemonic: str) -> bool:
|
||||||
words = mnemonic.split()
|
words = mnemonic.split()
|
||||||
index = random.uniform(len(words) // 2) # first half
|
|
||||||
result = await MnemonicKeyboard('Type the %s word:' % format_ordinal(index + 1))
|
# check a word from the first half
|
||||||
if result != words[index]:
|
index = random.uniform(len(words) // 2)
|
||||||
|
if not await check_word(ctx, words, index):
|
||||||
return False
|
return False
|
||||||
index = len(words) // 2 + random.uniform(len(words) // 2) # second half
|
|
||||||
result = await MnemonicKeyboard('Type the %s word:' % format_ordinal(index + 1))
|
# check a word from the second half
|
||||||
|
index = random.uniform(len(words) // 2) + len(words) // 2
|
||||||
|
if not await check_word(ctx, words, index):
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
@ui.layout
|
||||||
|
async def check_word(ctx, words: list, index: int):
|
||||||
|
keyboard = MnemonicKeyboard('Type the %s word:' % format_ordinal(index + 1))
|
||||||
|
result = await ctx.wait(keyboard)
|
||||||
return result == words[index]
|
return result == words[index]
|
||||||
|
@ -19,11 +19,7 @@ def register(mtype, handler, *args):
|
|||||||
|
|
||||||
def setup(iface):
|
def setup(iface):
|
||||||
'''Initialize the wire stack on passed USB interface.'''
|
'''Initialize the wire stack on passed USB interface.'''
|
||||||
# session_supervisor = codec_v2.SesssionSupervisor(iface, session_handler)
|
loop.schedule(session_handler(iface, codec_v1.SESSION_ID))
|
||||||
# session_supervisor.open(codec_v1.SESSION_ID)
|
|
||||||
# loop.schedule(session_supervisor.listen())
|
|
||||||
handler = session_handler(iface, codec_v1.SESSION_ID)
|
|
||||||
loop.schedule(handler)
|
|
||||||
|
|
||||||
|
|
||||||
class Context:
|
class Context:
|
||||||
@ -81,6 +77,14 @@ class Context:
|
|||||||
await protobuf.dump_message(writer, msg)
|
await protobuf.dump_message(writer, msg)
|
||||||
await writer.aclose()
|
await writer.aclose()
|
||||||
|
|
||||||
|
def wait(self, *tasks):
|
||||||
|
'''
|
||||||
|
Wait until one of the passed tasks finishes, and return the result,
|
||||||
|
while servicing the wire context. If a message comes until one of the
|
||||||
|
tasks ends, `UnexpectedMessageError` is raised.
|
||||||
|
'''
|
||||||
|
return loop.wait(self.read(()), *tasks)
|
||||||
|
|
||||||
def getreader(self):
|
def getreader(self):
|
||||||
return codec_v1.Reader(self.iface)
|
return codec_v1.Reader(self.iface)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user