From 95408dc8cc12d9f1c475845fe154d15ebb52f22f Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Wed, 13 May 2020 21:06:02 +0000 Subject: [PATCH] rpc.py: g.proto -> self.proto --- mmgen/protocol.py | 12 ++--------- mmgen/rpc.py | 51 ++++++++++++++++++++++++----------------------- mmgen/util.py | 7 ++++--- 3 files changed, 32 insertions(+), 38 deletions(-) diff --git a/mmgen/protocol.py b/mmgen/protocol.py index 51c07728..f862fef6 100755 --- a/mmgen/protocol.py +++ b/mmgen/protocol.py @@ -476,13 +476,6 @@ class CoinProtocol(MMGenObject): def list_coins(cls): return [c.upper() for c in cls.coins] - @classmethod - def get_base_coin_from_name(cls,name): - for (proto,foo) in cls.coins.values(): - if name == proto.__name__[:-8].lower(): - return proto.base_coin - return False - def init_genonly_altcoins(usr_coin=None): """ Initialize altcoin protocol class or classes for current network. @@ -563,7 +556,6 @@ def init_coin(coin,testnet=None): if testnet is not None: g.testnet = testnet g.network = ('mainnet','testnet')[g.testnet] - coin = coin.upper() - g.coin = coin - g.proto = CoinProtocol(coin,g.testnet) + g.coin = coin.upper() + g.proto = CoinProtocol(g.coin,g.testnet) return g.proto diff --git a/mmgen/rpc.py b/mmgen/rpc.py index a9896abe..6827c79c 100755 --- a/mmgen/rpc.py +++ b/mmgen/rpc.py @@ -25,26 +25,26 @@ from decimal import Decimal from .common import * from .obj import aInitMeta -rpc_credentials_msg = lambda: '\n'+fmt(f""" - Error: no {g.proto.name.capitalize()} RPC authentication method found +rpc_credentials_msg = lambda self: '\n'+fmt(f""" + Error: no {self.proto.name.capitalize()} RPC authentication method found RPC credentials must be supplied using one of the following methods: A) If daemon is local and running as same user as you: - no credentials required, or matching rpcuser/rpcpassword and - rpc_user/rpc_password values in {g.proto.name}.conf and mmgen.cfg + rpc_user/rpc_password values in {self.proto.name}.conf and mmgen.cfg B) If daemon is running remotely or as different user: - - matching credentials in {g.proto.name}.conf and mmgen.cfg as described above + - matching credentials in {self.proto.name}.conf and mmgen.cfg as described above The --rpc-user/--rpc-password options may be supplied on the MMGen command line. They override the corresponding values in mmgen.cfg. Set them to an empty string to use cookie authentication with a local server when the options are set in mmgen.cfg. - For better security, rpcauth should be used in {g.proto.name}.conf instead of + For better security, rpcauth should be used in {self.proto.name}.conf instead of rpcuser/rpcpassword. """,strip_char='\t') @@ -157,7 +157,7 @@ class RPCBackends: yield s if caller.auth_type == 'digest': yield '--digest' - if caller.proto == 'https' and caller.verify_server == False: + if caller.network_proto == 'https' and caller.verify_server == False: yield '--insecure' self.url = caller.url @@ -193,7 +193,7 @@ class RPCClient(MMGenObject): auth_type = None has_auth_cookie = False - proto = 'http' + network_proto = 'http' host_path = '' def __init__(self,host,port): @@ -208,7 +208,7 @@ class RPCClient(MMGenObject): raise SocketError('Unable to connect to {}:{}'.format(host,port)) self.http_hdrs = { 'Content-Type': 'application/json' } - self.url = f'{self.proto}://{host}:{port}{self.host_path}' + self.url = f'{self.network_proto}://{host}:{port}{self.host_path}' self.host = host self.port = port self.timeout = g.http_timeout @@ -240,7 +240,7 @@ class RPCClient(MMGenObject): self.auth = auth_data(*cookie.split(':')) return - die(1,rpc_credentials_msg()) + die(1,rpc_credentials_msg(self)) # positional params are passed to the daemon, kwargs to the backend # 'timeout' is currently the only supported kwarg @@ -323,12 +323,12 @@ class BitcoinRPCClient(RPCClient,metaclass=aInitMeta): def __init__(self,*args,**kwargs): pass - async def __ainit__(self,backend=None): + async def __ainit__(self,proto,backend): async def check_chainfork_mismatch(block0): try: - assert block0 == g.proto.block0,'Incorrect Genesis block for {}'.format(g.proto.__name__) - for fork in g.proto.forks: + assert block0 == self.proto.block0,'Incorrect Genesis block for {}'.format(self.proto.__name__) + for fork in self.proto.forks: if fork.height == None or self.blockcount < fork.height: break if fork.hash != await self.call('getblockhash',fork.height): @@ -344,11 +344,12 @@ class BitcoinRPCClient(RPCClient,metaclass=aInitMeta): except Exception as e: die(1,'{}\nChain is {}!'.format(e.args[0],g.chain)) + self.proto = proto user,passwd = get_coin_daemon_cfg_options(('rpcuser','rpcpassword')).values() super().__init__( host = g.rpc_host or 'localhost', - port = g.rpc_port or g.proto.rpc_port) + port = g.rpc_port or self.proto.rpc_port) self.set_auth() # set_auth() requires cookie, so must be called after __init__() tests socket self.set_backend(backend) # backend requires self.auth @@ -389,17 +390,14 @@ class BitcoinRPCClient(RPCClient,metaclass=aInitMeta): if len((await self.call('help',func)).split('\n')) > 3: self.caps += (cap,) - # TODO: these belong in protocol.py - @classmethod - def get_daemon_auth_cookie_fn(cls): + def get_daemon_auth_cookie_fn(self): cdir = os.path.join( - g.proto.daemon_data_dir, - g.proto.daemon_data_subdir ) + self.proto.daemon_data_dir, + self.proto.daemon_data_subdir ) return os.path.join(cdir,'.cookie') - @classmethod - def get_daemon_auth_cookie(cls): - fn = cls.get_daemon_auth_cookie_fn() + def get_daemon_auth_cookie(self): + fn = self.get_daemon_auth_cookie_fn() return get_lines_from_file(fn,'')[0] if file_is_readable(fn) else '' rpcmethods = ( @@ -442,11 +440,13 @@ class EthereumRPCClient(RPCClient,metaclass=aInitMeta): def __init__(self,*args,**kwargs): pass - async def __ainit__(self,backend=None): + async def __ainit__(self,proto,backend): + + self.proto = proto super().__init__( host = g.rpc_host or 'localhost', - port = g.rpc_port or g.proto.rpc_port ) + port = g.rpc_port or self.proto.rpc_port ) self.set_backend(backend) @@ -512,7 +512,7 @@ class EthereumRPCClient(RPCClient,metaclass=aInitMeta): class MoneroWalletRPCClient(RPCClient): auth_type = 'digest' - proto = 'https' + network_proto = 'https' host_path = '/json_rpc' verify_server = False @@ -546,6 +546,7 @@ class MoneroWalletRPCClient(RPCClient): async def rpc_init(proto=None,backend=None): proto = proto or g.proto + backend = backend or g.rpc_backend if not 'rpc' in proto.mmcaps: die(1,'Coin daemon operations not supported for {}!'.format(proto.__name__)) @@ -553,6 +554,6 @@ async def rpc_init(proto=None,backend=None): g.rpc = await { 'bitcoind': BitcoinRPCClient, 'parity': EthereumRPCClient, - }[proto.daemon_family](backend=backend) + }[proto.daemon_family](proto=proto,backend=backend) return g.rpc diff --git a/mmgen/util.py b/mmgen/util.py index d6efcab4..7a7909f7 100755 --- a/mmgen/util.py +++ b/mmgen/util.py @@ -884,8 +884,9 @@ def get_network_id(coin=None,testnet=None): if coin != None: assert testnet != None return (coin or g.coin).lower() + ('','_tn')[testnet or g.testnet] -def run_session(callback,do_rpc_init=True,backend=None): +def run_session(callback,do_rpc_init=True,proto=None,backend=None): backend = backend or opt.rpc_backend + proto = proto or g.proto import asyncio async def do(): if backend == 'aiohttp': @@ -896,14 +897,14 @@ def run_session(callback,do_rpc_init=True,backend=None): ) as g.session: if do_rpc_init: from .rpc import rpc_init - await rpc_init(backend=backend) + await rpc_init(proto=proto,backend=backend) ret = await callback g.session = None return ret else: if do_rpc_init: from .rpc import rpc_init - await rpc_init(backend=backend) + await rpc_init(proto=proto,backend=backend) return await callback # return asyncio.run(do()) # Python 3.7+