From bd97eca7a685eac1bb96aa7daa33d65f281cd693 Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Fri, 14 May 2021 11:26:32 +0000 Subject: [PATCH] fixes & cleanups throughout --- mmgen/addr.py | 27 +++++++++++++++------------ mmgen/daemon.py | 26 +++++++++++++++++++------- mmgen/main_addrgen.py | 2 +- mmgen/main_tool.py | 2 +- mmgen/obj.py | 5 +++-- mmgen/protocol.py | 3 ++- mmgen/rpc.py | 18 +++++++++--------- mmgen/tool.py | 2 +- mmgen/xmrwallet.py | 12 ++++++++---- test/gentest.py | 2 +- test/include/common.py | 23 +++++++++++++++++------ test/test.py | 12 +++++++++++- test/tooltest2.py | 1 - 13 files changed, 88 insertions(+), 47 deletions(-) diff --git a/mmgen/addr.py b/mmgen/addr.py index 87a544d3..2ceca112 100755 --- a/mmgen/addr.py +++ b/mmgen/addr.py @@ -158,7 +158,7 @@ class AddrGeneratorMonero(AddrGenerator): from .protocol import hash256 self.hash256 = hash256 - if opt.use_old_ed25519: + if getattr(opt,'use_old_ed25519',False): from .ed25519 import edwards,encodepoint,B,scalarmult else: from .ed25519ll_djbec import scalarmult @@ -398,16 +398,19 @@ Removed {{}} duplicate WIF key{{}} from keylist (also in {pnm} key-address file line_ctr = 0 def __init__(self,proto, - addrfile = '', - al_id = '', - adata = [], - seed = '', - addr_idxs = '', - src = '', - addrlist = '', - keylist = '', - mmtype = None ): + addrfile = '', + al_id = '', + adata = [], + seed = '', + addr_idxs = '', + src = '', + addrlist = '', + keylist = '', + mmtype = None, + skip_key_address_validity_check = False, + ): + self.skip_ka_check = skip_key_address_validity_check do_chksum = True self.update_msgs() mmtype = mmtype or proto.dfl_mmtype @@ -702,8 +705,8 @@ Removed {{}} duplicate WIF key{{}} from keylist (also in {pnm} key-address file ret.append(a) - if self.has_keys: - if (hasattr(opt,'yes') and opt.yes) or keypress_confirm('Check key-to-address validity?'): + if self.has_keys and not self.skip_ka_check: + if getattr(opt,'yes',False) or keypress_confirm('Check key-to-address validity?'): kg = KeyGenerator(self.proto,self.al_id.mmtype) ag = AddrGenerator(self.proto,self.al_id.mmtype) llen = len(ret) diff --git a/mmgen/daemon.py b/mmgen/daemon.py index 1cee732e..cf4e71cc 100755 --- a/mmgen/daemon.py +++ b/mmgen/daemon.py @@ -235,7 +235,9 @@ class MoneroWalletDaemon(Daemon): passwd = None, daemon_addr = None, proxy = None, - port_shift = None ): + port_shift = None, + datadir = None, + testnet = False ): super().__init__() self.platform = g.platform @@ -246,14 +248,13 @@ class MoneroWalletDaemon(Daemon): bn = 'monero-wallet-rpc' id_str = f'{bn}-{self.rpc_port}' - self.datadir = os.path.join('test',bn) if test_suite else bn + self.datadir = os.path.join(datadir or ('','test')[test_suite], bn) self.pidfile = os.path.join(self.datadir,id_str+'.pid') self.logfile = os.path.join(self.datadir,id_str+'.log') self.proxy = proxy self.daemon_addr = daemon_addr - if not daemon_addr: - self.daemon_port = CoinDaemon('xmr',test_suite=test_suite).rpc_port + self.daemon_port = None if daemon_addr else CoinDaemon('xmr',test_suite=test_suite).rpc_port if self.platform == 'win': self.use_pidfile = False @@ -271,8 +272,7 @@ class MoneroWalletDaemon(Daemon): "option (insecure, not recommended), or by setting 'monero_wallet_rpc_password'\n" + "in the MMGen config file." ) - self.start_cmd = list_gen( - ['monero-wallet-rpc'], + self.daemon_args = list_gen( ['--untrusted-daemon'], [f'--rpc-bind-port={self.rpc_port}'], ['--wallet-dir='+self.wallet_dir], @@ -283,8 +283,15 @@ class MoneroWalletDaemon(Daemon): [f'--proxy={self.proxy}', self.proxy], [f'--pidfile={self.pidfile}', self.platform == 'linux'], ['--detach', not 'no_daemonize' in self.opts], + ['--testnet', testnet], ) + self.usr_daemon_args = [] + + @property + def start_cmd(self): + return (['monero-wallet-rpc'] + self.daemon_args + self.usr_daemon_args ) + @property def state(self): return 'ready' if self.test_socket('localhost',self.rpc_port) else 'stopped' @@ -602,12 +609,17 @@ class MoneroDaemon(CoinDaemon): datadir_is_subdir = True def subclass_init(self): + + self.p2p_port = self.rpc_port - 1 + self.zmq_port = self.rpc_port + 1 + if self.platform == 'win': self.use_pidfile = False self.shared_args = list_gen( - [f'--zmq-rpc-bind-port={self.rpc_port+1}'], + [f'--p2p-bind-port={self.p2p_port}'], [f'--rpc-bind-port={self.rpc_port}'], + [f'--zmq-rpc-bind-port={self.zmq_port}'], ['--testnet', self.network == 'testnet'], ) diff --git a/mmgen/main_addrgen.py b/mmgen/main_addrgen.py index 09d47966..17b03810 100755 --- a/mmgen/main_addrgen.py +++ b/mmgen/main_addrgen.py @@ -139,7 +139,7 @@ addr_type = MMGenAddrType( if len(cmd_args) < 1: opts.usage() -if opt.use_old_ed25519: +if getattr(opt,'use_old_ed25519',False): msg('Using old (slow) ed25519 module by user request') idxs = AddrIdxList(fmt_str=cmd_args.pop()) diff --git a/mmgen/main_tool.py b/mmgen/main_tool.py index da2de2ac..a6b6927d 100755 --- a/mmgen/main_tool.py +++ b/mmgen/main_tool.py @@ -90,7 +90,7 @@ Type '{pn} help ' for help on a particular command } } -cmd_args = opts.init(opts_data,add_opts=['hidden_incog_input_params','in_fmt','use_old_ed25519']) +cmd_args = opts.init(opts_data,add_opts=['hidden_incog_input_params','in_fmt']) if len(cmd_args) < 1: opts.usage() diff --git a/mmgen/obj.py b/mmgen/obj.py index 059c3f6c..6baf6a12 100755 --- a/mmgen/obj.py +++ b/mmgen/obj.py @@ -546,8 +546,9 @@ class BCHAmt(BTCAmt): pass class B2XAmt(BTCAmt): pass class LTCAmt(BTCAmt): max_amt = 84000000 class XMRAmt(BTCAmt): - min_coin_unit = Decimal('0.000000000001') - units = ('min_coin_unit',) + units = ('min_coin_unit','atomic') + min_coin_unit = atomic = Decimal('0.000000000001') + max_prec = 12 from .altcoins.eth.obj import ETHAmt,ETHNonce diff --git a/mmgen/protocol.py b/mmgen/protocol.py index b138e1bc..429299a1 100755 --- a/mmgen/protocol.py +++ b/mmgen/protocol.py @@ -25,7 +25,7 @@ from collections import namedtuple from .util import msg,ymsg,Msg,ydie from .devtools import * -from .obj import BTCAmt,LTCAmt,BCHAmt,B2XAmt,ETHAmt,CoinAddr,MMGenAddrType,PrivKey +from .obj import BTCAmt,LTCAmt,BCHAmt,B2XAmt,XMRAmt,ETHAmt,CoinAddr,MMGenAddrType,PrivKey from .globalvars import g import mmgen.bech32 as bech32 @@ -470,6 +470,7 @@ class CoinProtocol(MMGenObject): privkey_len = 32 mmcaps = ('key','addr') ignore_daemon_version = False + coin_amt = XMRAmt def preprocess_key(self,sec,pubkey_type): # reduce key from .ed25519 import l diff --git a/mmgen/rpc.py b/mmgen/rpc.py index fe5254a9..61b64a6f 100755 --- a/mmgen/rpc.py +++ b/mmgen/rpc.py @@ -178,7 +178,6 @@ class RPCBackends: 'curl', '--proxy', '', '--connect-timeout', str(timeout or self.timeout), - '--request', 'POST', '--write-out', '%{http_code}', '--data-binary', data ] + self.exec_opts + [self.url + self.make_host_path(wallet)] @@ -242,16 +241,17 @@ class RPCClient(MMGenObject): network_proto = 'http' host_path = '' - def __init__(self,host,port): + def __init__(self,host,port,test_connection=True): dmsg_rpc('=== {}.__init__() debug ==='.format(type(self).__name__)) dmsg_rpc(f' cls [{type(self).__name__}] host [{host}] port [{port}]\n') - import socket - try: - socket.create_connection((host,port),timeout=1).close() - except: - raise SocketError(f'Unable to connect to {host}:{port}') + if test_connection: + import socket + try: + socket.create_connection((host,port),timeout=1).close() + except: + raise SocketError(f'Unable to connect to {host}:{port}') self.http_hdrs = { 'Content-Type': 'application/json' } self.url = f'{self.network_proto}://{host}:{port}{self.host_path}' @@ -662,8 +662,8 @@ class MoneroRPCClient(RPCClient): host_path = '/json_rpc' verify_server = False - def __init__(self,host,port,user,passwd): - super().__init__(host,port) + def __init__(self,host,port,user,passwd,test_connection=True): + super().__init__(host,port,test_connection) if self.auth_type: self.auth = auth_data(user,passwd) if True: diff --git a/mmgen/tool.py b/mmgen/tool.py index 1dc2b67f..9ba3f91b 100755 --- a/mmgen/tool.py +++ b/mmgen/tool.py @@ -1129,7 +1129,7 @@ class tool_api( import mmgen.opts opts.UserOpts._reset_ok += ('usr_randchars',) if not hasattr(opt,'version'): - opts.init(add_opts=['use_old_ed25519']) + opts.init() super().__init__() def init_coin(self,coinsym,network): diff --git a/mmgen/xmrwallet.py b/mmgen/xmrwallet.py index 1efc88b7..9f5d8083 100755 --- a/mmgen/xmrwallet.py +++ b/mmgen/xmrwallet.py @@ -223,16 +223,16 @@ class MoneroWalletOps: uarg = uarg_tuple uarg_info = xmrwallet_uarg_info - from .obj import XMRAmt def fmt_amt(amt): - return XMRAmt(amt,from_unit='min_coin_unit').fmt(fs='5.12',color=True) + return self.proto.coin_amt(amt,from_unit='min_coin_unit').fmt(fs='5.12',color=True) def hl_amt(amt): - return XMRAmt(amt,from_unit='min_coin_unit').hl() + return self.proto.coin_amt(amt,from_unit='min_coin_unit').hl() self.check_uargs() from .protocol import init_proto - self.kal = KeyAddrList(init_proto('xmr',network='mainnet'),uarg.xmr_keyaddrfile) + self.proto = init_proto('xmr',testnet=g.testnet) + self.kal = KeyAddrList(self.proto,uarg.xmr_keyaddrfile) self.create_addr_data() check_wallets() @@ -302,6 +302,7 @@ class MoneroWalletOps: wallet_exists = False async def run(self,d,fn): + msg_r('') # for pexpect from .baseconv import baseconv ret = await self.c.call( @@ -442,6 +443,9 @@ class MoneroWalletOps: port_shift = 16, ) + if g.test_suite: + self.wd2.usr_daemon_args = ['--daemon-ssl-allow-any-cert'] + if uarg.start_wallet_daemon: self.wd2.restart() diff --git a/test/gentest.py b/test/gentest.py index 20688345..cb0bbb3b 100755 --- a/test/gentest.py +++ b/test/gentest.py @@ -111,7 +111,7 @@ Supported external tools: sys.argv = [sys.argv[0]] + ['--skip-cfg-file'] + sys.argv[1:] -cmd_args = opts.init(opts_data,add_opts=['exact_output','use_old_ed25519']) +cmd_args = opts.init(opts_data,add_opts=['exact_output']) if not 1 <= len(cmd_args) <= 2: opts.usage() diff --git a/test/include/common.py b/test/include/common.py index 70d446f4..ad9a0f50 100755 --- a/test/include/common.py +++ b/test/include/common.py @@ -147,11 +147,11 @@ def init_coverage(): devnull_fh = open(('/dev/null','null.out')[g.platform == 'win'],'w') def silence(): - if not (opt.verbose or (hasattr(opt,'exact_output') and opt.exact_output)): + if not (opt.verbose or getattr(opt,'exact_output',None)): g.stdout = g.stderr = devnull_fh def end_silence(): - if not (opt.verbose or (hasattr(opt,'exact_output') and opt.exact_output)): + if not (opt.verbose or getattr(opt,'exact_output',None)): g.stdout = sys.stdout g.stderr = sys.stderr @@ -160,16 +160,27 @@ def omsg(s): def omsg_r(s): sys.stderr.write(s) sys.stderr.flush() + def imsg(s): - if opt.verbose or (hasattr(opt,'exact_output') and opt.exact_output): + if opt.verbose or getattr(opt,'exact_output',None): omsg(s) def imsg_r(s): - if opt.verbose or (hasattr(opt,'exact_output') and opt.exact_output): + if opt.verbose or getattr(opt,'exact_output',None): omsg_r(s) + def iqmsg(s): - if not opt.quiet: omsg(s) + if not opt.quiet: + omsg(s) def iqmsg_r(s): - if not opt.quiet: omsg_r(s) + if not opt.quiet: + omsg_r(s) + +def oqmsg(s): + if not (opt.verbose or getattr(opt,'exact_output',None)): + omsg(s) +def oqmsg_r(s): + if not (opt.verbose or getattr(opt,'exact_output',None)): + omsg_r(s) def start_test_daemons(*network_ids,remove_datadir=False): if not opt.no_daemon_autostart: diff --git a/test/test.py b/test/test.py index 4cb3f23d..eb3b2b59 100755 --- a/test/test.py +++ b/test/test.py @@ -780,15 +780,25 @@ class TestSuiteRunner(object): else: if ':' in arg: gname,arg = arg.split(':') + direct_call_ok = True # allow calling of functions not in cmd_group else: gname = self.gm.find_cmd_in_groups(arg) + direct_call_ok = False if gname: same_grp = gname == gname_save # same group as previous cmd: don't clean, suppress blue msg if not self.init_group(gname,arg,quiet=same_grp): continue if not same_grp: clean(self.ts.tmpdir_nums) - self.check_needs_rerun(arg,build=True) + try: + self.check_needs_rerun(arg,build=True) + except: + if direct_call_ok: + ret = getattr(self.ts,arg)() + if type(ret).__name__ == 'coroutine': + run_session(ret) + else: + raise do_between() gname_save = gname else: diff --git a/test/tooltest2.py b/test/tooltest2.py index c9071ce5..0d85138d 100755 --- a/test/tooltest2.py +++ b/test/tooltest2.py @@ -979,7 +979,6 @@ sys.argv = [sys.argv[0]] + ['--skip-cfg-file'] + sys.argv[1:] cmd_args = opts.init( opts_data, - add_opts = ['use_old_ed25519'], init_opts = { 'usr_randchars': 0, 'hash_preset': '1',