electrum

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

commit 8c3920a0db10d5519bc2435a5354c13aadb5ed1c
parent 1546d65ebe97aaf968936421fb2ed997b1de71e1
Author: SomberNight <somber.night@protonmail.com>
Date:   Thu,  6 Dec 2018 18:16:34 +0100

hw: check_libraries_available now gets version of incompatible libs

previously we would return early and the user would
just see "missing libraries"

Diffstat:
Melectrum/plugins/coldcard/coldcard.py | 11++++++++---
Melectrum/plugins/hw_wallet/plugin.py | 29+++++++++++++++++------------
Melectrum/plugins/trezor/trezor.py | 14+++++++++-----
3 files changed, 34 insertions(+), 20 deletions(-)

diff --git a/electrum/plugins/coldcard/coldcard.py b/electrum/plugins/coldcard/coldcard.py @@ -17,6 +17,7 @@ from electrum.util import print_error, bfh, bh2u, versiontuple, UserFacingExcept from electrum.base_wizard import ScriptTypeNotSupported from ..hw_wallet import HW_PluginBase +from ..hw_wallet.plugin import LibraryFoundButUnusable try: import hid @@ -610,7 +611,7 @@ class ColdcardPlugin(HW_PluginBase): def __init__(self, parent, config, name): HW_PluginBase.__init__(self, parent, config, name) - self.libraries_available = self.check_libraries_available() and requirements_ok + self.libraries_available = self.check_libraries_available() if not self.libraries_available: return @@ -620,9 +621,13 @@ class ColdcardPlugin(HW_PluginBase): def get_library_version(self): import ckcc try: - return ckcc.__version__ + version = ckcc.__version__ except AttributeError: - return 'unknown' + version = 'unknown' + if requirements_ok: + return version + else: + raise LibraryFoundButUnusable(library_version=version) def detect_simulator(self): # if there is a simulator running on this machine, diff --git a/electrum/plugins/hw_wallet/plugin.py b/electrum/plugins/hw_wallet/plugin.py @@ -86,6 +86,7 @@ class HW_PluginBase(BasePlugin): Returns 'unknown' if library is found but cannot determine version. Raises 'ImportError' if library is not found. + Raises 'LibraryFoundButUnusable' if found but there was some problem (includes version num). """ raise NotImplementedError() @@ -94,23 +95,22 @@ class HW_PluginBase(BasePlugin): return ".".join(str(i) for i in t) try: + # this might raise ImportError or LibraryFoundButUnusable library_version = self.get_library_version() + # if no exception so far, we might still raise LibraryFoundButUnusable + if (library_version == 'unknown' + or versiontuple(library_version) < self.minimum_library + or hasattr(self, "maximum_library") and versiontuple(library_version) >= self.maximum_library): + raise LibraryFoundButUnusable(library_version=library_version) except ImportError: return False - if library_version == 'unknown' or \ - versiontuple(library_version) < self.minimum_library: - self.libraries_available_message = ( - _("Library version for '{}' is too old.").format(self.name) - + '\nInstalled: {}, Needed: {}' - .format(library_version, version_str(self.minimum_library))) - self.print_stderr(self.libraries_available_message) - return False - elif hasattr(self, "maximum_library") and \ - versiontuple(library_version) >= self.maximum_library: + except LibraryFoundButUnusable as e: + library_version = e.library_version + max_version_str = version_str(self.maximum_library) if hasattr(self, "maximum_library") else "inf" self.libraries_available_message = ( _("Library version for '{}' is incompatible.").format(self.name) - + '\nInstalled: {}, Needed: less than {}' - .format(library_version, version_str(self.maximum_library))) + + '\nInstalled: {}, Needed: {} <= x < {}' + .format(library_version, version_str(self.minimum_library), max_version_str)) self.print_stderr(self.libraries_available_message) return False @@ -155,3 +155,8 @@ def only_hook_if_libraries_available(func): if not self.libraries_available: return None return func(self, *args, **kwargs) return wrapper + + +class LibraryFoundButUnusable(Exception): + def __init__(self, library_version='unknown'): + self.library_version = library_version diff --git a/electrum/plugins/trezor/trezor.py b/electrum/plugins/trezor/trezor.py @@ -12,7 +12,8 @@ from electrum.keystore import Hardware_KeyStore, is_xpubkey, parse_xpubkey from electrum.base_wizard import ScriptTypeNotSupported, HWD_SETUP_NEW_WALLET from ..hw_wallet import HW_PluginBase -from ..hw_wallet.plugin import is_any_tx_output_on_change_branch, trezor_validate_op_return_output_and_get_data +from ..hw_wallet.plugin import (is_any_tx_output_on_change_branch, trezor_validate_op_return_output_and_get_data, + LibraryFoundButUnusable) try: import trezorlib @@ -112,12 +113,15 @@ class TrezorPlugin(HW_PluginBase): self.device_manager().register_enumerate_func(self.enumerate) def get_library_version(self): - if not TREZORLIB: - raise ImportError + import trezorlib try: - return trezorlib.__version__ + version = trezorlib.__version__ except Exception: - return 'unknown' + version = 'unknown' + if TREZORLIB: + return version + else: + raise LibraryFoundButUnusable(library_version=version) def enumerate(self): devices = trezorlib.transport.enumerate_devices()