URI: 
       tDisconnect client on unknown scripthash - electrum-personal-server - Maximally lightweight electrum server for a single user
  HTML git clone https://git.parazyd.org/electrum-personal-server
   DIR Log
   DIR Files
   DIR Refs
   DIR README
       ---
   DIR commit 003e14213e3aa18e3db8b44b22495a22fdbfd9b6
   DIR parent 97e99149356dae5a8a3a42f45259b82f6ec4db2c
  HTML Author: chris-belcher <chris-belcher@users.noreply.github.com>
       Date:   Mon, 18 May 2020 22:56:58 +0100
       
       Disconnect client on unknown scripthash
       
       Previously the server would just print a warning to stdout and return
       an empty wallet when the client requested an unknown scripthash. Users
       dont always read stdout. It is better to actually disconnect the client
       instead when this happens. This will make the user figure out what's
       wrong and read the debug log or stdout.
       
       Diffstat:
         M electrumpersonalserver/server/__in… |       1 +
         M electrumpersonalserver/server/comm… |      14 +++++++++-----
         M electrumpersonalserver/server/elec… |       9 ++++++---
       
       3 files changed, 16 insertions(+), 8 deletions(-)
       ---
   DIR diff --git a/electrumpersonalserver/server/__init__.py b/electrumpersonalserver/server/__init__.py
       t@@ -39,6 +39,7 @@ from electrumpersonalserver.server.peertopeer import (
        )
        from electrumpersonalserver.server.electrumprotocol import (
            SERVER_VERSION_NUMBER,
       +    UnknownScripthashError,
            ElectrumProtocol,
            get_block_header,
            get_current_header,
   DIR diff --git a/electrumpersonalserver/server/common.py b/electrumpersonalserver/server/common.py
       t@@ -19,6 +19,7 @@ import electrumpersonalserver.server.deterministicwallet as deterministicwallet
        import electrumpersonalserver.server.transactionmonitor as transactionmonitor
        from electrumpersonalserver.server.electrumprotocol import (
            SERVER_VERSION_NUMBER,
       +    UnknownScripthashError,
            ElectrumProtocol,
            get_block_header,
            get_current_header,
       t@@ -160,16 +161,19 @@ def run_electrum_server(rpc, txmonitor, config):
                    logger.debug("Error with node connection, e = " + repr(e)
                        + "\ntraceback = " + str(traceback.format_exc()))
                    accepting_clients = False
       +        except UnknownScripthashError as e:
       +            logger.debug("Disconnecting client due to misconfiguration. User"
       +                + " must correctly configure master public key(s)")
                except (IOError, EOFError) as e:
                    if isinstance(e, (EOFError, ConnectionRefusedError)):
                        logger.debug("Electrum wallet disconnected")
                    else:
                        logger.debug("IOError: " + repr(e))
       -            try:
       -                if sock != None:
       -                    sock.close()
       -            except IOError:
       -                pass
       +        try:
       +            if sock != None:
       +                sock.close()
       +        except IOError:
       +            pass
                protocol.on_disconnect()
                time.sleep(0.2)
        
   DIR diff --git a/electrumpersonalserver/server/electrumprotocol.py b/electrumpersonalserver/server/electrumprotocol.py
       t@@ -50,6 +50,9 @@ Donate to help make Electrum Personal Server even better:
        
        """
        
       +class UnknownScripthashError(Exception):
       +    pass
       +
        def get_tor_hostport():
            # Probable ports for Tor to listen at
            host = "127.0.0.1"
       t@@ -236,15 +239,15 @@ class ElectrumProtocol(object):
                            + "check that they really are addresses you expect. In "
                            + "Electrum go to Wallet -> Information to get the right "
                            + "master public key.")
       -                history_hash = get_status_electrum([])
       +                raise UnknownScripthashError(scrhash)
                    self._send_response(query, history_hash)
                elif method == "blockchain.scripthash.get_history":
                    scrhash = query["params"][0]
                    history = self.txmonitor.get_electrum_history(scrhash)
                    if history == None:
       -                history = []
                        self.logger.warning("Address history not known to server, "
                            + "hash(address) = " + scrhash)
       +                raise UnknownScripthashError(scrhash)
                    self._send_response(query, history)
                elif method == "blockchain.scripthash.get_balance":
                    scrhash = query["params"][0]
       t@@ -252,7 +255,7 @@ class ElectrumProtocol(object):
                    if balance == None:
                        self.logger.warning("Address history not known to server, "
                            + "hash(address) = " + scrhash)
       -                balance = {"confirmed": 0, "unconfirmed": 0}
       +                raise UnknownScripthashError(scrhash)
                    self._send_response(query, balance)
                elif method == "server.ping":
                    self._send_response(query, None)