predicate does not need to be callable; fix menu dump

This commit is contained in:
scgbckbone 2024-04-15 23:38:48 +02:00 committed by doc-hex
parent 9b3673b470
commit 6598be34d4
7 changed files with 300 additions and 153 deletions

View File

@ -2,24 +2,6 @@
Choose PIN Code
Advanced/Tools
View Identity
Temporary Seed
Generate Words
12 Words
24 Words
12 Word Dice Roll
24 Word Dice Roll
Import Words
12 Words
18 Words
24 Words
Import via NFC
Import XPRV
Tapsigner Backup
Upgrade Firmware
Show Version
From MicroSD
From VirtDisk [IF VIRTDISK ENABLED]
Bless Firmware
Paper Wallets
Perform Selftest
Secure Logout
@ -31,15 +13,18 @@
New Seed Words
12 Words
24 Words
12 Word Dice Roll
24 Word Dice Roll
Advanced
12 Word Dice Roll
24 Word Dice Roll
Migrate COLDCARD
Import Existing
12 Words
[SEED WORD MENUS]
[SEED WORD ENTRY]
18 Words
[SEED WORD MENUS]
[SEED WORD ENTRY]
24 Words
[SEED WORD MENUS]
[SEED WORD ENTRY]
Scan QR Code [IF QR SCANNER]
Restore Backup
Clone Coldcard
Import XPRV
@ -54,18 +39,19 @@
24 Words
12 Word Dice Roll
24 Word Dice Roll
Import from QR Scan [IF QR SCANNER]
Import Words
12 Words
18 Words
24 Words
Import via NFC
Import via NFC [IF NFC ENABLED]
Import XPRV
Tapsigner Backup
Upgrade Firmware
Coldcard Backup
Upgrade Firmware [IF NOT TMP SEED]
Show Version
From MicroSD
From VirtDisk [IF VIRTDISK ENABLED]
Bless Firmware
File Management
Verify Backup
List Files
@ -77,19 +63,14 @@
Perform Selftest
I Am Developer.
Serial REPL
Wipe LFS
Warm Reset
Restore Txt Bkup
Secure Logout
Settings
Login Settings
Change Main PIN
Trick PINs
Add New Trick
Add If Wrong
Delete All
Set Nickname
Scramble Keypad
Scramble Keys
Kill Key
Login Countdown
Disabled
@ -106,10 +87,13 @@
3 days
1 week
28 days later
MicroSD 2FA [MAYBE]
MicroSD 2FA [IF SE2 SECRET AND NOT TMP SEED]
Add Card
Check Card
Remove Card #1
Calculator Login [IF QWERTY KEYBOARD]
Default Off
Calculator Login
Test Login Now
Hardware On/Off
USB Port
@ -122,23 +106,6 @@
NFC Sharing
Default Off
Enable NFC
Multisig Wallets
2/2: core2of2_native
"core2of2_native"
View Details
Delete
Coldcard Export
Descriptors
View Descriptor
Export
Bitcoin Core
Electrum Wallet
Import from File
Import via NFC [MAYBE]
Export XPUB
Create Airgapped
Trust PSBT?
Skip Checks?
Display Units
BTC
mBTC
@ -157,6 +124,25 @@
4 hours
8 hours
Never
Idle Timeout (on battery) [IF BATTERIES]
30 seconds
60 seconds
2 minutes
5 minutes
10 minutes
15 minutes
30 minutes
1 hour
4 hours
Never
LCD Brightness (on battery) [IF BATTERIES]
25%
50%
60%
70%
80% (default)
90%
100%
Delete PSBTs
Default Keep
Delete PSBTs
@ -167,26 +153,68 @@
[NORMAL OPERATION]
Ready To Sign
Passphrase
Passphrase [IF WORD BASED SEED]
Restore Saved [MAYBE]
A***********
[0C52BAD4]
Restore
Delete
Edit Phrase [MAYBE]
Add Word [IF NOT QWERTY]
[SEED WORD MENUS]
Add Numbers [IF NOT QWERTY]
Clear All [IF NOT QWERTY]
APPLY [IF NOT QWERTY]
CANCEL [IF NOT QWERTY]
Scan Any QR Code [IF QR SCANNER]
Start HSM Mode [IF HSM POLICY]
Address Explorer
Type Passwords
Seed Vault
(none saved yet)
Temporary Seed
Generate Words
12 Words
24 Words
12 Word Dice Roll
24 Word Dice Roll
Import Words
12 Words
18 Words
24 Words
Import via NFC
Import XPRV
Tapsigner Backup
Secure Logout
Classic P2PKH
↳ mtHSVByP9EYZ⋯Vm19gvpecb5R
P2SH-Segwit
↳ 2NCAJ5wD4Gvm⋯NphNU8UYoEJv
Segwit P2WPKH
↳ tb1qupyd58nd⋯vu9jtdyws9n9
Applications
Samourai
Post-mix
Pre-mix
Wasabi
Account Number
Custom Path
CC-2-of-4
Secure Notes & Passwords [IF ENBALED]
1: note1
"note1"
View Note
Edit
Delete
Export
SHORTCUT
SHORTCUT
2: nostr
"nostr"
↳ scg
↳ brb.io
View Password
Send Password [MAYBE]
Export
Edit Metadata
Delete
Change Password
SHORTCUT
SHORTCUT
New Note
New Password
Export All
Import
Type Passwords [MAYBE]
Seed Vault [MAYBE]
1: [B14E9AE0]
[B14E9AE0]
Use This Seed
Rename
Delete
Advanced/Tools
Backup
Backup System
@ -211,11 +239,10 @@
Master XPUB
Current XFP
Dump Summary
Upgrade Firmware
Upgrade Firmware [IF NOT TMP SEED]
Show Version
From MicroSD
From VirtDisk [IF VIRTDISK ENABLED]
Bless Firmware
File Management
Verify Backup
Backup System
@ -245,7 +272,32 @@
Clone Coldcard
Format SD Card
Format RAM Disk [IF VIRTDISK ENABLED]
Derive Seed B85
Secure Notes & Passwords [IF QWERTY KEYBOARD]
1: note1
"note1"
View Note
Edit
Delete
Export
SHORTCUT
SHORTCUT
2: nostr
"nostr"
↳ scg
↳ brb.io
View Password
Send Password [MAYBE]
Export
Edit Metadata
Delete
Change Password
SHORTCUT
SHORTCUT
New Note
New Password
Export All
Import
Derive Seeds (BIP-85)
View Identity
Temporary Seed
Generate Words
@ -253,23 +305,25 @@
24 Words
12 Word Dice Roll
24 Word Dice Roll
Import from QR Scan [IF QR SCANNER]
Import Words
12 Words
18 Words
24 Words
Import via NFC
Import via NFC [IF NFC ENABLED]
Import XPRV
Tapsigner Backup
Coldcard Backup
Paper Wallets
Enable HSM
Enable HSM [IF HSM AND SE2 SECRET]
Default Off
Enable
User Management
(no users yet)
User Management [IF HSM AND SE2 SECRET]
NFC Tools [IF NFC ENABLED]
Show Address
Sign Message
Verify Sig File
Verify Address
File Share
Import Multisig
Danger Zone
@ -277,22 +331,23 @@
Seed Functions
View Seed Words
Seed XOR
Split Existing
Split Existing [IF WORD BASED SEED]
Restore Seed XOR
Destroy Seed
Destroy Seed [IF SE2 SECRET AND NOT TMP SEED]
Lock Down Seed
Export SeedQR [IF WORD BASED SEED]
I Am Developer.
Serial REPL
Wipe LFS
Warm Reset
Restore Txt Bkup
Seed Vault
Seed Vault [IF SE2 SECRET]
Default Off
Enable
Perform Selftest
Set High-Water
Wipe HSM Policy [IF HSM POLICY]
Clear OV cache
Clear Address cache
Sighash Checks
Default: Block
Warn
@ -300,17 +355,31 @@
Bitcoin
Testnet3
Regtest
AE Start IDX
Default Off
Enable
Settings Space
MCU Key Slots
Bless Firmware
Reflash GPU [IF QWERTY KEYBOARD]
Wipe LFS
Settings
Login Settings
Change Main PIN
Trick PINs
Trick PINs [IF SE2 SECRET AND NOT TMP SEED]
Trick PINs:
↳123-254
PIN 123-254
↳Duress Wallet
Activate Wallet
Hide Trick
Delete Trick
Change PIN
Add New Trick
Add If Wrong
Delete All
Set Nickname
Scramble Keypad
Scramble Keys
Kill Key
Login Countdown
Disabled
@ -327,10 +396,13 @@
3 days
1 week
28 days later
MicroSD 2FA [MAYBE]
MicroSD 2FA [IF SE2 SECRET AND NOT TMP SEED]
Add Card
Check Card
Remove Card #1
Calculator Login [IF QWERTY KEYBOARD]
Default Off
Calculator Login
Test Login Now
Hardware On/Off
USB Port
@ -344,8 +416,8 @@
Default Off
Enable NFC
Multisig Wallets
2/2: core2of2_native
"core2of2_native"
2/4: CC-2-of-4
"CC-2-of-4"
View Details
Delete
Coldcard Export
@ -355,7 +427,7 @@
Bitcoin Core
Electrum Wallet
Import from File
Import via NFC [MAYBE]
Import via NFC [IF NFC ENABLED]
Export XPUB
Create Airgapped
Trust PSBT?
@ -378,6 +450,25 @@
4 hours
8 hours
Never
Idle Timeout (on battery) [IF BATTERIES]
30 seconds
60 seconds
2 minutes
5 minutes
10 minutes
15 minutes
30 minutes
1 hour
4 hours
Never
LCD Brightness (on battery) [IF BATTERIES]
25%
50%
60%
70%
80% (default)
90%
100%
Delete PSBTs
Default Keep
Delete PSBTs
@ -387,12 +478,20 @@
Keyboard EMU
Default Off
Enable
Secure Logout
SHORTCUT [IF NFC ENABLED]
Show Address
Sign Message
Verify Sig File
Verify Address
File Share
Import Multisig
---
[FACTORY MODE]
Version: 5.x.x
Bag Me Now
DFU Upgrade
Show Version
Ship W/O Bag
Debug Functions
Perform Selftest

View File

@ -537,8 +537,7 @@ Press (4) to start or (6) to hide this message forever.''', escape='46')
m = AddressListMenu()
await m.render() # slow
the_ux.push(m)
return m
# EOF

View File

@ -25,15 +25,13 @@ from charcodes import KEY_QR, KEY_NFC
# Optional feature: HSM, depends on hardware
# - code for HSM support wont exist on some platforms, so dont call it
# - code for HSM support won't exist on some platforms, so don't call it
if version.supports_hsm:
from hsm import hsm_policy_available
from users import make_users_menu
hsm_feature = lambda: True
else:
hsm_policy_available = lambda: False
hsm_feature = lambda: False
make_users_menu = lambda: []
hsm_policy_available = False
make_users_menu = None
# Q related items
if version.has_battery:
@ -53,7 +51,8 @@ else:
# - try to keep harmless things as first item: so double-tap of OK does no harm
#
# Predicates
# PREDICATES
# all predicates has to be booleans, or immediately, or after __call__
#
def has_se_secrets():
@ -81,13 +80,17 @@ def is_not_tmp():
from pincodes import pa
return not bool(pa.tmp_value)
def se2_and_real_secret():
def has_real_secret():
from pincodes import pa
return (not pa.is_secret_blank()) and (not pa.tmp_value)
def word_based_seed():
return settings.get("words", True)
def hsm_available():
# contains hsm feature + can it be used (needs se2 secret and no tmp active)
return version.supports_hsm and has_real_secret()
HWTogglesMenu = [
ToggleMenuItem('USB Port', 'du', ['Default On', 'Disable USB'], invert=True,
@ -102,21 +105,23 @@ In "auto" mode, selects PSBT as soon as written.'''),
story='''\
NFC (Near Field Communications) allows a phone to "tap" to send and receive data \
with the Coldcard.''',
predicate=lambda: version.has_nfc),
predicate=version.has_nfc),
]
# Mostly pre-login values here.
LoginPrefsMenu = [
# xxxxxxxxxxxxxxxx
MenuItem('Change Main PIN', f=main_pin_changer),
NonDefaultMenuItem('Trick PINs', 'tp', menu=TrickPinMenu.make_menu, predicate=se2_and_real_secret),
NonDefaultMenuItem('Trick PINs', 'tp', menu=TrickPinMenu.make_menu, predicate=has_real_secret),
NonDefaultMenuItem('Set Nickname', 'nick', prelogin=True, f=pick_nickname),
NonDefaultMenuItem('Scramble Keys', 'rngk', prelogin=True, f=pick_scramble, default_value=0),
NonDefaultMenuItem('Kill Key', 'kbtn', prelogin=True, f=pick_killkey),
NonDefaultMenuItem('Login Countdown', 'lgto', prelogin=True, chooser=countdown_chooser),
NonDefaultMenuItem('MicroSD 2FA', 'sd2fa', menu=microsd_2fa, predicate=se2_and_real_secret),
NonDefaultMenuItem('MicroSD 2FA', 'sd2fa', menu=microsd_2fa, predicate=has_real_secret),
PreloginToggleMenuItem('Calculator Login', 'calc', ['Default Off', 'Calculator Login'],
story='''Boots into calculator mode. Enter your PIN as formula to login, or 12- to see prefix words. Normal calculator math works too.''', predicate=lambda: version.has_qwerty),
story=('Boots into calculator mode. Enter your PIN as formula to login, '
'or 12- to see prefix words. Normal calculator math works too.'),
predicate=version.has_qwerty),
MenuItem('Test Login Now', f=login_now, arg=1),
]
@ -124,14 +129,15 @@ SettingsMenu = [
# xxxxxxxxxxxxxxxx
MenuItem('Login Settings', menu=LoginPrefsMenu),
MenuItem('Hardware On/Off', menu=HWTogglesMenu),
NonDefaultMenuItem('Multisig Wallets', 'multisig', menu=make_multisig_menu),
NonDefaultMenuItem('Multisig Wallets', 'multisig',
menu=make_multisig_menu, predicate=has_secrets),
MenuItem('Display Units', chooser=value_resolution_chooser),
MenuItem('Max Network Fee', chooser=max_fee_chooser),
MenuItem('Idle Timeout', chooser=idle_timeout_chooser),
MenuItem('Idle Timeout (on battery)', chooser=battery_idle_timeout_chooser,
predicate=lambda: version.has_battery),
predicate=version.has_battery),
MenuItem('LCD Brightness (on battery)', chooser=brightness_chooser,
predicate=lambda: version.has_battery),
predicate=version.has_battery),
ToggleMenuItem('Delete PSBTs', 'del', ['Default Keep', 'Delete PSBTs'],
story='''\
PSBT files (on SDCard) will be blanked & deleted after they are used. \
@ -211,9 +217,9 @@ DevelopersMenu = [
AdvancedVirginMenu = [ # No PIN, no secrets yet (factory fresh)
# xxxxxxxxxxxxxxxx
MenuItem("View Identity", f=view_ident),
MenuItem('Paper Wallets', f=make_paper_wallet, predicate=lambda: make_paper_wallet),
MenuItem('Paper Wallets', f=make_paper_wallet),
MenuItem('Perform Selftest', f=start_selftest),
MenuItem('Secure Logout', f=logout_now, predicate=lambda: not version.has_battery),
MenuItem('Secure Logout', f=logout_now, predicate=not version.has_battery),
]
AdvancedPinnedVirginMenu = [ # Has PIN but no secrets yet
@ -222,17 +228,17 @@ AdvancedPinnedVirginMenu = [ # Has PIN but no secrets yet
MenuItem("Temporary Seed", menu=make_ephemeral_seed_menu),
MenuItem("Upgrade Firmware", menu=UpgradeMenu, predicate=is_not_tmp),
MenuItem("File Management", menu=FileMgmtMenu),
MenuItem('Paper Wallets', f=make_paper_wallet, predicate=lambda: make_paper_wallet),
MenuItem('Paper Wallets', f=make_paper_wallet),
MenuItem('Perform Selftest', f=start_selftest),
MenuItem("I Am Developer.", menu=maybe_dev_menu),
MenuItem('Secure Logout', f=logout_now, predicate=lambda: not version.has_battery),
MenuItem('Secure Logout', f=logout_now, predicate=not version.has_battery),
]
DebugFunctionsMenu = [
# xxxxxxxxxxxxxxxx
MenuItem("Lamp Test", f=lamp_test),
MenuItem("Keyboard Test", f=keyboard_test),
MenuItem('BBQr Demo', f=debug_bbqr_test, predicate=lambda: version.has_qwerty),
MenuItem('BBQr Demo', f=debug_bbqr_test, predicate=version.has_qwerty),
MenuItem('Debug: assert', f=debug_assert),
MenuItem('Debug: except', f=debug_except),
MenuItem('Check: BL FW', f=check_firewall_read),
@ -249,7 +255,7 @@ SeedXORMenu = [
SeedFunctionsMenu = [
MenuItem('View Seed Words', f=view_seed_words), # text is a little wrong sometimes, rare
MenuItem('Seed XOR', menu=SeedXORMenu),
MenuItem("Destroy Seed", f=clear_seed, predicate=se2_and_real_secret),
MenuItem("Destroy Seed", f=clear_seed, predicate=has_real_secret),
MenuItem('Lock Down Seed', f=convert_ephemeral_to_master),
MenuItem('Export SeedQR', f=export_seedqr, predicate=word_based_seed),
]
@ -293,7 +299,7 @@ correctly- crafted transactions signed on Testnet could be broadcast on Mainnet.
MenuItem('Settings Space', f=show_settings_space),
MenuItem('MCU Key Slots', f=show_mcu_keys_left),
MenuItem('Bless Firmware', f=bless_flash), # no need for this anymore?
MenuItem('Reflash GPU', f=reflash_gpu, predicate=lambda: version.has_qwerty),
MenuItem('Reflash GPU', f=reflash_gpu, predicate=version.has_qwerty),
MenuItem("Wipe LFS", f=wipe_filesystem), # kills other-seed settings, HSM stuff, addr cache
]
@ -321,18 +327,18 @@ AdvancedNormalMenu = [
MenuItem("Upgrade Firmware", menu=UpgradeMenu, predicate=is_not_tmp),
MenuItem("File Management", menu=FileMgmtMenu),
NonDefaultMenuItem('Secure Notes & Passwords', 'notes', menu=make_notes_menu,
predicate=lambda: version.has_qwerty),
predicate=version.has_qwerty),
MenuItem('Derive Seed B85' if not version.has_qwerty else 'Derive Seeds (BIP-85)',
f=drv_entro_start),
MenuItem("View Identity", f=view_ident),
MenuItem("Temporary Seed", menu=make_ephemeral_seed_menu),
MenuItem('Paper Wallets', f=make_paper_wallet, predicate=lambda: make_paper_wallet),
MenuItem('Paper Wallets', f=make_paper_wallet),
ToggleMenuItem('Enable HSM', 'hsmcmd', ['Default Off', 'Enable'],
story=("Enable HSM? Enables all user management commands, and other HSM-only USB commands. "
"By default these commands are disabled."),
predicate=lambda: hsm_feature() and se2_and_real_secret()),
predicate=hsm_available),
MenuItem('User Management', menu=make_users_menu,
predicate=lambda: hsm_feature() and se2_and_real_secret()),
predicate=hsm_available),
MenuItem('NFC Tools', predicate=nfc_enabled, menu=NFCToolsMenu, shortcut=KEY_NFC),
MenuItem("Danger Zone", menu=DangerZoneMenu, shortcut='z'),
]
@ -343,14 +349,14 @@ VirginSystem = [
MenuItem('Choose PIN Code', f=initial_pin_setup),
MenuItem('Advanced/Tools', menu=AdvancedVirginMenu),
MenuItem('Bag Number', f=show_bag_number),
MenuItem('Help', f=virgin_help, predicate=lambda: not version.has_qwerty),
MenuItem('Help', f=virgin_help, predicate=not version.has_qwerty),
]
ImportWallet = [
MenuItem("12 Words", menu=start_seed_import, arg=12),
MenuItem("18 Words", menu=start_seed_import, arg=18),
MenuItem("24 Words", menu=start_seed_import, arg=24),
MenuItem('Scan QR Code', predicate=lambda: version.has_qr,
MenuItem('Scan QR Code', predicate=version.has_qr,
shortcut=KEY_QR, f=scan_any_qr, arg=(True, False)),
MenuItem("Restore Backup", f=restore_everything),
MenuItem("Clone Coldcard", menu=clone_start),
@ -376,7 +382,7 @@ EmptyWallet = [
MenuItem('New Seed Words', menu=NewSeedMenu),
MenuItem("Migrate COLDCARD", menu=clone_start),
MenuItem('Import Existing', menu=ImportWallet),
MenuItem('Help', f=virgin_help, predicate=lambda: not version.has_qwerty),
MenuItem('Help', f=virgin_help, predicate=not version.has_qwerty),
MenuItem('Advanced/Tools', menu=AdvancedPinnedVirginMenu),
MenuItem('Settings', menu=SettingsMenu),
]
@ -386,20 +392,20 @@ EmptyWallet = [
NormalSystem = [
# xxxxxxxxxxxxxxxx
MenuItem('Ready To Sign', f=ready2sign, shortcut='r'),
MenuItem('Passphrase', f=start_b39_pw, predicate=word_based_seed, shortcut='p'),
MenuItem('Scan Any QR Code', predicate=lambda: version.has_qr,
MenuItem('Passphrase', menu=start_b39_pw, predicate=word_based_seed, shortcut='p'),
MenuItem('Scan Any QR Code', predicate=version.has_qr,
shortcut=KEY_QR, f=scan_any_qr, arg=(False, True)),
MenuItem('Start HSM Mode', f=start_hsm_menu_item, predicate=hsm_policy_available),
MenuItem("Address Explorer", f=address_explore, shortcut='x'),
MenuItem("Address Explorer", menu=address_explore, shortcut='x'),
MenuItem('Secure Notes & Passwords', menu=make_notes_menu, shortcut='n',
predicate=lambda: (settings.get("notes", False) != False)),
predicate=lambda: version.has_qwerty and (settings.get("notes", False) != False)),
MenuItem('Type Passwords', f=password_entry, shortcut='t',
predicate=lambda: settings.get("emu", False) and has_secrets()),
MenuItem('Seed Vault', menu=make_seed_vault_menu, shortcut='v',
predicate=lambda: settings.master_get('seedvault') and has_secrets()),
MenuItem('Advanced/Tools', menu=AdvancedNormalMenu, shortcut='t'),
MenuItem('Settings', menu=SettingsMenu, shortcut='s'),
MenuItem('Secure Logout', f=logout_now, predicate=lambda: not version.has_battery),
MenuItem('Secure Logout', f=logout_now, predicate=not version.has_battery),
ShortcutItem(KEY_NFC, predicate=nfc_enabled, menu=NFCToolsMenu),
]

View File

@ -5,8 +5,8 @@
import gc
from ux import PressRelease, the_ux
from uasyncio import sleep_ms
from charcodes import (KEY_LEFT, KEY_RIGHT, KEY_UP, KEY_DOWN, KEY_HOME, KEY_SPACE,
KEY_END, KEY_PAGE_UP, KEY_PAGE_DOWN, KEY_ENTER, KEY_CANCEL)
from charcodes import (KEY_UP, KEY_DOWN, KEY_HOME, KEY_SPACE, KEY_END,
KEY_PAGE_UP, KEY_PAGE_DOWN, KEY_ENTER, KEY_CANCEL)
from version import has_qwerty
# Number of full text lines per screen.
@ -62,7 +62,8 @@ def start_chooser(chooser):
the_ux.push(m)
class MenuItem:
def __init__(self, label, menu=None, f=None, chooser=None, arg=None, predicate=None, shortcut=None):
def __init__(self, label, menu=None, f=None, chooser=None, arg=None,
predicate=None, shortcut=None):
self.label = label
self.arg = arg
if menu:
@ -71,10 +72,17 @@ class MenuItem:
self.next_function = f
if chooser:
self.chooser = chooser
if predicate:
self.predicate = predicate
if predicate is not None:
self._predicate = predicate
if shortcut:
self.shortcut_key = shortcut
def predicate(self):
if not hasattr(self, "_predicate"):
return True # does not have predicate - allow
if callable(self._predicate):
return self._predicate()
return self._predicate
async def activate(self, menu, idx):
@ -133,8 +141,9 @@ class NonDefaultMenuItem(MenuItem):
class ToggleMenuItem(MenuItem):
# Handle toggles: must use undefined (missing) as default
# - can remap values a little, but default is to store 0/1/2
def __init__(self, label, nvkey, choices, predicate=None, story=None, on_change=None, invert=False, value_map=None, prelogin=False):
self.label = label
def __init__(self, label, nvkey, choices, predicate=None, story=None,
on_change=None, invert=False, value_map=None):
super().__init__(label, predicate=predicate)
self.story = story
self.nvkey = nvkey
self.choices = choices # list of strings, at least 2
@ -143,8 +152,6 @@ class ToggleMenuItem(MenuItem):
self.invert = True
if value_map:
self.value_map = value_map
if predicate:
self.predicate = predicate
def get(self, default=None):
from glob import settings
@ -254,8 +261,11 @@ class MenuSystem:
self.cursor = 0
self.ypos = 0
self.items = [m for m in menu_items if not isinstance(m, ShortcutItem) and
(not getattr(m, 'predicate', None) or m.predicate())]
self.items = [
m
for m in menu_items
if not isinstance(m, ShortcutItem) and m.predicate()
]
for m in menu_items:
if isinstance(m, ShortcutItem):
self.shortcuts[m.shortcut_key] = m
@ -437,7 +447,7 @@ class MenuSystem:
elif key in self.shortcuts:
# run the function, if predicate allows
m = self.shortcuts[key]
if not getattr(m, 'predicate', None) or m.predicate():
if m.predicate():
return m
else:
# maybe a shortcut?

View File

@ -1259,7 +1259,8 @@ class MultisigMenu(MenuSystem):
menu=make_ms_wallet_menu, arg=ms.storage_idx))
from glob import NFC
rv.append(MenuItem('Import from File', f=import_multisig))
rv.append(MenuItem('Import via NFC', f=import_multisig_nfc, predicate=lambda: NFC is not None))
rv.append(MenuItem('Import via NFC', f=import_multisig_nfc,
predicate=bool(NFC)))
rv.append(MenuItem('Export XPUB', f=export_multisig_xpubs))
rv.append(MenuItem('Create Airgapped', f=create_ms_step1))
rv.append(MenuItem('Trust PSBT?', f=trust_psbt_menu))

View File

@ -1048,7 +1048,7 @@ class EphemeralSeedMenu(MenuSystem):
MenuItem("12 Words", f=cls.ephemeral_seed_import, arg=12),
MenuItem("18 Words", f=cls.ephemeral_seed_import, arg=18),
MenuItem("24 Words", f=cls.ephemeral_seed_import, arg=24),
MenuItem("Import via NFC", f=nfc_recv_ephemeral, predicate=lambda: NFC is not None),
MenuItem("Import via NFC", f=nfc_recv_ephemeral, predicate=bool(NFC)),
]
gen_ephemeral_menu = [
MenuItem("12 Words", f=cls.ephemeral_seed_generate, arg=12),
@ -1059,7 +1059,7 @@ class EphemeralSeedMenu(MenuSystem):
rv = [
MenuItem("Generate Words", menu=gen_ephemeral_menu),
MenuItem('Import from QR Scan', predicate=lambda: version.has_qr,
MenuItem('Import from QR Scan', predicate=version.has_qr,
shortcut=KEY_QR, f=scan_any_qr, arg=(True, True)),
MenuItem("Import Words", menu=import_ephemeral_menu),
MenuItem("Import XPRV", f=import_xprv, arg=True), # ephemeral=True
@ -1131,8 +1131,7 @@ OK to continue or press (2) to hide this message forever.
await apply_pass_value(pp)
else:
# provide a menu, especially on Mk4 where it offers a number of input methods
m = PassphraseMenu()
the_ux.push(m)
return PassphraseMenu()
class PassphraseMenu(MenuSystem):

View File

@ -7,14 +7,15 @@
# ../unix/work/menudump.txt
async def doit():
import version
async def dump_menu(fd, m, label, indent, menu_item=None, menu_idx=0, whs=False):
from menu import MenuItem, ToggleMenuItem, MenuSystem
from menu import MenuItem, ToggleMenuItem, MenuSystem, NonDefaultMenuItem
from seed import WordNestMenu, EphemeralSeedMenu, SeedVaultMenu
from multisig import MultisigMenu
from trick_pins import TrickPinMenu
from users import UsersMenu
from flow import has_secrets, nfc_enabled, vdisk_enabled
from flow import hsm_policy_available
from flow import has_secrets, nfc_enabled, vdisk_enabled, word_based_seed
from flow import hsm_policy_available, is_not_tmp, has_real_secret
from flow import has_se_secrets, hsm_available
print("%s%s"% (indent, label), file=fd)
@ -23,11 +24,18 @@ async def doit():
m = []
# recursing into functions that do stuff doesn't work well, skip
avoid = {'Clone Coldcard', 'Debug Functions'}
avoid = {'Clone Coldcard', 'Debug Functions', 'Migrate COLDCARD'}
if any(label.startswith(a) for a in avoid):
return
if callable(m):
if version.has_qwerty and m.__name__ == "start_seed_import":
print('%s[SEED WORD ENTRY]' % indent, file=fd)
return
if m.__name__ == "make_custom":
# address explorer custom path menu
return
print("Calling: %r (%s)" % (m.__name__, label))
m = await m(m, 0, menu_item)
print("Done")
@ -39,8 +47,7 @@ async def doit():
if isinstance(m, WordNestMenu):
print('%s[SEED WORD MENUS]' % indent, file=fd)
return
if isinstance(m, EphemeralSeedMenu) or isinstance(m, MultisigMenu) \
or isinstance(m, SeedVaultMenu):
if isinstance(m, MenuSystem):
m = [i for i in m.items]
for xm in [TrickPinMenu, UsersMenu]:
if isinstance(m, xm):
@ -51,11 +58,26 @@ async def doit():
if isinstance(mi, str):
here = mi
elif isinstance(mi, MenuItem):
elif isinstance(mi, MenuItem) or isinstance(mi, NonDefaultMenuItem):
here = mi.label
pred = getattr(mi, 'predicate', False)
if pred == has_secrets:
if here == "Trick PINs" and not whs:
# trick pins are not available in EmptyWallet
continue
pred = getattr(mi, 'predicate', None)
if pred in (True, False):
if here in ("NFC Tools", "Import via NFC", "NFC File Share"):
here += ' [IF NFC ENABLED]'
if "QR" in here and "Scan" in here:
here += ' [IF QR SCANNER]'
if "battery" in here:
here += ' [IF BATTERIES]'
if here in ("Calculator Login", "Reflash GPU", "Secure Notes & Passwords"):
here += ' [IF QWERTY KEYBOARD]'
if here in ("Start HSM Mode", "Wipe HSM Policy"):
here += ' [IF HSM POLICY]'
elif pred == has_secrets:
#here += ' [IF SEED DEFINED]'
if not whs: # "would have secrets"
continue
@ -65,10 +87,21 @@ async def doit():
here += ' [IF VIRTDISK ENABLED]'
elif pred == hsm_policy_available:
here += ' [IF HSM POLICY]'
elif 'lambda' in repr(pred):
pass
elif pred == has_se_secrets:
here += ' [IF SE2 SECRET]'
elif pred == word_based_seed:
here += ' [IF WORD BASED SEED]'
elif pred == is_not_tmp:
here += ' [IF NOT TMP SEED]'
elif pred == has_real_secret:
here += ' [IF SE2 SECRET AND NOT TMP SEED]'
elif pred == hsm_available:
here += ' [IF HSM AND SE2 SECRET]'
elif pred:
here += ' [MAYBE]'
if here == "Secure Notes & Passwords":
here += ' [IF ENBALED]'
else:
here += ' [MAYBE]'
# NOTE: most attributes not present unless used
funct = getattr(mi, 'next_func', None)
@ -78,8 +111,7 @@ async def doit():
rv = await funct(m, menu_idx, mi)
if isinstance(rv, MenuSystem):
await dump_menu(fd, rv, here, indent, menu_item=mi, menu_idx=menu_idx, whs=whs)
except:
pass
except: pass
next_menu = getattr(mi, 'next_menu', None)
chooser = getattr(mi, 'chooser', None)
@ -106,6 +138,7 @@ async def doit():
# that need user interaction nad/or show hidden items
settings.put("seedvault", 1)
settings.put("axskip", 1)
settings.put("b39skip", 1)
settings.put("sd2fa", ["a"])
with open('menudump.txt', 'wt') as fd: