electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

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:
Mplugins/keepkey/keepkey.py | 66+++++-------------------------------------------------------------
Aplugins/trezor/gui_mixin.py | 57+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mplugins/trezor/trezor.py | 64+++++-----------------------------------------------------------
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)