commit 42719cd0a9df28b62fe82bb711e9145666ae000d
parent cb4947d7056ee228e210c0facec88136cc228663
Author: Neil Booth <kyuupichan@gmail.com>
Date: Sat, 26 Dec 2015 18:48:07 +0900
Commonize GuiMixin for keepkey and trezor
Diffstat:
3 files changed, 67 insertions(+), 120 deletions(-)
diff --git a/plugins/keepkey/keepkey.py b/plugins/keepkey/keepkey.py
@@ -1,5 +1,4 @@
from binascii import unhexlify
-from sys import stderr
import electrum
from electrum import bitcoin
@@ -11,6 +10,7 @@ from electrum.plugins import BasePlugin, hook
from electrum.transaction import deserialize, is_extended_pubkey
from electrum.wallet import BIP32_Hardware_Wallet
from electrum.util import print_error
+from plugins.trezor.gui_mixin import GuiMixin
try:
from keepkeylib.client import types
@@ -23,10 +23,6 @@ except ImportError:
import keepkeylib.ckd_public as ckd_public
-def log(msg):
- stderr.write("%s\n" % msg)
- stderr.flush()
-
def give_error(message):
print_error(message)
raise Exception(message)
@@ -246,63 +242,11 @@ class KeepKeyPlugin(BasePlugin):
tx.deserialize()
return self.electrum_tx_to_txtype(tx)
-
-
-
-
-
-
-class KeepKeyGuiMixin(object):
-
- def __init__(self, *args, **kwargs):
- super(KeepKeyGuiMixin, self).__init__(*args, **kwargs)
-
- def callback_ButtonRequest(self, msg):
- if msg.code == 3:
- message = "Confirm transaction outputs on KeepKey device to continue"
- elif msg.code == 8:
- message = "Confirm transaction fee on KeepKey device to continue"
- elif msg.code == 7:
- message = "Confirm message to sign on KeepKey device to continue"
- elif msg.code == 10:
- message = "Confirm address on KeepKey device to continue"
- else:
- message = "Check KeepKey device to continue"
- cancel_callback=self.cancel if msg.code in [3, 8] else None
- self.handler.show_message(message, cancel_callback)
- return proto.ButtonAck()
-
- def callback_PinMatrixRequest(self, msg):
- if msg.type == 1:
- desc = 'current PIN'
- elif msg.type == 2:
- desc = 'new PIN'
- elif msg.type == 3:
- desc = 'new PIN again'
- else:
- desc = 'PIN'
- pin = self.handler.get_pin("Please enter KeepKey %s" % desc)
- if not pin:
- return proto.Cancel()
- return proto.PinMatrixAck(pin=pin)
-
- def callback_PassphraseRequest(self, req):
- msg = _("Please enter your KeepKey passphrase.")
- passphrase = self.handler.get_passphrase(msg)
- if passphrase is None:
- return proto.Cancel()
- return proto.PassphraseAck(passphrase=passphrase)
-
- def callback_WordRequest(self, msg):
- #TODO
- log("Enter one word of mnemonic: ")
- word = raw_input()
- return proto.WordAck(word=word)
-
-
-
if KEEPKEY:
- class QtGuiKeepKeyClient(ProtocolMixin, KeepKeyGuiMixin, BaseClient):
+ class QtGuiKeepKeyClient(ProtocolMixin, GuiMixin, BaseClient):
+ protocol = proto
+ device = 'KeepKey'
+
def call_raw(self, msg):
try:
resp = BaseClient.call_raw(self, msg)
diff --git a/plugins/trezor/gui_mixin.py b/plugins/trezor/gui_mixin.py
@@ -0,0 +1,57 @@
+from sys import stderr
+
+from electrum.i18n import _
+
+class GuiMixin(object):
+ # Requires: self.protcol, self.device
+
+ def __init__(self, *args, **kwargs):
+ super(GuiMixin, self).__init__(*args, **kwargs)
+
+ def callback_ButtonRequest(self, msg):
+ if msg.code == 3:
+ message = _("Confirm transaction outputs on %s device to continue")
+ elif msg.code == 8:
+ message = _("Confirm transaction fee on %s device to continue")
+ elif msg.code == 7:
+ message = _("Confirm message to sign on %s device to continue")
+ elif msg.code == 10:
+ message = _("Confirm address on %s device to continue")
+ else:
+ message = _("Check %s device to continue")
+
+ if msg.code in [3, 8] and hasattr(self, 'cancel'):
+ cancel_callback = self.cancel
+ else:
+ cancel_callback = None
+
+ self.handler.show_message(message % self.device, cancel_callback)
+ return self.protocol.ButtonAck()
+
+ def callback_PinMatrixRequest(self, msg):
+ if msg.type == 1:
+ msg = _("Please enter %s current PIN")
+ elif msg.type == 2:
+ msg = _("Please enter %s new PIN")
+ elif msg.type == 3:
+ msg = _("Please enter %s new PIN again")
+ else:
+ msg = _("Please enter %s PIN")
+ pin = self.handler.get_pin(msg % self.device)
+ if not pin:
+ return self.protocol.Cancel()
+ return self.protocol.PinMatrixAck(pin=pin)
+
+ def callback_PassphraseRequest(self, req):
+ msg = _("Please enter your %s passphrase")
+ passphrase = self.handler.get_passphrase(msg % self.device)
+ if passphrase is None:
+ return self.protocol.Cancel()
+ return self.protocol.PassphraseAck(passphrase=passphrase)
+
+ def callback_WordRequest(self, msg):
+ #TODO
+ stderr.write("Enter one word of mnemonic:\n")
+ stderr.flush()
+ word = raw_input()
+ return self.protocol.WordAck(word=word)
diff --git a/plugins/trezor/trezor.py b/plugins/trezor/trezor.py
@@ -1,5 +1,4 @@
from binascii import unhexlify
-from sys import stderr
import electrum
from electrum import bitcoin
@@ -11,6 +10,7 @@ from electrum.plugins import BasePlugin, hook
from electrum.transaction import deserialize, is_extended_pubkey
from electrum.wallet import BIP32_Hardware_Wallet
from electrum.util import print_error
+from plugins.trezor.gui_mixin import GuiMixin
try:
from trezorlib.client import types
@@ -23,10 +23,6 @@ except ImportError:
import trezorlib.ckd_public as ckd_public
-def log(msg):
- stderr.write("%s\n" % msg)
- stderr.flush()
-
def give_error(message):
print_error(message)
raise Exception(message)
@@ -229,61 +225,11 @@ class TrezorPlugin(BasePlugin):
tx.deserialize()
return self.electrum_tx_to_txtype(tx)
-
-
-
-
-class TrezorGuiMixin(object):
-
- def __init__(self, *args, **kwargs):
- super(TrezorGuiMixin, self).__init__(*args, **kwargs)
-
- def callback_ButtonRequest(self, msg):
- if msg.code == 3:
- message = "Confirm transaction outputs on Trezor device to continue"
- elif msg.code == 8:
- message = "Confirm transaction fee on Trezor device to continue"
- elif msg.code == 7:
- message = "Confirm message to sign on Trezor device to continue"
- elif msg.code == 10:
- message = "Confirm address on Trezor device to continue"
- else:
- message = "Check Trezor device to continue"
- self.handler.show_message(message)
- return proto.ButtonAck()
-
- def callback_PinMatrixRequest(self, msg):
- if msg.type == 1:
- desc = 'current PIN'
- elif msg.type == 2:
- desc = 'new PIN'
- elif msg.type == 3:
- desc = 'new PIN again'
- else:
- desc = 'PIN'
- pin = self.handler.get_pin("Please enter Trezor %s" % desc)
- if not pin:
- return proto.Cancel()
- return proto.PinMatrixAck(pin=pin)
-
- def callback_PassphraseRequest(self, req):
- msg = _("Please enter your Trezor passphrase.")
- passphrase = self.handler.get_passphrase(msg)
- if passphrase is None:
- return proto.Cancel()
- return proto.PassphraseAck(passphrase=passphrase)
-
- def callback_WordRequest(self, msg):
- #TODO
- log("Enter one word of mnemonic: ")
- word = raw_input()
- return proto.WordAck(word=word)
-
-
-
-
if TREZOR:
- class QtGuiTrezorClient(ProtocolMixin, TrezorGuiMixin, BaseClient):
+ class QtGuiTrezorClient(ProtocolMixin, GuiMixin, BaseClient):
+ protocol = proto
+ device = 'Trezor'
+
def call_raw(self, msg):
try:
resp = BaseClient.call_raw(self, msg)