predicate does not need to be callable; fix menu dump
This commit is contained in:
parent
9b3673b470
commit
6598be34d4
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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),
|
||||
]
|
||||
|
||||
|
||||
@ -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?
|
||||
|
||||
@ -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))
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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:
|
||||
|
||||
Loading…
Reference in New Issue
Block a user