From 4965cffd2de75feef1ec1c3ff7207fa2efd748f5 Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Sat, 24 Feb 2024 14:17:31 +0000 Subject: [PATCH] autosign: remove `xmr_desc` attribute, add `*xmr_signables` --- mmgen/autosign.py | 49 ++++++++++++++++++++++---------- test/cmdtest_py_d/ct_autosign.py | 28 +++++++++++++----- 2 files changed, 55 insertions(+), 22 deletions(-) diff --git a/mmgen/autosign.py b/mmgen/autosign.py index 36b01a14..7fa115d9 100755 --- a/mmgen/autosign.py +++ b/mmgen/autosign.py @@ -25,7 +25,13 @@ from .ui import keypress_confirm class Signable: - signables = ('transaction','message','xmr_transaction','xmr_wallet_outputs_file') + non_xmr_signables = ( + 'transaction', + 'message') + + xmr_signables = ( # order is important! + 'xmr_wallet_outputs_file', # import XMR wallet outputs BEFORE signing transactions + 'xmr_transaction') class base: @@ -36,7 +42,6 @@ class Signable: self.parent = parent self.cfg = parent.cfg self.dir = getattr(parent,self.dir_name) - self.long_desc = getattr(self, 'xmr_desc', self.desc) if 'XMR' in self.parent.coins else self.desc self.name = type(self).__name__ @property @@ -99,7 +104,6 @@ class Signable: class transaction(base): desc = 'transaction' - xmr_desc = 'non-Monero transaction' rawext = 'rawtx' sigext = 'sigtx' dir_name = 'tx_dir' @@ -273,6 +277,9 @@ class Autosign: have_msg_dir = False + have_xmr = False + xmr_only = False + def init_cfg(self): # see test/overlay/fakemods/mmgen/autosign.py self.mountpoint = Path(self.cfg.mountpoint or self.dfl_mountpoint) self.wallet_dir = Path(self.cfg.wallet_dir or self.dfl_wallet_dir) @@ -311,11 +318,22 @@ class Autosign: self.coins = ['BTC'] if 'XMR' in self.coins: + self.have_xmr = True + if len(self.coins) == 1: + self.xmr_only = True self.xmr_dir = self.mountpoint / 'xmr' self.xmr_tx_dir = self.mountpoint / 'xmr' / 'tx' self.xmr_outputs_dir = self.mountpoint / 'xmr' / 'outputs' self.xmr_cur_wallet_idx = None + self.to_sign = () + + if not self.xmr_only: + self.to_sign += Signable.non_xmr_signables + + if self.have_xmr: + self.to_sign += Signable.xmr_signables + async def check_daemons_running(self): from .protocol import init_proto for coin in self.coins: @@ -443,9 +461,7 @@ class Autosign: target.print_bad_list(bad) return not bad else: - msg(f'No unsigned {target.long_desc}s') - await asyncio.sleep(0.5) - return True + return f'No unsigned {target.desc}s' async def do_sign(self): if not self.cfg.stealth_led: @@ -455,15 +471,13 @@ class Autosign: if key_ok: if self.cfg.stealth_led: self.led.set('busy') - ret1 = await self.sign_all('transaction') - ret2 = await self.sign_all('message') if self.have_msg_dir else True - # import XMR wallet outputs BEFORE signing transactions: - ret3 = await self.sign_all('xmr_wallet_outputs_file') if 'XMR' in self.coins else True - ret4 = await self.sign_all('xmr_transaction') if 'XMR' in self.coins else True - ret = ret1 and ret2 and ret3 and ret4 + ret = [await self.sign_all(signable) for signable in self.to_sign] + for val in ret: + if isinstance(val,str): + msg(val) self.do_umount() self.led.set(('standby','off','error')[(not ret)*2 or bool(self.cfg.stealth_led)]) - return ret + return all(ret) else: msg('Password is incorrect!') self.do_umount() @@ -616,8 +630,13 @@ class Autosign: count = 0 - for s_name in Signable.signables: - clean_dir(s_name) + 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) bmsg(f'{count} file{suf(count)} shredded') diff --git a/test/cmdtest_py_d/ct_autosign.py b/test/cmdtest_py_d/ct_autosign.py index b1ffb9b3..e65a7622 100755 --- a/test/cmdtest_py_d/ct_autosign.py +++ b/test/cmdtest_py_d/ct_autosign.py @@ -106,7 +106,8 @@ class CmdTestAutosignBase(CmdTestBase): run(['/sbin/mkfs.ext2', '-E', f'root_owner={os.getuid()}:{os.getgid()}', img_file], stdout=redir, stderr=redir, check=True) self.do_mount(no_dir_chk=True) - (self.asi.mountpoint / 'tx').mkdir() + self.asi.tx_dir.mkdir() + self.asi.msg_dir.mkdir() self.do_umount() def start_daemons(self): @@ -289,7 +290,7 @@ class CmdTestAutosign(CmdTestAutosignBase): ('sign_full_summary_msg', 'signing transactions and messages (--full-summary)'), ('remove_invalid_msgfile', 'removing invalid message file'), ('remove_bad_txfiles2', 'removing bad transaction files'), - ('sign_no_unsigned_msg', 'signing transactions and messages (nothing to sign)'), + ('sign_no_unsigned', 'signing transactions and messages (nothing to sign)'), ('stop_daemons', 'stopping daemons'), ) @@ -526,11 +527,24 @@ class CmdTestAutosign(CmdTestAutosignBase): def sign_full_summary_msg(self): return self.do_sign(['--full-summary','wait'],have_msg=True) - def sign_no_unsigned_msg(self): - self.tx_count = 0 - self.good_msg_count = 0 - self.bad_msg_count = 0 - return self.do_sign(['--quiet','wait'],have_msg=True) + def sign_no_unsigned(self): + return self._sign_no_unsigned( + coins = 'BTC', + present = ['non_xmr_signables'], + absent = ['xmr_signables']) + + def _sign_no_unsigned(self,coins,present=[],absent=[]): + t = self.spawn('mmgen-autosign', ['--quiet', '--no-insert-check', f'--coins={coins}']) + res = t.read() + for signable_list in present: + for signable_clsname in getattr(Signable,signable_list): + desc = getattr(Signable, signable_clsname).desc + assert f'No unsigned {desc}' in res, f'{desc!r} missing in output' + for signable_list in absent: + for signable_clsname in getattr(Signable,signable_list): + desc = getattr(Signable, signable_clsname).desc + assert desc not in res, f'{desc!r} should be absent in output' + return t class CmdTestAutosignBTC(CmdTestAutosign): 'autosigning BTC transactions'