URI: 
       tMerge branch 'master' of github.com:spesmilo/electrum - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 322d1bd1d0debe15e5ea06efc9e8e532eab21e6d
   DIR parent 4a40b3a0b2522e6adad58631eba4f57341907d44
  HTML Author: ThomasV <thomasv@electrum.org>
       Date:   Fri, 12 Jan 2018 10:37:32 +0100
       
       Merge branch 'master' of github.com:spesmilo/electrum
       
       Diffstat:
         M gui/qt/main_window.py               |      19 ++++++++++++++++---
         M plugins/ledger/ledger.py            |      17 ++++++++++++++++-
       
       2 files changed, 32 insertions(+), 4 deletions(-)
       ---
   DIR diff --git a/gui/qt/main_window.py b/gui/qt/main_window.py
       t@@ -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_():
   DIR diff --git a/plugins/ledger/ledger.py b/plugins/ledger/ledger.py
       t@@ -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'
       t@@ -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]