trezor-core/src/apps/management/change_pin.py

73 lines
2.1 KiB
Python
Raw Normal View History

from trezor import ui
2017-12-08 08:26:51 -08:00
from trezor import config
from trezor.pin import pin_to_int, show_pin_timeout
2017-12-08 08:26:51 -08:00
async def request_pin(ctx):
from trezor.messages.ButtonRequest import ButtonRequest
from trezor.messages.wire_types import ButtonAck
from apps.common.request_pin import request_pin
2017-12-08 08:26:51 -08:00
await ctx.call(ButtonRequest(), ButtonAck)
2017-12-08 08:26:51 -08:00
return await request_pin()
2017-12-08 08:26:51 -08:00
async def request_pin_confirm(ctx):
while True:
pin1 = await request_pin(ctx)
pin2 = await request_pin(ctx)
if pin1 == pin2:
return pin1
# TODO: display a message and wait
def confirm_change_pin(ctx, msg):
from apps.common.confirm import require_confirm
from trezor.ui.text import Text
2017-12-08 08:26:51 -08:00
has_pin = config.has_pin()
if msg.remove and has_pin: # removing pin
return require_confirm(ctx, Text(
'Remove PIN', ui.ICON_RESET,
'Do you really want to', ui.BOLD,
'remove current PIN?'))
if not msg.remove and has_pin: # changing pin
return require_confirm(ctx, Text(
'Change PIN', ui.ICON_RESET,
'Do you really want to', ui.BOLD,
'change current PIN?'))
if not msg.remove and not has_pin: # setting new pin
return require_confirm(ctx, Text(
'Change PIN', ui.ICON_RESET,
'Do you really want to', ui.BOLD,
'set new PIN?'))
2017-08-15 06:09:09 -07:00
async def layout_change_pin(ctx, msg):
from trezor.messages.Success import Success
from trezor.messages.Failure import Failure
from trezor.messages.FailureType import PinInvalid
2017-12-08 08:26:51 -08:00
await confirm_change_pin(ctx, msg)
2017-12-08 08:26:51 -08:00
if config.has_pin():
curr_pin = await request_pin(ctx)
else:
2017-12-08 08:26:51 -08:00
curr_pin = ''
if msg.remove:
new_pin = ''
else:
new_pin = await request_pin_confirm(ctx)
if config.change_pin(pin_to_int(curr_pin), pin_to_int(new_pin), show_pin_timeout):
if new_pin:
return Success(message='PIN changed')
else:
return Success(message='PIN removed')
else:
return Failure(code=PinInvalid, message='PIN invalid')