From 1de4ae63c1f2db763a3c2daad0116b23de5de526 Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Mon, 21 Sep 2026 10:30:46 +0000 Subject: [PATCH] daemon, rpc.backends.requests, test suite: minor cleanups --- mmgen/daemon.py | 2 +- mmgen/main_addrgen.py | 6 +++--- mmgen/proto/btc/daemon.py | 4 ++-- mmgen/proto/eth/daemon.py | 8 ++++---- mmgen/proto/xmr/daemon.py | 18 +++++++++--------- mmgen/rpc/backends/requests.py | 2 +- mmgen/xmrwallet/ops/submit.py | 4 ++++ test/cmdtest_d/xmr_autosign.py | 7 ++++++- test/cmdtest_d/xmrwallet.py | 7 +++---- 9 files changed, 33 insertions(+), 25 deletions(-) diff --git a/mmgen/daemon.py b/mmgen/daemon.py index a44c7fb2..72a4ceb8 100755 --- a/mmgen/daemon.py +++ b/mmgen/daemon.py @@ -413,7 +413,7 @@ class CoinDaemon(Daemon): # user-set values take precedence self.datadir = os.path.abspath(datadir or cfg.daemon_data_dir or self.init_datadir()) - self.non_dfl_datadir = bool(datadir or cfg.daemon_data_dir or self.test_suite or self.network == 'regtest') + self.has_non_dfl_datadir = bool(datadir or cfg.daemon_data_dir or self.test_suite or self.network == 'regtest') # init_datadir() may have already initialized logdir self.logdir = os.path.abspath(getattr(self, 'logdir', self.datadir)) diff --git a/mmgen/main_addrgen.py b/mmgen/main_addrgen.py index e0a50709..18b99509 100755 --- a/mmgen/main_addrgen.py +++ b/mmgen/main_addrgen.py @@ -51,7 +51,7 @@ opts_data = { 'options': """ -- -h, --help Print this help message -- --, --longhelp Print help message for long (global) options - -k -A, --no-addresses Print only secret keys, no addresses + -k -A, --no-addresses Generate only secret keys, no addresses -- -c, --print-checksum Print address list checksum and exit -- -d, --outdir= d Output files to directory 'd' instead of working dir -- -e, --echo-passphrase Echo passphrase or mnemonic to screen upon entry @@ -77,9 +77,9 @@ opts_data = { + (default: {dmat}) -- -U, --subwallet= U Generate {what} for subwallet 'U' (see SUBWALLETS + below) - -k -V, --viewkeys Print viewkeys, omitting secret keys + -k -V, --viewkeys Generate viewkeys, omitting spend keys -- -v, --verbose Produce more verbose output - -k -x, --b16 Print secret keys in hexadecimal too + -k -x, --b16 Generate secret keys in hexadecimal too """, 'notes': """ diff --git a/mmgen/proto/btc/daemon.py b/mmgen/proto/btc/daemon.py index b9ad79a9..be01b03e 100755 --- a/mmgen/proto/btc/daemon.py +++ b/mmgen/proto/btc/daemon.py @@ -62,7 +62,7 @@ class bitcoin_core_daemon(CoinDaemon): self.rpc_password = MMGenRegtest.rpc_password self.shared_args = list_gen( - [f'--datadir={self.datadir}', self.nonstd_datadir or self.non_dfl_datadir], + [f'--datadir={self.datadir}', self.nonstd_datadir or self.has_non_dfl_datadir], [f'--rpcport={self.rpc_port}'], [f'--rpcuser={self.rpc_user}', self.network == 'regtest'], [f'--rpcpassword={self.rpc_password}', self.network == 'regtest'], @@ -74,7 +74,7 @@ class bitcoin_core_daemon(CoinDaemon): ['--keypool=1'], ['--rpcallowip=127.0.0.1'], [f'--rpcbind=127.0.0.1:{self.rpc_port}'], - ['--pid='+self.pidfile, self.use_pidfile], + [f'--pid={self.pidfile}', self.use_pidfile], ['--daemon', gc.platform in ('linux', 'darwin') and not self.opt.no_daemonize], ['--fallbackfee=0.0002', self.coin == 'BTC' and self.network == 'regtest'], ['--deprecatedrpc=create_bdb', self.coin == 'BTC' and self.opt.bdb_wallet], diff --git a/mmgen/proto/eth/daemon.py b/mmgen/proto/eth/daemon.py index ba019e32..ed470e63 100755 --- a/mmgen/proto/eth/daemon.py +++ b/mmgen/proto/eth/daemon.py @@ -77,11 +77,11 @@ class openethereum_daemon(ethereum_daemon): ['--no-secretstore'], [f'--jsonrpc-port={self.rpc_port}'], [f'--port={self.p2p_port}', self.p2p_port], - [f'--base-path={self.datadir}', self.non_dfl_datadir], + [f'--base-path={self.datadir}', self.has_non_dfl_datadir], [f'--chain={self.proto.chain_name}', self.network!='regtest'], ['--config=dev', self.network=='regtest'], # no presets for mainnet or testnet ['--mode=offline', self.test_suite or self.network=='regtest'], - [f'--log-file={self.logfile}', self.non_dfl_datadir], + [f'--log-file={self.logfile}', self.has_non_dfl_datadir], ['daemon', self.use_pidfile], [self.pidfile, self.use_pidfile]) @@ -122,7 +122,7 @@ class geth_daemon(ethereum_daemon): [f'--port={self.p2p_port}', self.p2p_port], # geth binds p2p port even with --maxpeers=0 [f'--discovery.port={self.p2p_port}', self.id == 'reth' and self.p2p_port], ['--maxpeers=0', self.id == 'geth' and not self.opt.online], - [f'--datadir={self.datadir}', self.non_dfl_datadir], + [f'--datadir={self.datadir}', self.has_non_dfl_datadir], ['--holesky', self.network=='testnet' and self.id == 'geth'], ['--chain=holesky', self.network=='testnet' and self.id == 'reth'], ['--dev', self.network=='regtest']) @@ -157,7 +157,7 @@ class erigon_daemon(geth_daemon): [f'--port={self.p2p_port}', self.p2p_port], ['--maxpeers=0', not self.opt.online], [f'--private.api.addr=127.0.0.1:{self.private_port}'], - [f'--datadir={self.datadir}', self.non_dfl_datadir], + [f'--datadir={self.datadir}', self.has_non_dfl_datadir], ['--chain=goerli', self.network=='testnet'], [f'--torrent.port={self.torrent_ports.testnet}', self.network=='testnet'], ['--chain=dev', self.network=='regtest'], diff --git a/mmgen/proto/xmr/daemon.py b/mmgen/proto/xmr/daemon.py index e2acedd1..81960a3f 100755 --- a/mmgen/proto/xmr/daemon.py +++ b/mmgen/proto/xmr/daemon.py @@ -64,7 +64,7 @@ class monero_daemon(CoinDaemon): self.coind_args = list_gen( ['--hide-my-port'], ['--no-igd'], - [f'--data-dir={self.datadir}', self.non_dfl_datadir], + [f'--data-dir={self.datadir}', self.has_non_dfl_datadir], [f'--pidfile={self.pidfile}', self.use_pidfile], ['--detach', not (self.opt.no_daemonize or gc.platform=='win32')], ['--offline', not self.opt.online]) @@ -90,13 +90,6 @@ class MoneroWalletDaemon(RPCDaemon): _reset_ok = ('debug', 'wait', 'pids', 'force_kill') test_suite_datadir = os.path.join('test', 'daemons', 'xmrtest', 'wallet_rpc') - def start(self, *args, **kwargs): - try: # NB: required due to bug in v18.3.1: PID file not deleted on shutdown - os.unlink(self.pidfile) - except FileNotFoundError: - pass - super().start(*args, **kwargs) - def __init__( self, cfg, @@ -170,7 +163,7 @@ class MoneroWalletDaemon(RPCDaemon): [f'--daemon-address={self.monerod_addr}', self.monerod_addr], [f'--daemon-port={self.monerod_port}', not self.monerod_addr], [f'--proxy={self.proxy}', self.proxy], - [f'--pidfile={self.pidfile}', gc.platform == 'linux'], + [f'--pidfile={self.pidfile}', self.use_pidfile], ['--detach', not (self.opt.no_daemonize or gc.platform=='win32')], ['--stagenet', self.network == 'testnet'], ['--allow-mismatched-daemon-version', self.test_suite]) @@ -180,3 +173,10 @@ class MoneroWalletDaemon(RPCDaemon): cfg = self.cfg, daemon = self, test_connection = False) + + def start(self, *args, **kwargs): + try: # NB: required due to bug in v18.3.1: PID file not deleted on shutdown + os.unlink(self.pidfile) + except FileNotFoundError: + pass + super().start(*args, **kwargs) diff --git a/mmgen/rpc/backends/requests.py b/mmgen/rpc/backends/requests.py index cad02198..ccd94192 100755 --- a/mmgen/rpc/backends/requests.py +++ b/mmgen/rpc/backends/requests.py @@ -26,7 +26,7 @@ class requests(base): def __init__(self, caller): super().__init__(caller) import requests, urllib3 - urllib3.disable_warnings() + urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) self.session = requests.Session() self.session.trust_env = False # ignore *_PROXY environment vars self.session.headers = caller.http_hdrs diff --git a/mmgen/xmrwallet/ops/submit.py b/mmgen/xmrwallet/ops/submit.py index f289d730..d20a65ef 100755 --- a/mmgen/xmrwallet/ops/submit.py +++ b/mmgen/xmrwallet/ops/submit.py @@ -32,6 +32,10 @@ class OpSubmit(OpWallet): # with the ‘stop_wallet’ command. Authentication to send a signed transaction is overkill # in any case: if an attacker has access to the online machine, and hence the transaction, # they can broadcast it to the network by some other means. + # + # RPC authentication for the wallet daemon in particular seems unnecessary, because without + # the wallet password a potential attacker cannot open the wallet anyway to do anything + # nasty. In future, an option should be added to disable it globally. disable_authentication = True # FIXME def post_mount_action(self): diff --git a/test/cmdtest_d/xmr_autosign.py b/test/cmdtest_d/xmr_autosign.py index 20feb737..f0963c45 100755 --- a/test/cmdtest_d/xmr_autosign.py +++ b/test/cmdtest_d/xmr_autosign.py @@ -875,7 +875,12 @@ class CmdTestXMRCompat(CmdTestXMRAutosign): if wait_signed: self._wait_signed(signable_desc) self.insert_device_online() - t = self.spawn(f'mmgen-{op}', (opts or self.alice_opts) + self.autosign_opts + add_opts + args) + t = self.spawn( + f'mmgen-{op}', + (opts or self.alice_opts) + + self.autosign_opts + + add_opts + + args) if '--abort' in opts: t.expect('(y/N): ', 'y') elif op == 'txcreate': diff --git a/test/cmdtest_d/xmrwallet.py b/test/cmdtest_d/xmrwallet.py index 441dc956..543c4951 100755 --- a/test/cmdtest_d/xmrwallet.py +++ b/test/cmdtest_d/xmrwallet.py @@ -274,10 +274,9 @@ class CmdTestXMRWallet(CmdTestBase): run(['mkdir', '-p', data.udir]) run(f'rm -f {data.kafile}', shell=True) t = self.spawn( - 'mmgen-keygen', [ - '-q', '--accept-defaults', '--coin=xmr', - f'--outdir={data.udir}', data.mmwords, data.kal_range - ], + 'mmgen-keygen', + ['--quiet', '--accept-defaults', '--coin=xmr', f'--outdir={data.udir}'] + + [data.mmwords, data.kal_range], extra_desc = f'({capfirst(user)})') t.read() t.ok()