tfix #4082 - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit afa4cbfcbb8e552d1bc59147b5b109a0f6c08599 DIR parent 71dff2a06e3d462a2833d50002c32b2103dd0a7c HTML Author: SomberNight <somber.night@protonmail.com> Date: Thu, 15 Mar 2018 18:34:30 +0100 fix #4082 Diffstat: M lib/plugins.py | 2 +- M plugins/trezor/trezor.py | 42 ++++++++++++++++++++++++++++--- 2 files changed, 39 insertions(+), 5 deletions(-) --- DIR diff --git a/lib/plugins.py b/lib/plugins.py t@@ -466,7 +466,7 @@ class DeviceMgr(ThreadJob, PrintError): devices = [dev for dev in devices if not self.xpub_by_id(dev.id_)] infos = [] for device in devices: - if not device.product_key in plugin.DEVICE_IDS: + if device.product_key not in plugin.DEVICE_IDS: continue client = self.create_client(device, handler, plugin) if not client: DIR diff --git a/plugins/trezor/trezor.py b/plugins/trezor/trezor.py t@@ -126,7 +126,11 @@ class TrezorPlugin(HW_PluginBase): self.device_manager().register_enumerate_func(self.enumerate) - def enumerate(self): + @staticmethod + def _all_transports(): + """Reimplemented trezorlib.transport.all_transports for old trezorlib. + Remove this when we start to require trezorlib 0.9.2 + """ try: from trezorlib.transport import all_transports except ImportError: t@@ -154,9 +158,14 @@ class TrezorPlugin(HW_PluginBase): except BaseException: pass return transports + return all_transports() + def _enumerate_devices(self): + """Just like trezorlib.transport.enumerate_devices, + but with exception catching, so that transports can fail separately. + """ devices = [] - for transport in all_transports(): + for transport in self._all_transports(): try: new_devices = transport.enumerate() except BaseException as e: t@@ -164,14 +173,39 @@ class TrezorPlugin(HW_PluginBase): .format(transport.__name__, str(e))) else: devices.extend(new_devices) + return devices + def enumerate(self): + devices = self._enumerate_devices() return [Device(d.get_path(), -1, d.get_path(), 'TREZOR', 0) for d in devices] + def _get_transport(self, path=None): + """Reimplemented trezorlib.transport.get_transport for old trezorlib. + Remove this when we start to require trezorlib 0.9.2 + """ + try: + from trezorlib.transport import get_transport + except ImportError: + # compat for trezorlib < 0.9.2 + def get_transport(path=None, prefix_search=False): + if path is None: + try: + return self._enumerate_devices()[0] + except IndexError: + raise Exception("No TREZOR device found") from None + + def match_prefix(a, b): + return a.startswith(b) or b.startswith(a) + transports = [t for t in self._all_transports() if match_prefix(path, t.PATH_PREFIX)] + if transports: + return transports[0].find_by_path(path) + raise Exception("Unknown path prefix '%s'" % path) + return get_transport(path) + def create_client(self, device, handler): - from trezorlib.device import TrezorDevice try: self.print_error("connecting to device at", device.path) - transport = TrezorDevice.find_by_path(device.path) + transport = self._get_transport(device.path) except BaseException as e: self.print_error("cannot connect at", device.path, str(e)) return None