1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-11-18 05:28:40 +00:00
trezor-firmware/src/apps/common/request_pin.py

61 lines
1.6 KiB
Python
Raw Normal View History

from trezor import loop, res, ui
2018-02-27 15:35:21 +00:00
from trezor.ui.confirm import CONFIRMED, ConfirmDialog
from trezor.ui.pin import PinMatrix
if __debug__:
from apps.debug import input_signal
2017-10-24 11:58:40 +00:00
class PinCancelled(Exception):
pass
2017-10-03 09:43:56 +00:00
@ui.layout
2018-03-20 15:44:23 +00:00
async def request_pin(label=None, cancellable: bool=True) -> str:
2016-06-09 14:28:34 +00:00
def onchange():
c = dialog.cancel
if matrix.pin:
back = res.load(ui.ICON_BACK)
if c.content is not back:
c.normal_style = ui.BTN_CLEAR['normal']
c.content = back
c.enable()
c.taint()
else:
lock = res.load(ui.ICON_LOCK)
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()
2018-03-20 15:44:23 +00:00
if label is None:
label = 'Enter your PIN'
matrix = PinMatrix(label)
matrix.onchange = onchange
2016-06-09 14:28:34 +00:00
dialog = ConfirmDialog(matrix)
2018-01-11 18:44:56 +00:00
dialog.cancel.area = ui.grid(12)
dialog.confirm.area = ui.grid(14)
matrix.onchange()
while True:
if __debug__:
result = await loop.spawn(dialog, input_signal)
if isinstance(result, str):
return result
else:
result = await dialog
2017-10-24 11:58:40 +00:00
if result == CONFIRMED:
return matrix.pin
elif matrix.pin: # reset
matrix.change('')
continue
else: # cancel
2017-10-24 11:58:40 +00:00
raise PinCancelled()