From d8bcca3ccb31b2c038285d43de39709c9c058927 Mon Sep 17 00:00:00 2001 From: matejcik Date: Thu, 9 Apr 2020 14:41:56 +0200 Subject: [PATCH] support trezorlib 0.12 --- agents/trezor/setup.py | 4 +--- libagent/device/trezor.py | 11 +++++++---- libagent/device/trezor_defs.py | 4 ++-- libagent/device/ui.py | 25 ++++++++++++++++++------- 4 files changed, 28 insertions(+), 16 deletions(-) diff --git a/agents/trezor/setup.py b/agents/trezor/setup.py index 62cbb34..2939d4e 100644 --- a/agents/trezor/setup.py +++ b/agents/trezor/setup.py @@ -11,7 +11,7 @@ setup( scripts=['trezor_agent.py'], install_requires=[ 'libagent>=0.13.0', - 'trezor[hidapi]>=0.11.0' + 'trezor[hidapi]>=0.12.0,<0.13' ], platforms=['POSIX'], classifiers=[ @@ -22,8 +22,6 @@ setup( 'Intended Audience :: System Administrators', 'License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)', 'Operating System :: POSIX', - 'Programming Language :: Python :: 2.7', - 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'Topic :: Software Development :: Libraries :: Python Modules', diff --git a/libagent/device/trezor.py b/libagent/device/trezor.py index 5d30685..d629974 100644 --- a/libagent/device/trezor.py +++ b/libagent/device/trezor.py @@ -26,7 +26,7 @@ class Trezor(interface.Device): required_version = '>=1.4.0' ui = None # can be overridden by device's users - cached_state = None + cached_session_id = None def _verify_version(self, connection): f = connection.features @@ -54,11 +54,14 @@ class Trezor(interface.Device): for _ in range(5): # Retry a few times in case of PIN failures connection = self._defs.Client(transport=transport, ui=self.ui, - state=self.__class__.cached_state) + session_id=self.__class__.cached_session_id) self._verify_version(connection) try: - connection.ping(msg='', pin_protection=True) # unlock PIN + # unlock PIN and passphrase + self._defs.get_address(connection, + "Testnet", + self._defs.PASSPHRASE_TEST_PATH) return connection except (self._defs.PinException, ValueError) as e: log.error('Invalid PIN: %s, retrying...', e) @@ -70,7 +73,7 @@ class Trezor(interface.Device): def close(self): """Close connection.""" - self.__class__.cached_state = self.conn.state + self.__class__.cached_session_id = self.conn.session_id super().close() def pubkey(self, identity, ecdh=False): diff --git a/libagent/device/trezor_defs.py b/libagent/device/trezor_defs.py index cd59367..916c869 100644 --- a/libagent/device/trezor_defs.py +++ b/libagent/device/trezor_defs.py @@ -8,12 +8,12 @@ import mnemonic import semver import trezorlib -from trezorlib.client import TrezorClient as Client +from trezorlib.client import TrezorClient as Client, PASSPHRASE_TEST_PATH from trezorlib.exceptions import TrezorFailure, PinException from trezorlib.transport import get_transport from trezorlib.messages import IdentityType -from trezorlib.btc import get_public_node +from trezorlib.btc import get_address, get_public_node from trezorlib.misc import sign_identity, get_ecdh_session_key log = logging.getLogger(__name__) diff --git a/libagent/device/ui.py b/libagent/device/ui.py index fd069d6..0536037 100644 --- a/libagent/device/ui.py +++ b/libagent/device/ui.py @@ -4,6 +4,11 @@ import logging import os import subprocess +try: + from trezorlib.client import PASSPHRASE_ON_DEVICE +except Exception: + PASSPHRASE_ON_DEVICE = object() + from .. import util log = logging.getLogger(__name__) @@ -40,18 +45,24 @@ class UI: binary=self.pin_entry_binary, options=self.options_getter()) - def get_passphrase(self, prompt='Passphrase:'): + def get_passphrase(self, prompt='Passphrase:', available_on_device=False): """Ask the user for passphrase.""" passphrase = None if self.cached_passphrase_ack: passphrase = self.cached_passphrase_ack.get() if passphrase is None: - passphrase = interact( - title='{} passphrase'.format(self.device_name), - prompt=prompt, - description=None, - binary=self.passphrase_entry_binary, - options=self.options_getter()) + env_passphrase = os.environ.get("TREZOR_PASSPHRASE") + if env_passphrase is not None: + passphrase = env_passphrase + elif available_on_device: + passphrase = PASSPHRASE_ON_DEVICE + else: + passphrase = interact( + title='{} passphrase'.format(self.device_name), + prompt=prompt, + description=None, + binary=self.passphrase_entry_binary, + options=self.options_getter()) if self.cached_passphrase_ack: self.cached_passphrase_ack.set(passphrase) return passphrase