electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit 1cfac928f9c6f0dec327c261afef26486e226c20
parent 9b0773cf2bf139eafe4a828c8964461d34ea9e23
Author: SomberNight <somber.night@protonmail.com>
Date:   Mon, 25 Mar 2019 23:36:52 +0100

trustedcoin: longer timeout for server signing

fixes #5221

Diffstat:
Melectrum/network.py | 9++++++---
Melectrum/plugins/trustedcoin/qt.py | 12++++++------
Melectrum/plugins/trustedcoin/trustedcoin.py | 17+++++++++++++----
Melectrum/util.py | 2++
4 files changed, 27 insertions(+), 13 deletions(-)

diff --git a/electrum/network.py b/electrum/network.py @@ -1159,7 +1159,9 @@ class Network(PrintError): await asyncio.sleep(0.1) @classmethod - async def _send_http_on_proxy(cls, method: str, url: str, params: str = None, body: bytes = None, json: dict = None, headers=None, on_finish=None): + async def _send_http_on_proxy(cls, method: str, url: str, params: str = None, + body: bytes = None, json: dict = None, headers=None, + on_finish=None, timeout=None): async def default_on_finish(resp: ClientResponse): resp.raise_for_status() return await resp.text() @@ -1169,7 +1171,7 @@ class Network(PrintError): on_finish = default_on_finish network = cls.get_instance() proxy = network.proxy if network else None - async with make_aiohttp_session(proxy) as session: + async with make_aiohttp_session(proxy, timeout=timeout) as session: if method == 'get': async with session.get(url, params=params, headers=headers) as resp: return await on_finish(resp) @@ -1193,7 +1195,8 @@ class Network(PrintError): else: loop = asyncio.get_event_loop() coro = asyncio.run_coroutine_threadsafe(cls._send_http_on_proxy(method, url, **kwargs), loop) - return coro.result(5) + # note: _send_http_on_proxy has its own timeout, so no timeout here: + return coro.result() # methods used in scripts async def get_peers(self): diff --git a/electrum/plugins/trustedcoin/qt.py b/electrum/plugins/trustedcoin/qt.py @@ -67,12 +67,12 @@ class HandlerTwoFactor(QObject, PrintError): return window = self.window.top_level_window() auth_code = self.plugin.auth_dialog(window) - try: - wallet.on_otp(tx, auth_code) - except: - on_failure(sys.exc_info()) - return - on_success(tx) + WaitingDialog(parent=window, + message=_('Waiting for TrustedCoin server to sign transaction...'), + task=lambda: wallet.on_otp(tx, auth_code), + on_success=lambda *args: on_success(tx), + on_error=on_failure) + class Plugin(TrustedCoinPlugin): diff --git a/electrum/plugins/trustedcoin/trustedcoin.py b/electrum/plugins/trustedcoin/trustedcoin.py @@ -136,7 +136,7 @@ class TrustedCoinCosignerClient(PrintError): except: return await resp.text() - def send_request(self, method, relative_url, data=None): + def send_request(self, method, relative_url, data=None, *, timeout=None): network = Network.get_instance() if not network: raise ErrorConnectingServer('You are offline.') @@ -148,9 +148,17 @@ class TrustedCoinCosignerClient(PrintError): headers['user-agent'] = self.user_agent try: if method == 'get': - response = Network.send_http_on_proxy(method, url, params=data, headers=headers, on_finish=self.handle_response) + response = Network.send_http_on_proxy(method, url, + params=data, + headers=headers, + on_finish=self.handle_response, + timeout=timeout) elif method == 'post': - response = Network.send_http_on_proxy(method, url, json=data, headers=headers, on_finish=self.handle_response) + response = Network.send_http_on_proxy(method, url, + json=data, + headers=headers, + on_finish=self.handle_response, + timeout=timeout) else: assert False except TrustedCoinException: @@ -219,7 +227,8 @@ class TrustedCoinCosignerClient(PrintError): 'otp': otp, 'transaction': transaction } - return self.send_request('post', 'cosigner/%s/sign' % quote(id), payload) + return self.send_request('post', 'cosigner/%s/sign' % quote(id), payload, + timeout=60) def transfer_credit(self, id, recipient, otp, signature_callback): """ diff --git a/electrum/util.py b/electrum/util.py @@ -953,6 +953,8 @@ def make_aiohttp_session(proxy: Optional[dict], headers=None, timeout=None): headers = {'User-Agent': 'Electrum'} if timeout is None: timeout = aiohttp.ClientTimeout(total=10) + elif isinstance(timeout, (int, float)): + timeout = aiohttp.ClientTimeout(total=timeout) ssl_context = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH, cafile=ca_path) if proxy: