Browse Source

Merge branch 'master' of github.com:spesmilo/electrum

master
ThomasV 8 years ago
parent
commit
322d1bd1d0
  1. 19
      gui/qt/main_window.py
  2. 17
      plugins/ledger/ledger.py

19
gui/qt/main_window.py

@ -2269,25 +2269,38 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
private_keys = {} private_keys = {}
addresses = self.wallet.get_addresses() addresses = self.wallet.get_addresses()
done = False done = False
cancelled = False
def privkeys_thread(): def privkeys_thread():
for addr in addresses: for addr in addresses:
time.sleep(0.1) time.sleep(0.1)
if done: if done or cancelled:
break break
privkey = self.wallet.export_private_key(addr, password)[0] privkey = self.wallet.export_private_key(addr, password)[0]
private_keys[addr] = privkey private_keys[addr] = privkey
self.computing_privkeys_signal.emit() self.computing_privkeys_signal.emit()
self.computing_privkeys_signal.disconnect() if not cancelled:
self.show_privkeys_signal.emit() self.computing_privkeys_signal.disconnect()
self.show_privkeys_signal.emit()
def show_privkeys(): def show_privkeys():
s = "\n".join( map( lambda x: x[0] + "\t"+ x[1], private_keys.items())) s = "\n".join( map( lambda x: x[0] + "\t"+ x[1], private_keys.items()))
e.setText(s) e.setText(s)
b.setEnabled(True) b.setEnabled(True)
self.show_privkeys_signal.disconnect() 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.computing_privkeys_signal.connect(lambda: e.setText("Please wait... %d/%d"%(len(private_keys),len(addresses))))
self.show_privkeys_signal.connect(show_privkeys) self.show_privkeys_signal.connect(show_privkeys)
d.finished.connect(on_dialog_closed)
threading.Thread(target=privkeys_thread).start() threading.Thread(target=privkeys_thread).start()
if not d.exec_(): if not d.exec_():

17
plugins/ledger/ledger.py

@ -60,6 +60,21 @@ class Ledger_Client():
def versiontuple(self, v): def versiontuple(self, v):
return tuple(map(int, (v.split(".")))) 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): def get_xpub(self, bip32_path, xtype):
self.checkDevice() self.checkDevice()
# bip32_path is of the form 44'/0'/1' # bip32_path is of the form 44'/0'/1'
@ -80,7 +95,7 @@ class Ledger_Client():
if len(splitPath) > 1: if len(splitPath) > 1:
prevPath = "/".join(splitPath[0:len(splitPath) - 1]) prevPath = "/".join(splitPath[0:len(splitPath) - 1])
nodeData = self.dongleObject.getWalletPublicKey(prevPath) nodeData = self.dongleObject.getWalletPublicKey(prevPath)
publicKey = compress_public_key(nodeData['publicKey'])# publicKey = compress_public_key(nodeData['publicKey'])
h = hashlib.new('ripemd160') h = hashlib.new('ripemd160')
h.update(hashlib.sha256(publicKey).digest()) h.update(hashlib.sha256(publicKey).digest())
fingerprint = unpack(">I", h.digest()[0:4])[0] fingerprint = unpack(">I", h.digest()[0:4])[0]

Loading…
Cancel
Save