Browse Source

various fixes and cleanups

The MMGen Project 1 year ago
parent
commit
2d89d6c920

+ 17 - 27
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')
 

+ 10 - 12
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':

+ 1 - 1
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

+ 0 - 3
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)
 

+ 7 - 4
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):

+ 4 - 2
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):
 

+ 2 - 1
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)
 

+ 11 - 19
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')
 

+ 2 - 2
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