Add interactive option and move setup and restore to interactive only
This commit is contained in:
parent
0dd2e86394
commit
18857d9cd0
@ -9,7 +9,8 @@ from .errors import (
|
||||
DEVICE_CONN_ERROR,
|
||||
NO_PASSWORD,
|
||||
UNKNWON_DEVICE_TYPE,
|
||||
UNKNOWN_ERROR
|
||||
UNKNOWN_ERROR,
|
||||
UNAVAILABLE_ACTION
|
||||
)
|
||||
from . import __version__
|
||||
|
||||
@ -38,10 +39,14 @@ def getkeypool_handler(args, client):
|
||||
return getkeypool(client, path=args.path, start=args.start, end=args.end, internal=args.internal, keypool=args.keypool, account=args.account, sh_wpkh=args.sh_wpkh, wpkh=args.wpkh)
|
||||
|
||||
def restore_device_handler(args, client):
|
||||
return restore_device(client, label=args.label)
|
||||
if args.interactive:
|
||||
return restore_device(client, label=args.label)
|
||||
return {'error': 'restore requires interactive mode', 'code': UNAVAILABLE_ACTION}
|
||||
|
||||
def setup_device_handler(args, client):
|
||||
return setup_device(client, label=args.label, backup_passphrase=args.backup_passphrase)
|
||||
if args.interactive:
|
||||
return setup_device(client, label=args.label, backup_passphrase=args.backup_passphrase)
|
||||
return {'error': 'setup requires interactive mode', 'code': UNAVAILABLE_ACTION}
|
||||
|
||||
def signmessage_handler(args, client):
|
||||
return signmessage(client, message=args.message, path=args.path)
|
||||
@ -69,6 +74,7 @@ def process_commands(cli_args):
|
||||
parser.add_argument('--fingerprint', '-f', help='Specify the device to connect to using the first 4 bytes of the hash160 of the master public key. It will connect to the first device that matches this fingerprint.')
|
||||
parser.add_argument('--version', action='version', version='%(prog)s {}'.format(__version__))
|
||||
parser.add_argument('--stdin', help='Enter commands and arguments via stdin', action='store_true')
|
||||
parser.add_argument('--interactive', '-i', help='Use some commands interactively. Currently required for all device configuration commands', action='store_true')
|
||||
|
||||
subparsers = parser.add_subparsers(description='Commands', dest='command')
|
||||
# work-around to make subparser required
|
||||
@ -112,7 +118,7 @@ def process_commands(cli_args):
|
||||
displayaddr_parser.add_argument('--wpkh', action='store_true', help='Display the bech32 version of the address associated with this key path')
|
||||
displayaddr_parser.set_defaults(func=displayaddress_handler)
|
||||
|
||||
setupdev_parser = subparsers.add_parser('setup', help='Setup a device. Passphrase protection uses the password given by -p')
|
||||
setupdev_parser = subparsers.add_parser('setup', help='Setup a device. Passphrase protection uses the password given by -p. Requires interactive mode')
|
||||
setupdev_parser.add_argument('--label', '-l', help='The name to give to the device', default='')
|
||||
setupdev_parser.add_argument('--backup_passphrase', '-b', help='The passphrase to use for the backup, if applicable', default='')
|
||||
setupdev_parser.set_defaults(func=setup_device_handler)
|
||||
@ -120,7 +126,7 @@ def process_commands(cli_args):
|
||||
wipedev_parser = subparsers.add_parser('wipe', help='Wipe a device')
|
||||
wipedev_parser.set_defaults(func=wipe_device_handler)
|
||||
|
||||
restore_parser = subparsers.add_parser('restore', help='Initiate the device restoring process')
|
||||
restore_parser = subparsers.add_parser('restore', help='Initiate the device restoring process. Requires interactive mode')
|
||||
restore_parser.add_argument('--label', '-l', help='The name to give to the device', default='')
|
||||
restore_parser.set_defaults(func=restore_device_handler)
|
||||
|
||||
|
||||
@ -30,7 +30,7 @@ def coldcard_test_suite(simulator, rpc, userpass, interface):
|
||||
# Coldcard specific management command tests
|
||||
class TestColdcardManCommands(DeviceTestCase):
|
||||
def test_setup(self):
|
||||
result = self.do_command(self.dev_args + ['setup'])
|
||||
result = self.do_command(self.dev_args + ['-i', 'setup'])
|
||||
self.assertIn('error', result)
|
||||
self.assertIn('code', result)
|
||||
self.assertEqual(result['error'], 'The Coldcard does not support software setup')
|
||||
@ -44,7 +44,7 @@ def coldcard_test_suite(simulator, rpc, userpass, interface):
|
||||
self.assertEqual(result['code'], -9)
|
||||
|
||||
def test_restore(self):
|
||||
result = self.do_command(self.dev_args + ['restore'])
|
||||
result = self.do_command(self.dev_args + ['-i', 'restore'])
|
||||
self.assertIn('error', result)
|
||||
self.assertIn('code', result)
|
||||
self.assertEqual(result['error'], 'The Coldcard does not support restoring via software')
|
||||
|
||||
@ -44,7 +44,7 @@ def digitalbitbox_test_suite(rpc, userpass, simulator, interface):
|
||||
# DigitalBitbox specific management command tests
|
||||
class TestDBBManCommands(DeviceTestCase):
|
||||
def test_restore(self):
|
||||
result = self.do_command(self.dev_args + ['restore'])
|
||||
result = self.do_command(self.dev_args + ['-i', 'restore'])
|
||||
self.assertIn('error', result)
|
||||
self.assertIn('code', result)
|
||||
self.assertEqual(result['error'], 'The Digital Bitbox does not support restoring via software')
|
||||
@ -72,7 +72,7 @@ def digitalbitbox_test_suite(rpc, userpass, simulator, interface):
|
||||
|
||||
def test_setup_wipe(self):
|
||||
# Device is init, setup should fail
|
||||
result = self.do_command(self.dev_args + ['setup', '--label', 'setup_test', '--backup_passphrase', 'testpass'])
|
||||
result = self.do_command(self.dev_args + ['-i', 'setup', '--label', 'setup_test', '--backup_passphrase', 'testpass'])
|
||||
self.assertEquals(result['code'], -10)
|
||||
self.assertEquals(result['error'], 'Device is already initialized. Use wipe first and try again')
|
||||
|
||||
@ -81,15 +81,15 @@ def digitalbitbox_test_suite(rpc, userpass, simulator, interface):
|
||||
self.assertTrue(result['success'])
|
||||
|
||||
# Check arguments
|
||||
result = self.do_command(self.dev_args + ['setup', '--label', 'setup_test'])
|
||||
result = self.do_command(self.dev_args + ['-i', 'setup', '--label', 'setup_test'])
|
||||
self.assertEquals(result['code'], -7)
|
||||
self.assertEquals(result['error'], 'The label and backup passphrase for a new Digital Bitbox wallet must be specified and cannot be empty')
|
||||
result = self.do_command(self.dev_args + ['setup', '--backup_passphrase', 'testpass'])
|
||||
result = self.do_command(self.dev_args + ['-i', 'setup', '--backup_passphrase', 'testpass'])
|
||||
self.assertEquals(result['code'], -7)
|
||||
self.assertEquals(result['error'], 'The label and backup passphrase for a new Digital Bitbox wallet must be specified and cannot be empty')
|
||||
|
||||
# Setup
|
||||
result = self.do_command(self.dev_args + ['setup', '--label', 'setup_test', '--backup_passphrase', 'testpass'])
|
||||
result = self.do_command(self.dev_args + ['-i', 'setup', '--label', 'setup_test', '--backup_passphrase', 'testpass'])
|
||||
self.assertTrue(result['success'])
|
||||
|
||||
# Reset back to original
|
||||
@ -99,7 +99,7 @@ def digitalbitbox_test_suite(rpc, userpass, simulator, interface):
|
||||
send_encrypt(json.dumps({"seed":{"source":"backup","filename":"test_backup.pdf","key":"key"}}), '0000', dev)
|
||||
|
||||
# Make sure device is init, setup should fail
|
||||
result = self.do_command(self.dev_args + ['setup', '--label', 'setup_test', '--backup_passphrase', 'testpass'])
|
||||
result = self.do_command(self.dev_args + ['-i', 'setup', '--label', 'setup_test', '--backup_passphrase', 'testpass'])
|
||||
self.assertEquals(result['code'], -10)
|
||||
self.assertEquals(result['error'], 'Device is already initialized. Use wipe first and try again')
|
||||
|
||||
@ -117,7 +117,7 @@ def digitalbitbox_test_suite(rpc, userpass, simulator, interface):
|
||||
self.assertTrue(result['success'])
|
||||
|
||||
# Setup
|
||||
result = self.do_command(self.dev_args + ['setup', '--label', 'backup_test', '--backup_passphrase', 'testpass'])
|
||||
result = self.do_command(self.dev_args + ['-i', 'setup', '--label', 'backup_test', '--backup_passphrase', 'testpass'])
|
||||
self.assertTrue(result['success'])
|
||||
|
||||
# make the backup
|
||||
|
||||
@ -141,7 +141,7 @@ class TestKeepkeyManCommands(KeepkeyTestCase):
|
||||
|
||||
def test_setup_wipe(self):
|
||||
# Device is init, setup should fail
|
||||
result = self.do_command(self.dev_args + ['setup'])
|
||||
result = self.do_command(self.dev_args + ['-i', 'setup'])
|
||||
self.assertEquals(result['code'], -10)
|
||||
self.assertEquals(result['error'], 'Device is already initialized. Use wipe first and try again')
|
||||
|
||||
@ -157,7 +157,7 @@ class TestKeepkeyManCommands(KeepkeyTestCase):
|
||||
self.assertTrue(result['success'])
|
||||
|
||||
# Make sure device is init, setup should fail
|
||||
result = self.do_command(self.dev_args + ['setup'])
|
||||
result = self.do_command(self.dev_args + ['-i', 'setup'])
|
||||
self.assertEquals(result['code'], -10)
|
||||
self.assertEquals(result['error'], 'Device is already initialized. Use wipe first and try again')
|
||||
|
||||
|
||||
@ -44,7 +44,7 @@ def ledger_test_suite(rpc, userpass, interface):
|
||||
self.assertEqual(result['code'], -9)
|
||||
|
||||
def test_setup(self):
|
||||
result = self.do_command(self.dev_args + ['setup'])
|
||||
result = self.do_command(self.dev_args + ['-i', 'setup'])
|
||||
self.assertIn('error', result)
|
||||
self.assertIn('code', result)
|
||||
self.assertEqual(result['error'], 'The Ledger Nano S does not support software setup')
|
||||
@ -58,7 +58,7 @@ def ledger_test_suite(rpc, userpass, interface):
|
||||
self.assertEqual(result['code'], -9)
|
||||
|
||||
def test_restore(self):
|
||||
result = self.do_command(self.dev_args + ['restore'])
|
||||
result = self.do_command(self.dev_args + ['-i', 'restore'])
|
||||
self.assertIn('error', result)
|
||||
self.assertIn('code', result)
|
||||
self.assertEqual(result['error'], 'The Ledger Nano S does not support restoring via software')
|
||||
|
||||
@ -141,7 +141,7 @@ class TestTrezorManCommands(TrezorTestCase):
|
||||
|
||||
def test_setup_wipe(self):
|
||||
# Device is init, setup should fail
|
||||
result = self.do_command(self.dev_args + ['setup'])
|
||||
result = self.do_command(self.dev_args + ['-i', 'setup'])
|
||||
self.assertEquals(result['code'], -10)
|
||||
self.assertEquals(result['error'], 'Device is already initialized. Use wipe first and try again')
|
||||
|
||||
@ -157,7 +157,7 @@ class TestTrezorManCommands(TrezorTestCase):
|
||||
self.assertTrue(result['success'])
|
||||
|
||||
# Make sure device is init, setup should fail
|
||||
result = self.do_command(self.dev_args + ['setup'])
|
||||
result = self.do_command(self.dev_args + ['-i', 'setup'])
|
||||
self.assertEquals(result['code'], -10)
|
||||
self.assertEquals(result['error'], 'Device is already initialized. Use wipe first and try again')
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user