From a3afab83d648696c60974aacaba93533f38da74e Mon Sep 17 00:00:00 2001 From: Neil Booth Date: Tue, 7 Aug 2018 21:02:35 +0900 Subject: [PATCH] Better handle bad input to query RPC call Based on #559. Also: - remove unused import - restore timeout to 15s - handle invalid input by catching at a higher level and converting to RPCError --- electrumx/server/chain_state.py | 12 +++--------- electrumx/server/session.py | 7 +++++-- electrumx_rpc | 2 +- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/electrumx/server/chain_state.py b/electrumx/server/chain_state.py index 38b4e7b..7bf2374 100644 --- a/electrumx/server/chain_state.py +++ b/electrumx/server/chain_state.py @@ -6,8 +6,6 @@ # and warranty status of this software. -import asyncio - from aiorpcx import run_in_thread from electrumx.lib.hash import hash_to_hex_str @@ -95,13 +93,9 @@ class ChainState(object): except ValueError: pass - try: - hashX = coin.address_to_hashX(arg) - lines.append(f'Address: {arg}') - return hashX - except Base58Error: - print(f'Ingoring unknown arg: {arg}') - return None + hashX = coin.address_to_hashX(arg) + lines.append(f'Address: {arg}') + return hashX for arg in args: hashX = arg_to_hashX(arg) diff --git a/electrumx/server/session.py b/electrumx/server/session.py index 4676ef1..f058b18 100644 --- a/electrumx/server/session.py +++ b/electrumx/server/session.py @@ -28,7 +28,7 @@ import electrumx import electrumx.lib.text as text import electrumx.lib.util as util from electrumx.lib.hash import (sha256, hash_to_hex_str, hex_str_to_hash, - HASHX_LEN) + HASHX_LEN, Base58Error) from electrumx.lib.peer import Peer from electrumx.server.daemon import DaemonError from electrumx.server.peers import PeerManager @@ -384,7 +384,10 @@ class SessionManager(object): async def rpc_query(self, items, limit): '''Return a list of data about server peers.''' - return await self.chain_state.query(items, limit) + try: + return await self.chain_state.query(items, limit) + except Base58Error as e: + raise RPCError(BAD_REQUEST, e.args[0]) from None async def rpc_sessions(self): '''Return statistics about connected sessions.''' diff --git a/electrumx_rpc b/electrumx_rpc index a520f94..c8bc1d0 100755 --- a/electrumx_rpc +++ b/electrumx_rpc @@ -113,7 +113,7 @@ def main(): # aiorpcX makes this so easy... async def send_request(): try: - async with timeout_after(1): + async with timeout_after(15): async with ClientSession('localhost', port) as session: result = await session.send_request(method, args) if method in ('query', ):