various fixes and cleanups
This commit is contained in:
parent
f1512484c9
commit
2d89d6c920
9 changed files with 54 additions and 71 deletions
|
|
@ -295,7 +295,7 @@ class Autosign:
|
|||
self.mount_cmd = 'mount'
|
||||
self.umount_cmd = 'umount'
|
||||
|
||||
def __init__(self,cfg):
|
||||
def __init__(self,cfg,cmd=None):
|
||||
|
||||
if cfg.mnemonic_fmt:
|
||||
if cfg.mnemonic_fmt not in self.mn_fmts:
|
||||
|
|
@ -308,6 +308,9 @@ class Autosign:
|
|||
|
||||
self.keyfile = self.mountpoint / 'autosign.key'
|
||||
|
||||
if any(k in cfg._uopts for k in ('help','longhelp')):
|
||||
return
|
||||
|
||||
if 'coin' in cfg._uopts:
|
||||
die(1,'--coin option not supported with this command. Use --coins instead')
|
||||
|
||||
|
|
@ -316,7 +319,7 @@ class Autosign:
|
|||
if cfg.xmrwallets and not 'XMR' in self.coins:
|
||||
self.coins.append('XMR')
|
||||
|
||||
if not self.coins:
|
||||
if not self.coins and cmd not in ('gen_key',):
|
||||
ymsg('Warning: no coins specified, defaulting to BTC')
|
||||
self.coins = ['BTC']
|
||||
|
||||
|
|
@ -327,15 +330,15 @@ class Autosign:
|
|||
self.xmr_cur_wallet_idx = None
|
||||
|
||||
self.dirs = {}
|
||||
self.to_sign = ()
|
||||
self.signables = ()
|
||||
|
||||
if not self.xmr_only:
|
||||
self.dirs |= self.non_xmr_dirs
|
||||
self.to_sign += Signable.non_xmr_signables
|
||||
self.signables += Signable.non_xmr_signables
|
||||
|
||||
if self.have_xmr:
|
||||
self.dirs |= self.xmr_dirs
|
||||
self.to_sign += Signable.xmr_signables
|
||||
self.signables += Signable.xmr_signables
|
||||
|
||||
for name,path in self.dirs.items():
|
||||
setattr(self, name, self.mountpoint / path)
|
||||
|
|
@ -470,7 +473,7 @@ class Autosign:
|
|||
if key_ok:
|
||||
if self.cfg.stealth_led:
|
||||
self.led.set('busy')
|
||||
ret = [await self.sign_all(signable) for signable in self.to_sign]
|
||||
ret = [await self.sign_all(signable) for signable in self.signables]
|
||||
for val in ret:
|
||||
if isinstance(val,str):
|
||||
msg(val)
|
||||
|
|
@ -486,15 +489,13 @@ class Autosign:
|
|||
self.led.set('error')
|
||||
return False
|
||||
|
||||
def wipe_existing_key(self):
|
||||
try:
|
||||
self.keyfile.stat()
|
||||
except:
|
||||
pass
|
||||
else:
|
||||
def wipe_encryption_key(self):
|
||||
if self.keyfile.exists():
|
||||
from .fileutil import shred_file
|
||||
msg(f"\nShredding existing key '{self.keyfile}'")
|
||||
ymsg(f'Shredding wallet encryption key ‘{self.keyfile}’')
|
||||
shred_file(str(self.keyfile), verbose=self.cfg.verbose)
|
||||
else:
|
||||
gmsg('No wallet encryption key on removable device')
|
||||
|
||||
def create_key(self):
|
||||
desc = f"key file '{self.keyfile}'"
|
||||
|
|
@ -510,7 +511,7 @@ class Autosign:
|
|||
if not self.get_insert_status():
|
||||
die(1,'Removable device not present!')
|
||||
self.do_mount()
|
||||
self.wipe_existing_key()
|
||||
self.wipe_encryption_key()
|
||||
self.create_key()
|
||||
if not no_unmount:
|
||||
self.do_umount()
|
||||
|
|
@ -583,12 +584,6 @@ class Autosign:
|
|||
async_run(m.main())
|
||||
async_run(m.stop_wallet_daemon())
|
||||
|
||||
import shutil
|
||||
try:
|
||||
shutil.rmtree(self.xmr_outputs_dir)
|
||||
except:
|
||||
pass
|
||||
|
||||
self.clean_old_files()
|
||||
|
||||
create_signing_wallets()
|
||||
|
|
@ -627,13 +622,8 @@ class Autosign:
|
|||
|
||||
count = 0
|
||||
|
||||
if not self.xmr_only:
|
||||
for s_name in Signable.non_xmr_signables:
|
||||
clean_dir(s_name)
|
||||
|
||||
if self.have_xmr:
|
||||
for s_name in Signable.xmr_signables:
|
||||
clean_dir(s_name)
|
||||
for s_name in self.signables:
|
||||
clean_dir(s_name)
|
||||
|
||||
bmsg(f'{count} file{suf(count)} shredded')
|
||||
|
||||
|
|
|
|||
|
|
@ -33,7 +33,6 @@ opts_data = {
|
|||
-h, --help Print this help message
|
||||
--, --longhelp Print help message for long options (common options)
|
||||
-c, --coins=c Coins to sign for (comma-separated list)
|
||||
-C, --clean Remove unneeded files on the removable device
|
||||
-I, --no-insert-check Don’t check for device insertion
|
||||
-l, --led Use status LED to signal standby, busy and error
|
||||
-m, --mountpoint=M Specify an alternate mountpoint 'M'
|
||||
|
|
@ -56,10 +55,13 @@ opts_data = {
|
|||
|
||||
OPERATIONS
|
||||
|
||||
gen_key - generate the wallet encryption key and copy it to the mountpoint
|
||||
‘{asi.mountpoint}’ (as currently configured)
|
||||
setup - generate both wallet encryption key and temporary signing wallet
|
||||
wait - start in loop mode: wait-mount-sign-unmount-wait
|
||||
clean - clean the removable device of unneeded files, removing only non-
|
||||
essential data
|
||||
gen_key - generate the wallet encryption key and copy it to the removable
|
||||
device mounted at mountpoint ‘{asi.mountpoint}’ (as currently
|
||||
configured)
|
||||
setup - generate both wallet encryption key and temporary signing wallet
|
||||
wait - start in loop mode: wait-mount-sign-unmount-wait
|
||||
|
||||
|
||||
USAGE NOTES
|
||||
|
|
@ -170,17 +172,13 @@ cfg = Config(
|
|||
},
|
||||
do_post_init = True )
|
||||
|
||||
cmd_args = cfg._args
|
||||
cmd = cfg._args[0] if len(cfg._args) == 1 else None if not cfg._args else cfg._opts.usage()
|
||||
|
||||
asi = Autosign(cfg)
|
||||
asi = Autosign(cfg,cmd)
|
||||
|
||||
cfg._post_init()
|
||||
|
||||
if len(cmd_args) not in (0,1):
|
||||
cfg._opts.usage()
|
||||
|
||||
if cmd_args:
|
||||
cmd = cmd_args[0]
|
||||
if cmd:
|
||||
if cmd == 'gen_key':
|
||||
asi.gen_key()
|
||||
elif cmd == 'setup':
|
||||
|
|
|
|||
|
|
@ -108,7 +108,7 @@ tx_file = cfg._args.pop(0)
|
|||
from .fileutil import check_infile
|
||||
check_infile(tx_file)
|
||||
|
||||
from .tx import CompletedTX,BumpTX,UnsignedTX,OnlineSignedTX
|
||||
from .tx import CompletedTX, BumpTX, UnsignedTX, OnlineSignedTX
|
||||
from .tx.sign import txsign,get_seed_files,get_keyaddrlist,get_keylist
|
||||
|
||||
seed_files = get_seed_files(cfg,cfg._args) if (cfg._args or cfg.send) else None
|
||||
|
|
|
|||
|
|
@ -365,9 +365,6 @@ class MnemonicEntry:
|
|||
|
||||
if validate:
|
||||
self.bconv.tohex(words)
|
||||
self.cfg._util.qmsg(
|
||||
'Mnemonic is valid' if self.has_chksum else
|
||||
'Mnemonic is well-formed (mnemonic format has no checksum to validate)' )
|
||||
|
||||
return ' '.join(words)
|
||||
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@ wallet.base: wallet base class
|
|||
import os
|
||||
|
||||
from ..util import msg,die
|
||||
from ..color import yellow,orange
|
||||
from ..objmethods import MMGenObject
|
||||
from . import wallet_data,get_wallet_cls
|
||||
|
||||
|
|
@ -64,10 +65,12 @@ class wallet(MMGenObject,metaclass=WalletMeta):
|
|||
self._deformat_retry()
|
||||
self._decrypt_retry()
|
||||
|
||||
self.cfg._util.qmsg('Valid {} for Seed ID {}{}'.format(
|
||||
self.desc,
|
||||
self.seed.sid.hl(),
|
||||
(f', seed length {self.seed.bitlen}' if self.seed.bitlen != 256 else '')
|
||||
msg('Valid {a} for Seed ID {b}{c}{d}'.format(
|
||||
a = self.desc,
|
||||
b = self.seed.sid.hl(),
|
||||
c = f' (seed length {self.seed.bitlen})' if self.seed.bitlen != 256 else '',
|
||||
d = '' if not hasattr(self,'mnemonic') or self.mnemonic.has_chksum else
|
||||
orange(' [mnemonic format has no checksum]')
|
||||
))
|
||||
|
||||
def _get_data(self):
|
||||
|
|
|
|||
|
|
@ -34,10 +34,12 @@ class wallet(wallet):
|
|||
from ..ui import get_data_from_user
|
||||
return get_data_from_user( self.cfg, desc )
|
||||
|
||||
mn_len = self._choose_seedlen( self.mn_lens )
|
||||
mn_len = self._choose_seedlen(self.mn_lens)
|
||||
|
||||
from ..mn_entry import mn_entry
|
||||
return mn_entry( self.cfg, self.wl_id ).get_mnemonic_from_user(mn_len)
|
||||
self.mnemonic = mn_entry(self.cfg, self.wl_id)
|
||||
|
||||
return self.mnemonic.get_mnemonic_from_user(mn_len)
|
||||
|
||||
def _format(self):
|
||||
|
||||
|
|
|
|||
|
|
@ -27,7 +27,8 @@ def exec_wrapper_init():
|
|||
|
||||
if exec_wrapper_os.path.dirname(exec_wrapper_sys.argv[1]) == 'test':
|
||||
# support running of test scripts under wrapper
|
||||
exec_wrapper_sys.path[0] = exec_wrapper_os.path.join('test', 'overlay', 'tree')
|
||||
exec_wrapper_sys.path[0] = exec_wrapper_os.getcwd() # assume we’re in repo root
|
||||
exec_wrapper_sys.path.insert(0,exec_wrapper_os.path.join('test', 'overlay', 'tree'))
|
||||
else:
|
||||
exec_wrapper_sys.path.pop(0)
|
||||
|
||||
|
|
|
|||
|
|
@ -400,6 +400,9 @@ class CmdTestEthdev(CmdTestBase,CmdTestShared):
|
|||
if trunner is None:
|
||||
return
|
||||
|
||||
self.eth_args = [f'--outdir={self.tmpdir}', '--quiet']
|
||||
self.eth_args_noquiet = [f'--outdir={self.tmpdir}']
|
||||
|
||||
from mmgen.protocol import init_proto
|
||||
self.proto = init_proto( cfg, cfg.coin, network='regtest', need_amt=True )
|
||||
|
||||
|
|
@ -424,19 +427,6 @@ class CmdTestEthdev(CmdTestBase,CmdTestShared):
|
|||
self.message = 'attack at dawn'
|
||||
self.spawn_env['MMGEN_BOGUS_SEND'] = ''
|
||||
|
||||
@property
|
||||
def eth_args(self):
|
||||
return [
|
||||
f'--outdir={self.tmpdir}',
|
||||
f'--coin={self.proto.coin}',
|
||||
f'--rpc-port={self.daemon.rpc_port}',
|
||||
'--quiet'
|
||||
]
|
||||
|
||||
@property
|
||||
def eth_args_noquiet(self):
|
||||
return self.eth_args[:-1]
|
||||
|
||||
@property
|
||||
async def rpc(self):
|
||||
from mmgen.rpc import rpc_init
|
||||
|
|
@ -1050,15 +1040,15 @@ class CmdTestEthdev(CmdTestBase,CmdTestShared):
|
|||
async def contract_deploy(self): # test create,sign,send
|
||||
return await self.token_deploy(num=2,key='SafeMath',gas=500_000,mmgen_cmd='txcreate')
|
||||
|
||||
async def token_transfer_ops(self,op,amt=1000):
|
||||
async def token_transfer_ops(self,op,amt=1000,num_tokens=2):
|
||||
self.spawn('',msg_only=True)
|
||||
sid = dfl_sid
|
||||
from mmgen.tool.wallet import tool_cmd
|
||||
usr_mmaddrs = [f'{sid}:E:{i}' for i in (11,21)]
|
||||
usr_mmaddrs = [f'{sid}:E:{i}' for i in (11,21)][:num_tokens]
|
||||
|
||||
from mmgen.proto.eth.contract import ResolvedToken
|
||||
async def do_transfer(rpc):
|
||||
for i in range(2):
|
||||
for i in range(num_tokens):
|
||||
tk = await ResolvedToken(
|
||||
cfg,
|
||||
self.proto,
|
||||
|
|
@ -1080,7 +1070,7 @@ class CmdTestEthdev(CmdTestBase,CmdTestShared):
|
|||
die(2,'Transfer of token funds failed. Aborting')
|
||||
|
||||
async def show_bals(rpc):
|
||||
for i in range(2):
|
||||
for i in range(num_tokens):
|
||||
tk = await ResolvedToken(
|
||||
cfg,
|
||||
self.proto,
|
||||
|
|
@ -1111,8 +1101,10 @@ class CmdTestEthdev(CmdTestBase,CmdTestShared):
|
|||
def token_user_bals(self):
|
||||
return self.token_transfer_ops(op='show_bals')
|
||||
|
||||
def token_addrgen(self):
|
||||
self.addrgen(addrs='11-13')
|
||||
def token_addrgen(self,num_tokens=2):
|
||||
t = self.addrgen(addrs='11-13')
|
||||
if num_tokens == 1:
|
||||
return t
|
||||
ok_msg()
|
||||
return self.addrgen(addrs='21-23')
|
||||
|
||||
|
|
|
|||
|
|
@ -415,9 +415,9 @@ class CmdTestInput(CmdTestBase):
|
|||
t.expect(wcls.user_entropy_prompt,'n')
|
||||
if not usr_rand:
|
||||
sid_chk = 'FE3C6545'
|
||||
sid = t.expect_getend(f'Valid {wcls.desc} for Seed ID ')
|
||||
sid = t.expect_getend(f'Valid {wcls.desc} for Seed ID')
|
||||
sid = strip_ansi_escapes(sid.split(',')[0])
|
||||
assert sid == sid_chk, f'Seed ID mismatch! {sid} != {sid_chk}'
|
||||
assert sid_chk in sid, f'Seed ID mismatch! {sid_chk} not found in {sid}'
|
||||
t.expect('to confirm: ','YES\n')
|
||||
return t
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue