diff --git a/ports/stm32/boards/Passport/manifest.py b/ports/stm32/boards/Passport/manifest.py index 89788a22a..58caa8960 100644 --- a/ports/stm32/boards/Passport/manifest.py +++ b/ports/stm32/boards/Passport/manifest.py @@ -132,7 +132,6 @@ 'flows/rename_account_flow.py', 'flows/rename_derived_key_flow.py', 'flows/rename_multisig_flow.py', - 'flows/reset_pin_flow.py', 'flows/restore_backup_flow.py', 'flows/restore_seed_flow.py', 'flows/save_to_microsd_flow.py', diff --git a/ports/stm32/boards/Passport/modules/flows/__init__.py b/ports/stm32/boards/Passport/modules/flows/__init__.py index 6d38292ef..3dc0e4378 100644 --- a/ports/stm32/boards/Passport/modules/flows/__init__.py +++ b/ports/stm32/boards/Passport/modules/flows/__init__.py @@ -56,7 +56,6 @@ from .rename_account_flow import * from .rename_derived_key_flow import * from .rename_multisig_flow import * -from .reset_pin_flow import * from .restore_backup_flow import * from .restore_seed_flow import * from .scv_flow import * diff --git a/ports/stm32/boards/Passport/modules/flows/reset_pin_flow.py b/ports/stm32/boards/Passport/modules/flows/reset_pin_flow.py deleted file mode 100644 index 8dcc49562..000000000 --- a/ports/stm32/boards/Passport/modules/flows/reset_pin_flow.py +++ /dev/null @@ -1,46 +0,0 @@ -# SPDX-FileCopyrightText: © 2022 Foundation Devices, Inc. -# SPDX-License-Identifier: GPL-3.0-or-later -# -# reset_pin_flow.py - Change the user's PIN to uninitialized - ONLY FOR DEV - -pass -# from flows import Flow -# from pages import PINEntryPage, ErrorPage, SuccessPage -# from tasks import change_pin_task -# from utils import spinner_task -# import microns - - -# class ResetPINFlow(Flow): -# def __init__(self): -# super().__init__(initial_state=self.enter_old_pin, name='ResetPINFlow') - -# async def enter_old_pin(self): -# (self.old_pin, is_done) = await PINEntryPage( -# card_header={'title': 'Enter Current PIN'}, -# security_words_message='Remember these Security Words?', -# left_micron=microns.Back, -# right_micron=microns.Forward).show() -# if not is_done: -# self.set_result(None) -# return -# else: -# self.goto(self.reset_pin) - -# async def reset_pin(self): -# blank_pin = bytearray([32] * 0) -# (result, error) = await spinner_task('Resetting PIN...', change_pin_task, -# args=[self.old_pin, blank_pin]) -# if result: -# self.goto(self.show_success) -# else: -# self.error = error -# self.goto(self.show_error) - -# async def show_success(self): -# await SuccessPage(text='PIN reset successfully!').show() -# self.set_result(True) - -# async def show_error(self): -# await ErrorPage(text='PIN NOT reset: {}'.format(self.error)).show() -# self.set_result(False) diff --git a/ports/stm32/boards/Passport/modules/flows/update_firmware_flow.py b/ports/stm32/boards/Passport/modules/flows/update_firmware_flow.py index 3cafaf29d..8fb311efa 100644 --- a/ports/stm32/boards/Passport/modules/flows/update_firmware_flow.py +++ b/ports/stm32/boards/Passport/modules/flows/update_firmware_flow.py @@ -3,15 +3,7 @@ # # update_firmware_flow.py - Flow to update firmware on Passport -import lvgl as lv -from files import CardSlot -from constants import FW_HEADER_SIZE, FW_MAX_SIZE -import machine -from pages import ErrorPage, ProgressPage, QuestionPage, SuccessPage, InsertMicroSDPage -from tasks import copy_firmware_to_spi_flash_task -from flows import Flow, FilePickerFlow -from utils import read_user_firmware_pubkey, is_all_zero, start_task -from errors import Error +from flows.flow import Flow class UpdateFirmwareFlow(Flow): @@ -29,9 +21,9 @@ async def on_done(self, error=None): self.progress_page.set_result(error is None) async def choose_file(self): - root_path = CardSlot.get_sd_root() + from flows.file_picker_flow import FilePickerFlow - result = await FilePickerFlow(initial_path=root_path, suffix='-passport.bin', show_folders=True).run() + result = await FilePickerFlow(suffix='-passport.bin', show_folders=True).run() if result is None: self.set_result(False) return @@ -42,7 +34,13 @@ async def choose_file(self): self.goto(self.show_firmware_details) async def show_firmware_details(self): - import common + from common import system + from files import CardSlot + from constants import FW_HEADER_SIZE, FW_MAX_SIZE + from utils import read_user_firmware_pubkey, is_all_zero + from pages.error_page import ErrorPage + from pages.question_page import QuestionPage + with CardSlot() as card: with open(self.update_file_path, 'rb') as fp: import os @@ -68,7 +66,7 @@ async def show_firmware_details(self): return # Validate the header - is_valid, version, error_msg, is_user_signed = common.system.validate_firmware_header(header) + is_valid, version, error_msg, is_user_signed = system.validate_firmware_header(header) # print('is_valid={}, version={}, error_msg={}, is_user_signed={}'.format( # is_valid, version, error_msg, is_user_signed)) self.version = version @@ -96,6 +94,14 @@ async def show_firmware_details(self): async def copy_to_flash(self): from common import settings, system, ui + import lvgl as lv + import machine + from errors import Error + from utils import start_task + from tasks import copy_firmware_to_spi_flash_task + from pages.progress_page import ProgressPage + from pages.success_page import SuccessPage + from pages.insert_microsd_page import InsertMicroSDPage self.progress_page = ProgressPage(text='Preparing Update', left_micron=None, right_micron=None) diff --git a/ports/stm32/boards/Passport/modules/flows/verify_address_flow.py b/ports/stm32/boards/Passport/modules/flows/verify_address_flow.py index 0596fb079..c4d104edc 100644 --- a/ports/stm32/boards/Passport/modules/flows/verify_address_flow.py +++ b/ports/stm32/boards/Passport/modules/flows/verify_address_flow.py @@ -10,9 +10,7 @@ # verify_address_flow.py - Scan an address QR code and verify that it belongs to this Passport. -from flows import Flow -from common import ui -import microns +from flows.flow import Flow _RECEIVE_ADDR = const(0) @@ -22,6 +20,8 @@ class VerifyAddressFlow(Flow): def __init__(self, sig_type=None, multisig_wallet=None): + from common import ui + if sig_type is not None: initial_state = self.scan_address else: @@ -46,7 +46,7 @@ def __init__(self, sig_type=None, multisig_wallet=None): self.high_size = [0, 0] async def choose_sig_type(self): - from pages import SinglesigMultisigChooserPage + from pages.singlesig_multisig_chooser_page import SinglesigMultisigChooserPage from multisig_wallet import MultisigWallet if MultisigWallet.get_count() == 0: @@ -67,7 +67,7 @@ async def choose_sig_type(self): async def scan_address(self): import chains - from pages import ErrorPage + from pages.error_page import ErrorPage from flows import ScanQRFlow from wallets.utils import get_addr_type_from_address, get_deriv_path_from_addr_type_and_acct from utils import is_valid_btc_address, get_next_addr @@ -187,8 +187,10 @@ async def search_for_address(self): self.goto(self.not_found) async def not_found(self): - from pages import ErrorPage, LongErrorPage + from pages.error_page import ErrorPage + from pages.long_error_page import LongErrorPage import passport + import microns # Address was not found in that batch of 100, so offer to keep searching msg = 'Address Not Found\nRanges Checked:\n' @@ -211,7 +213,8 @@ async def not_found(self): self.set_result(False) async def found(self): - from pages import SuccessPage, LongSuccessPage + from pages.success_page import SuccessPage + from pages.long_success_page import LongSuccessPage from utils import save_next_addr, format_btc_address import passport diff --git a/ports/stm32/boards/Passport/modules/flows/verify_backup_flow.py b/ports/stm32/boards/Passport/modules/flows/verify_backup_flow.py index f71ec4622..1659db5fc 100644 --- a/ports/stm32/boards/Passport/modules/flows/verify_backup_flow.py +++ b/ports/stm32/boards/Passport/modules/flows/verify_backup_flow.py @@ -3,13 +3,7 @@ # # verify_backup_flow.py - Verify a selected backup file. - -from flows import Flow, FilePickerFlow -from pages import ErrorPage, SuccessPage, LongSuccessPage, InsertMicroSDPage -from utils import get_backups_folder_path, spinner_task -from tasks import verify_backup_task -from errors import Error -import passport +from flows.flow import Flow class VerifyBackupFlow(Flow): @@ -17,6 +11,9 @@ def __init__(self): super().__init__(initial_state=self.choose_file, name='VerifyBackupFlow') async def choose_file(self): + from flows.file_picker_flow import FilePickerFlow + from utils import get_backups_folder_path + backups_path = get_backups_folder_path() result = await FilePickerFlow(initial_path=backups_path, suffix='.7z', show_folders=True).run() if result is None: @@ -30,6 +27,15 @@ async def choose_file(self): self.goto(self.do_verify) async def do_verify(self): + import passport + from errors import Error + from tasks import verify_backup_task + from utils import spinner_task + from pages.error_page import ErrorPage + from pages.success_page import SuccessPage + from pages.long_success_page import LongSuccessPage + from pages.insert_microsd_page import InsertMicroSDPage + (error,) = await spinner_task( 'Verifying Backup', verify_backup_task, diff --git a/ports/stm32/boards/Passport/modules/flows/view_backup_code_flow.py b/ports/stm32/boards/Passport/modules/flows/view_backup_code_flow.py index 91e364e5f..376d5995e 100644 --- a/ports/stm32/boards/Passport/modules/flows/view_backup_code_flow.py +++ b/ports/stm32/boards/Passport/modules/flows/view_backup_code_flow.py @@ -3,10 +3,7 @@ # # view_backup_code_flow.py - Confirm the user wants to see this sensitive info, then show it. -from pages import QuestionPage, ErrorPage, BackupCodePage from flows import Flow -from tasks import get_backup_code_task -from utils import spinner_task class ViewBackupCodeFlow(Flow): @@ -14,6 +11,8 @@ def __init__(self): super().__init__(initial_state=self.confirm_show, name='ViewBackupCodeFlow') async def confirm_show(self): + from pages.question_page import QuestionPage + result = await QuestionPage( 'The next screen will show your backup code.\n\n' + 'Display this sensitive information?').show() @@ -24,6 +23,11 @@ async def confirm_show(self): self.set_result(False) async def show_backup_code(self): + from utils import spinner_task + from tasks import get_backup_code_task + from pages.error_page import ErrorPage + from pages.backup_code_page import BackupCodePage + (backup_code, error) = await spinner_task('Retrieving\nBackup Code', get_backup_code_task) if error is None: await BackupCodePage(digits=backup_code, editable=False, card_header={'title': 'Backup Code'}).show() diff --git a/ports/stm32/boards/Passport/modules/flows/view_current_firmware_flow.py b/ports/stm32/boards/Passport/modules/flows/view_current_firmware_flow.py index 16d24f12e..913fb5592 100644 --- a/ports/stm32/boards/Passport/modules/flows/view_current_firmware_flow.py +++ b/ports/stm32/boards/Passport/modules/flows/view_current_firmware_flow.py @@ -3,9 +3,7 @@ # # view_current_firmware_flow.py - View the current firmware information -from flows import Flow -from pages import SuccessPage -import microns +from flows.flow import Flow class ViewCurrentFirmwareFlow(Flow): @@ -14,6 +12,9 @@ def __init__(self): async def show_info(self): from common import system, ui + from pages.success_page import SuccessPage + import microns + (fw_version, fw_timestamp, boot_counter, user_signed, fw_date) = system.get_software_info() msg = '''Version {fw_version} diff --git a/ports/stm32/boards/Passport/modules/flows/view_derived_key_details_flow.py b/ports/stm32/boards/Passport/modules/flows/view_derived_key_details_flow.py index 194ff6fd6..d48059f54 100644 --- a/ports/stm32/boards/Passport/modules/flows/view_derived_key_details_flow.py +++ b/ports/stm32/boards/Passport/modules/flows/view_derived_key_details_flow.py @@ -3,7 +3,7 @@ # # view_derived_key_details_flow.py - Show user details of a derived key -from flows import Flow +from flows.flow import Flow class ViewDerivedKeyDetailsFlow(Flow): @@ -14,7 +14,8 @@ def __init__(self, context=None): async def show_overview(self): from utils import recolor from styles.colors import HIGHLIGHT_TEXT_HEX - from pages import LongTextPage, ErrorPage + from pages.long_text_page import LongTextPage + from pages.error_page import ErrorPage from derived_key import get_key_type_from_tn import microns diff --git a/ports/stm32/boards/Passport/modules/flows/view_dev_pubkey_flow.py b/ports/stm32/boards/Passport/modules/flows/view_dev_pubkey_flow.py index 1ad698d52..ce0fa1384 100644 --- a/ports/stm32/boards/Passport/modules/flows/view_dev_pubkey_flow.py +++ b/ports/stm32/boards/Passport/modules/flows/view_dev_pubkey_flow.py @@ -3,10 +3,7 @@ # # view_dev_pubkey_flow.py - Flow to show the developer pubkey to the user -from flows import Flow -from pages import StatusPage -import microns -from utils import read_user_firmware_pubkey, bytes_to_hex_str, split_to_lines +from flows.flow import Flow class ViewDevPubkeyFlow(Flow): @@ -14,6 +11,10 @@ def __init__(self): super().__init__(initial_state=self.show_dev_pubkey) async def show_dev_pubkey(self): + from pages.status_page import StatusPage + import microns + from utils import read_user_firmware_pubkey, bytes_to_hex_str, split_to_lines + pubkey_result, pubkey = read_user_firmware_pubkey() if pubkey_result: pubkey = bytes_to_hex_str(pubkey) diff --git a/ports/stm32/boards/Passport/modules/flows/view_multisig_details_flow.py b/ports/stm32/boards/Passport/modules/flows/view_multisig_details_flow.py index 48b712eb7..f43b4904a 100644 --- a/ports/stm32/boards/Passport/modules/flows/view_multisig_details_flow.py +++ b/ports/stm32/boards/Passport/modules/flows/view_multisig_details_flow.py @@ -3,8 +3,7 @@ # # view_multisig_details_flow.py - Show user details of an existing wallet -from flows import Flow -from pages import LongTextPage +from flows.flow import Flow class ViewMultisigDetailsFlow(Flow): @@ -17,6 +16,8 @@ def __init__(self, context=None): self.ms = MultisigWallet.get_by_idx(self.storage_idx) async def show_overview(self): + from pages.long_text_page import LongTextPage + msg, _ = self.ms.format_overview(importing=False) result = await LongTextPage(card_header={'title': self.ms.name}, text=msg, centered=True).show() @@ -28,6 +29,8 @@ async def show_overview(self): async def show_details(self): import microns + from pages.long_text_page import LongTextPage + msg = self.ms.format_details() result = await LongTextPage(card_header={'title': self.ms.name}, diff --git a/ports/stm32/boards/Passport/modules/flows/view_seed_words_flow.py b/ports/stm32/boards/Passport/modules/flows/view_seed_words_flow.py index 84c06f8ff..c6b60ba9a 100644 --- a/ports/stm32/boards/Passport/modules/flows/view_seed_words_flow.py +++ b/ports/stm32/boards/Passport/modules/flows/view_seed_words_flow.py @@ -3,7 +3,7 @@ # # view_seed_words_flow.py - Confirm the user wants to see this sensitive info, then show it. -from flows import Flow +from flows.flow import Flow class ViewSeedWordsFlow(Flow): @@ -35,7 +35,7 @@ async def generate_words(self): self.goto(self.choose_mode) async def choose_mode(self): - from pages import ChooserPage + from pages.chooser_page import ChooserPage from data_codecs.qr_type import QRType import microns @@ -70,7 +70,7 @@ async def choose_mode(self): async def show_qr(self): from flows import SeedWarningFlow - from pages import ShowQRPage + from pages.show_qr_page import ShowQRPage import microns result = await SeedWarningFlow(action_text="display your seed as a QR code", @@ -88,7 +88,7 @@ async def show_qr(self): self.goto(self.confirm_qr) async def confirm_qr(self): - from pages import InfoPage + from pages.info_page import InfoPage import microns plural_label = 's' if len(self.words) == 24 else '' @@ -126,7 +126,7 @@ async def save_to_sd(self): async def show_seed_words(self): from flows import SeedWarningFlow - from pages import SeedWordsListPage + from pages.seed_words_list_page import SeedWordsListPage if not self.qr_type: # We already gave the seed warning flow result = await SeedWarningFlow(mention_passphrase=self.mention_passphrase).run() @@ -147,7 +147,7 @@ async def show_seed_words(self): async def show_passphrase(self): import stash - from pages import InfoPage + from pages.info_page import InfoPage if stash.bip39_passphrase != '' and not self.external_key: await InfoPage(text='Passphrase: {}'.format(stash.bip39_passphrase)).show()