electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit 1821d9ebc67ae1aec679e5af759541c15ace1740
parent 42ed4bc3d6132f65d0028c8b5be11a9b0c48c36c
Author: ThomasV <thomasv@electrum.org>
Date:   Mon,  5 Feb 2018 09:05:20 +0100

Merge pull request #3842 from SomberNight/ledger_3508

attempt at fixing ledger 'read error'
Diffstat:
Mlib/base_wizard.py | 9+++++++++
Mlib/plugins.py | 13+++++++++----
Mplugins/ledger/ledger.py | 4++++
3 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/lib/base_wizard.py b/lib/base_wizard.py @@ -234,6 +234,15 @@ class BaseWizard(object): self.plugin = self.plugins.get_plugin(name) try: self.plugin.setup_device(device_info, self, purpose) + except OSError as e: + self.show_error(_('We encountered an error while connecting to your device:') + + '\n' + str(e) + '\n' + + _('To try to fix this, we will now re-pair with your device.') + '\n' + + _('Please try again.')) + devmgr = self.plugins.device_manager + devmgr.unpair_id(device_info.device.id_) + self.choose_hw_device(purpose) + return except BaseException as e: self.show_error(str(e)) self.choose_hw_device(purpose) diff --git a/lib/plugins.py b/lib/plugins.py @@ -362,15 +362,20 @@ class DeviceMgr(ThreadJob, PrintError): if not xpub in self.xpub_ids: return _id = self.xpub_ids.pop(xpub) - client = self.client_lookup(_id) - self.clients.pop(client, None) - if client: - client.close() + self._close_client(_id) def unpair_id(self, id_): xpub = self.xpub_by_id(id_) if xpub: self.unpair_xpub(xpub) + else: + self._close_client(id_) + + def _close_client(self, id_): + client = self.client_lookup(id_) + self.clients.pop(client, None) + if client: + client.close() def pair_xpub(self, xpub, id_): with self.lock: diff --git a/plugins/ledger/ledger.py b/plugins/ledger/ledger.py @@ -172,6 +172,10 @@ class Ledger_Client(): raise Exception("Dongle is temporarily locked - please unplug it and replug it again") if ((e.sw & 0xFFF0) == 0x63c0): raise Exception("Invalid PIN - please unplug the dongle and plug it again before retrying") + if e.sw == 0x6f00 and e.message == 'Invalid channel': + # based on docs 0x6f00 might be a more general error, hence we also compare message to be sure + raise Exception("Invalid channel.\n" + "Please make sure that 'Browser support' is disabled on your device.") raise e def checkDevice(self):