tledger: nice error msg if pin locked for sign_tx/sign_msg/show_addr - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit e00499f04013b7d43c73fe64b74eb393c3700420 DIR parent 23c29715af210f49899d5a68f948b4f594135a52 HTML Author: SomberNight <somber.night@protonmail.com> Date: Sun, 22 Apr 2018 02:15:08 +0200 ledger: nice error msg if pin locked for sign_tx/sign_msg/show_addr Diffstat: M plugins/ledger/ledger.py | 38 +++++++++++++++++++------------ 1 file changed, 24 insertions(+), 14 deletions(-) --- DIR diff --git a/plugins/ledger/ledger.py b/plugins/ledger/ledger.py t@@ -34,6 +34,21 @@ SEGWIT_SUPPORT = '1.1.10' SEGWIT_SUPPORT_SPECIAL = '1.0.4' +def test_pin_unlocked(func): + """Function decorator to test the Ledger for being unlocked, and if not, + raise a human-readable exception. + """ + def catch_exception(self, *args, **kwargs): + try: + return func(self, *args, **kwargs) + except BTChipException as e: + if e.sw == 0x6982: + raise Exception(_('Your Ledger is locked. Please unlock it.')) + else: + raise + return catch_exception + + class Ledger_Client(): def __init__(self, hidDevice): self.dongleObject = btchip(hidDevice) t@@ -64,20 +79,6 @@ class Ledger_Client(): return False return True - def test_pin_unlocked(func): - """Function decorator to test the Ledger for being unlocked, and if not, - raise a human-readable exception. - """ - def catch_exception(self, *args, **kwargs): - try: - return func(self, *args, **kwargs) - except BTChipException as e: - if e.sw == 0x6982: - raise Exception(_('Your Ledger is locked. Please unlock it.')) - else: - raise - return catch_exception - @test_pin_unlocked def get_xpub(self, bip32_path, xtype): self.checkDevice() t@@ -256,6 +257,7 @@ class Ledger_KeyStore(Hardware_KeyStore): def decrypt_message(self, pubkey, message, password): raise RuntimeError(_('Encryption and decryption are currently not supported for {}').format(self.device)) + @test_pin_unlocked @set_and_unset_signing def sign_message(self, sequence, message, password): message = message.encode('utf8') t@@ -278,6 +280,8 @@ class Ledger_KeyStore(Hardware_KeyStore): self.give_error("Unfortunately, this message cannot be signed by the Ledger wallet. Only alphanumerical messages shorter than 140 characters are supported. Please remove any extra characters (tab, carriage return) and retry.") elif e.sw == 0x6985: # cancelled by user return b'' + elif e.sw == 0x6982: + raise # pin lock. decorator will catch it else: self.give_error(e, True) except UserWarning: t@@ -299,6 +303,7 @@ class Ledger_KeyStore(Hardware_KeyStore): # And convert it return bytes([27 + 4 + (signature[0] & 0x01)]) + r + s + @test_pin_unlocked @set_and_unset_signing def sign_transaction(self, tx, password): if tx.is_complete(): t@@ -480,6 +485,8 @@ class Ledger_KeyStore(Hardware_KeyStore): except BTChipException as e: if e.sw == 0x6985: # cancelled by user return + elif e.sw == 0x6982: + raise # pin lock. decorator will catch it else: traceback.print_exc(file=sys.stderr) self.give_error(e, True) t@@ -494,6 +501,7 @@ class Ledger_KeyStore(Hardware_KeyStore): txin['signatures'][signingPos] = bh2u(signatures[i]) tx.raw = tx.serialize() + @test_pin_unlocked @set_and_unset_signing def show_address(self, sequence, txin_type): client = self.get_client() t@@ -506,6 +514,8 @@ class Ledger_KeyStore(Hardware_KeyStore): except BTChipException as e: if e.sw == 0x6985: # cancelled by user pass + elif e.sw == 0x6982: + raise # pin lock. decorator will catch it else: traceback.print_exc(file=sys.stderr) self.handler.show_error(e)