various fixes and cleanups

This commit is contained in:
The MMGen Project 2024-02-25 08:36:37 +00:00
commit 2d89d6c920
Signed by: mmgen
GPG key ID: 3F8B1861E32B7DA2
9 changed files with 54 additions and 71 deletions

View file

@ -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')

View file

@ -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 Dont 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':

View file

@ -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

View file

@ -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)

View file

@ -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):

View file

@ -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):

View file

@ -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)

View file

@ -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')

View file

@ -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