URI: 
       tCommonize GuiMixin for keepkey and trezor - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 42719cd0a9df28b62fe82bb711e9145666ae000d
   DIR parent cb4947d7056ee228e210c0facec88136cc228663
  HTML Author: Neil Booth <kyuupichan@gmail.com>
       Date:   Sat, 26 Dec 2015 18:48:07 +0900
       
       Commonize GuiMixin for keepkey and trezor
       
       Diffstat:
         M plugins/keepkey/keepkey.py          |      66 +++----------------------------
         A plugins/trezor/gui_mixin.py         |      57 +++++++++++++++++++++++++++++++
         M plugins/trezor/trezor.py            |      64 +++----------------------------
       
       3 files changed, 67 insertions(+), 120 deletions(-)
       ---
   DIR diff --git a/plugins/keepkey/keepkey.py b/plugins/keepkey/keepkey.py
       t@@ -1,5 +1,4 @@
        from binascii import unhexlify
       -from sys import stderr
        
        import electrum
        from electrum import bitcoin
       t@@ -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
       t@@ -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)
       t@@ -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)
   DIR diff --git a/plugins/trezor/gui_mixin.py b/plugins/trezor/gui_mixin.py
       t@@ -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)
   DIR diff --git a/plugins/trezor/trezor.py b/plugins/trezor/trezor.py
       t@@ -1,5 +1,4 @@
        from binascii import unhexlify
       -from sys import stderr
        
        import electrum
        from electrum import bitcoin
       t@@ -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
       t@@ -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)
       t@@ -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)