From fe982cf826aef41b78b073a2097283d850ed5f66 Mon Sep 17 00:00:00 2001 From: Marcel O'Neil Date: Thu, 11 Jan 2018 18:19:45 -0500 Subject: [PATCH 1/2] fix crash when exporting private keys --- gui/qt/main_window.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/gui/qt/main_window.py b/gui/qt/main_window.py index ea01cffd0..69f009f28 100644 --- a/gui/qt/main_window.py +++ b/gui/qt/main_window.py @@ -2269,25 +2269,38 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError): private_keys = {} addresses = self.wallet.get_addresses() done = False + cancelled = False def privkeys_thread(): for addr in addresses: time.sleep(0.1) - if done: + if done or cancelled: break privkey = self.wallet.export_private_key(addr, password)[0] private_keys[addr] = privkey self.computing_privkeys_signal.emit() - self.computing_privkeys_signal.disconnect() - self.show_privkeys_signal.emit() + if not cancelled: + self.computing_privkeys_signal.disconnect() + self.show_privkeys_signal.emit() def show_privkeys(): s = "\n".join( map( lambda x: x[0] + "\t"+ x[1], private_keys.items())) e.setText(s) b.setEnabled(True) self.show_privkeys_signal.disconnect() + nonlocal done + done = True + + def on_dialog_closed(*args): + nonlocal done + nonlocal cancelled + if not done: + cancelled = True + self.computing_privkeys_signal.disconnect() + self.show_privkeys_signal.disconnect() self.computing_privkeys_signal.connect(lambda: e.setText("Please wait... %d/%d"%(len(private_keys),len(addresses)))) self.show_privkeys_signal.connect(show_privkeys) + d.finished.connect(on_dialog_closed) threading.Thread(target=privkeys_thread).start() if not d.exec_(): From 2df0d7cec54d3ff4012f27cc2c5f42a978457208 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Fri, 12 Jan 2018 04:03:43 +0100 Subject: [PATCH 2/2] ledger: handle pin-locked state better --- plugins/ledger/ledger.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/plugins/ledger/ledger.py b/plugins/ledger/ledger.py index 62ba23394..2d1a593c4 100644 --- a/plugins/ledger/ledger.py +++ b/plugins/ledger/ledger.py @@ -60,6 +60,21 @@ class Ledger_Client(): def versiontuple(self, v): return tuple(map(int, (v.split(".")))) + 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() # bip32_path is of the form 44'/0'/1' @@ -80,7 +95,7 @@ class Ledger_Client(): if len(splitPath) > 1: prevPath = "/".join(splitPath[0:len(splitPath) - 1]) nodeData = self.dongleObject.getWalletPublicKey(prevPath) - publicKey = compress_public_key(nodeData['publicKey'])# + publicKey = compress_public_key(nodeData['publicKey']) h = hashlib.new('ripemd160') h.update(hashlib.sha256(publicKey).digest()) fingerprint = unpack(">I", h.digest()[0:4])[0]