From 2d89d6c920b9b0a032a32c031b761e3547d86411 Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Sun, 25 Feb 2024 08:36:37 +0000 Subject: [PATCH] various fixes and cleanups --- mmgen/autosign.py | 44 +++++++++++++--------------------- mmgen/main_autosign.py | 22 ++++++++--------- mmgen/main_txbump.py | 2 +- mmgen/mn_entry.py | 3 --- mmgen/wallet/base.py | 11 +++++---- mmgen/wallet/mnemonic.py | 6 +++-- scripts/exec_wrapper.py | 3 ++- test/cmdtest_py_d/ct_ethdev.py | 30 +++++++++-------------- test/cmdtest_py_d/ct_input.py | 4 ++-- 9 files changed, 54 insertions(+), 71 deletions(-) diff --git a/mmgen/autosign.py b/mmgen/autosign.py index 73f1d24f..5614d470 100755 --- a/mmgen/autosign.py +++ b/mmgen/autosign.py @@ -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') diff --git a/mmgen/main_autosign.py b/mmgen/main_autosign.py index f0a15f46..8764b5cc 100755 --- a/mmgen/main_autosign.py +++ b/mmgen/main_autosign.py @@ -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': diff --git a/mmgen/main_txbump.py b/mmgen/main_txbump.py index a82e868c..41ca9276 100755 --- a/mmgen/main_txbump.py +++ b/mmgen/main_txbump.py @@ -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 diff --git a/mmgen/mn_entry.py b/mmgen/mn_entry.py index d052717e..0422984f 100755 --- a/mmgen/mn_entry.py +++ b/mmgen/mn_entry.py @@ -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) diff --git a/mmgen/wallet/base.py b/mmgen/wallet/base.py index 1cfef097..388d20e7 100755 --- a/mmgen/wallet/base.py +++ b/mmgen/wallet/base.py @@ -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): diff --git a/mmgen/wallet/mnemonic.py b/mmgen/wallet/mnemonic.py index 12dad2f6..76533c06 100755 --- a/mmgen/wallet/mnemonic.py +++ b/mmgen/wallet/mnemonic.py @@ -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): diff --git a/scripts/exec_wrapper.py b/scripts/exec_wrapper.py index 9d3f7a52..39fa3a10 100755 --- a/scripts/exec_wrapper.py +++ b/scripts/exec_wrapper.py @@ -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) diff --git a/test/cmdtest_py_d/ct_ethdev.py b/test/cmdtest_py_d/ct_ethdev.py index bbaf0e45..781157c3 100755 --- a/test/cmdtest_py_d/ct_ethdev.py +++ b/test/cmdtest_py_d/ct_ethdev.py @@ -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') diff --git a/test/cmdtest_py_d/ct_input.py b/test/cmdtest_py_d/ct_input.py index 612f093c..e647f6f3 100755 --- a/test/cmdtest_py_d/ct_input.py +++ b/test/cmdtest_py_d/ct_input.py @@ -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