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: