URI: 
       tfix command line interface for hardware wallets. fixes #3056 - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 24442de8dffd730d7fdeaedb043c36adf0c32975
   DIR parent 3c281c4056f94476a1352b89d284bfd0559206fd
  HTML Author: ThomasV <thomasv@electrum.org>
       Date:   Thu, 19 Oct 2017 11:59:36 +0200
       
       fix command line interface for hardware wallets. fixes #3056
       
       Diffstat:
         M lib/keystore.py                     |       3 ++-
         M plugins/digitalbitbox/cmdline.py    |      20 +++++++-------------
         M plugins/hw_wallet/__init__.py       |       1 +
         A plugins/hw_wallet/cmdline.py        |      39 +++++++++++++++++++++++++++++++
         M plugins/keepkey/cmdline.py          |      28 +++++++---------------------
         M plugins/ledger/cmdline.py           |      23 +++++++----------------
         M plugins/trezor/cmdline.py           |      31 ++++++++-----------------------
         M plugins/trezor/plugin.py            |       2 --
       
       8 files changed, 71 insertions(+), 76 deletions(-)
       ---
   DIR diff --git a/lib/keystore.py b/lib/keystore.py
       t@@ -37,7 +37,7 @@ from .bitcoin import *
        from .bitcoin import is_old_seed, is_new_seed, is_seed
        from .util import PrintError, InvalidPassword, hfu
        from .mnemonic import Mnemonic, load_wordlist
       -
       +from .plugins import run_hook
        
        class KeyStore(PrintError):
        
       t@@ -488,6 +488,7 @@ class Hardware_KeyStore(KeyStore, Xpub):
                self.label = d.get('label')
                self.derivation = d.get('derivation')
                self.handler = None
       +        run_hook('init_keystore', self)
        
            def set_label(self, label):
                self.label = label
   DIR diff --git a/plugins/digitalbitbox/cmdline.py b/plugins/digitalbitbox/cmdline.py
       t@@ -1,17 +1,11 @@
        from electrum.util import print_msg
        from .digitalbitbox import DigitalBitboxPlugin
       -
       -class DigitalBitboxCmdLineHandler:
       -    def stop(self):
       -        pass
       -
       -    def show_message(self, msg):
       -        print_msg(msg)
       -
       -    def get_passphrase(self, msg, confirm):
       -        import getpass
       -        print_msg(msg)
       -        return getpass.getpass('')
       +from ..hw_wallet import CmdLineHandler
        
        class Plugin(DigitalBitboxPlugin):
       -    handler = DigitalBitboxCmdLineHandler()
       +    handler = CmdLineHandler()
       +    @hook
       +    def init_keystore(self, keystore):
       +        if not isinstance(keystore, self.keystore_class):
       +            return
       +        keystore.handler = self.handler
   DIR diff --git a/plugins/hw_wallet/__init__.py b/plugins/hw_wallet/__init__.py
       t@@ -1 +1,2 @@
        from .plugin import HW_PluginBase
       +from .cmdline import CmdLineHandler
   DIR diff --git a/plugins/hw_wallet/cmdline.py b/plugins/hw_wallet/cmdline.py
       t@@ -0,0 +1,39 @@
       +from electrum.util import print_msg, print_error, raw_input
       +
       +class CmdLineHandler:
       +
       +    def get_passphrase(self, msg, confirm):
       +        import getpass
       +        print_msg(msg)
       +        return getpass.getpass('')
       +
       +    def get_pin(self, msg):
       +        t = { 'a':'7', 'b':'8', 'c':'9', 'd':'4', 'e':'5', 'f':'6', 'g':'1', 'h':'2', 'i':'3'}
       +        print_msg(msg)
       +        print_msg("a b c\nd e f\ng h i\n-----")
       +        o = raw_input()
       +        return ''.join(map(lambda x: t[x], o))
       +
       +    def prompt_auth(self, msg):
       +        import getpass
       +        print_msg(msg)
       +        response = getpass.getpass('')
       +        if len(response) == 0:
       +            return None
       +        return response
       +
       +    def yes_no_question(self, msg):
       +        print_msg(msg)
       +        return raw_input() in 'yY'
       +
       +    def stop(self):
       +        pass
       +
       +    def show_message(self, msg, on_cancel):
       +        print_msg(msg)
       +
       +    def update_status(self, b):
       +        print_error('trezor status', b)
       +
       +    def finished(self):
       +        pass
   DIR diff --git a/plugins/keepkey/cmdline.py b/plugins/keepkey/cmdline.py
       t@@ -1,25 +1,11 @@
        from electrum.util import print_msg, raw_input
        from .keepkey import KeepKeyPlugin
       -
       -class KeepKeyCmdLineHandler:
       -
       -    def get_passphrase(self, msg, confirm):
       -        import getpass
       -        print_msg(msg)
       -        return getpass.getpass('')
       -
       -    def get_pin(self, msg):
       -        t = { 'a':'7', 'b':'8', 'c':'9', 'd':'4', 'e':'5', 'f':'6', 'g':'1', 'h':'2', 'i':'3'}
       -        print_msg(msg)
       -        print_msg("a b c\nd e f\ng h i\n-----")
       -        o = raw_input()
       -        return ''.join(map(lambda x: t[x], o))
       -
       -    def stop(self):
       -        pass
       -
       -    def show_message(self, msg):
       -        print_msg(msg)
       +from ..hw_wallet import CmdLineHandler
        
        class Plugin(KeepKeyPlugin):
       -    handler = KeepKeyCmdLineHandler()
       +    handler = CmdLineHandler()
       +    @hook
       +    def init_keystore(self, keystore):
       +        if not isinstance(keystore, self.keystore_class):
       +            return
       +        keystore.handler = self.handler
   DIR diff --git a/plugins/ledger/cmdline.py b/plugins/ledger/cmdline.py
       t@@ -1,20 +1,11 @@
        from electrum.util import print_msg
        from .ledger import LedgerPlugin
       -
       -class BTChipCmdLineHandler:
       -    def stop(self):
       -        pass
       -
       -    def show_message(self, msg):
       -        print_msg(msg)
       -
       -    def prompt_auth(self, msg):
       -        import getpass
       -        print_msg(msg)
       -        response = getpass.getpass('')
       -        if len(response) == 0:
       -            return None
       -        return response
       +from ..hw_wallet import CmdLineHandler
        
        class Plugin(LedgerPlugin):
       -    handler = BTChipCmdLineHandler()
       +    handler = CmdLineHandler()
       +    @hook
       +    def init_keystore(self, keystore):
       +        if not isinstance(keystore, self.keystore_class):
       +            return
       +        keystore.handler = self.handler
   DIR diff --git a/plugins/trezor/cmdline.py b/plugins/trezor/cmdline.py
       t@@ -1,26 +1,11 @@
       -from electrum.util import print_msg, raw_input
       +from electrum.plugins import hook
        from .trezor import TrezorPlugin
       -
       -class TrezorCmdLineHandler:
       -
       -    def get_passphrase(self, msg, confirm):
       -        import getpass
       -        print_msg(msg)
       -        return getpass.getpass('')
       -
       -    def get_pin(self, msg):
       -        t = { 'a':'7', 'b':'8', 'c':'9', 'd':'4', 'e':'5', 'f':'6', 'g':'1', 'h':'2', 'i':'3'}
       -        print_msg(msg)
       -        print_msg("a b c\nd e f\ng h i\n-----")
       -        o = raw_input()
       -        return ''.join(map(lambda x: t[x], o))
       -
       -    def stop(self):
       -        pass
       -
       -    def show_message(self, msg):
       -        print_msg(msg)
       -
       +from ..hw_wallet import CmdLineHandler
        
        class Plugin(TrezorPlugin):
       -    handler = TrezorCmdLineHandler()
       +    handler = CmdLineHandler()
       +    @hook
       +    def init_keystore(self, keystore):
       +        if not isinstance(keystore, self.keystore_class):
       +            return
       +        keystore.handler = self.handler
   DIR diff --git a/plugins/trezor/plugin.py b/plugins/trezor/plugin.py
       t@@ -132,8 +132,6 @@ class TrezorCompatiblePlugin(HW_PluginBase):
                return client
        
            def get_client(self, keystore, force_pair=True):
       -        # All client interaction should not be in the main GUI thread
       -        assert self.main_thread != threading.current_thread()
                devmgr = self.device_manager()
                handler = keystore.handler
                with devmgr.hid_lock: