commit 24442de8dffd730d7fdeaedb043c36adf0c32975
parent 3c281c4056f94476a1352b89d284bfd0559206fd
Author: ThomasV <thomasv@electrum.org>
Date: Thu, 19 Oct 2017 11:59:36 +0200
fix command line interface for hardware wallets. fixes #3056
Diffstat:
8 files changed, 71 insertions(+), 76 deletions(-)
diff --git a/lib/keystore.py b/lib/keystore.py
@@ -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):
@@ -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
diff --git a/plugins/digitalbitbox/cmdline.py b/plugins/digitalbitbox/cmdline.py
@@ -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
diff --git a/plugins/hw_wallet/__init__.py b/plugins/hw_wallet/__init__.py
@@ -1 +1,2 @@
from .plugin import HW_PluginBase
+from .cmdline import CmdLineHandler
diff --git a/plugins/hw_wallet/cmdline.py b/plugins/hw_wallet/cmdline.py
@@ -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
diff --git a/plugins/keepkey/cmdline.py b/plugins/keepkey/cmdline.py
@@ -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
diff --git a/plugins/ledger/cmdline.py b/plugins/ledger/cmdline.py
@@ -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
diff --git a/plugins/trezor/cmdline.py b/plugins/trezor/cmdline.py
@@ -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
diff --git a/plugins/trezor/plugin.py b/plugins/trezor/plugin.py
@@ -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: