Browse Source

hww: show model name in device enum lists (e.g. "Trezor T")

hard-fail-on-bad-server-string
SomberNight 5 years ago
parent
commit
db1ff4915f
No known key found for this signature in database GPG Key ID: B33B5F232C6271E9
  1. 2
      electrum/base_wizard.py
  2. 9
      electrum/plugin.py
  3. 6
      electrum/plugins/hw_wallet/plugin.py
  4. 22
      electrum/plugins/ledger/ledger.py
  5. 8
      electrum/plugins/trezor/clientbase.py

2
electrum/base_wizard.py

@ -336,7 +336,7 @@ class BaseWizard(Logger):
label = info.label or _("An unnamed {}").format(name) label = info.label or _("An unnamed {}").format(name)
try: transport_str = info.device.transport_ui_string[:20] try: transport_str = info.device.transport_ui_string[:20]
except: transport_str = 'unknown transport' except: transport_str = 'unknown transport'
descr = f"{label} [{name}, {state}, {transport_str}]" descr = f"{label} [{info.model_name or name}, {state}, {transport_str}]"
choices.append(((name, info), descr)) choices.append(((name, info), descr))
msg = _('Select a device') + ':' msg = _('Select a device') + ':'
self.choice_dialog(title=title, message=msg, choices=choices, self.choice_dialog(title=title, message=msg, choices=choices,

9
electrum/plugin.py

@ -308,6 +308,7 @@ class DeviceInfo(NamedTuple):
exception: Optional[Exception] = None exception: Optional[Exception] = None
plugin_name: Optional[str] = None # manufacturer, e.g. "trezor" plugin_name: Optional[str] = None # manufacturer, e.g. "trezor"
soft_device_id: Optional[str] = None # if available, used to distinguish same-type hw devices soft_device_id: Optional[str] = None # if available, used to distinguish same-type hw devices
model_name: Optional[str] = None # e.g. "Ledger Nano S"
class HardwarePluginToScan(NamedTuple): class HardwarePluginToScan(NamedTuple):
@ -560,7 +561,8 @@ class DeviceMgr(ThreadJob):
label=client.label(), label=client.label(),
initialized=client.is_initialized(), initialized=client.is_initialized(),
plugin_name=plugin.name, plugin_name=plugin.name,
soft_device_id=client.get_soft_device_id())) soft_device_id=client.get_soft_device_id(),
model_name=client.device_model_name()))
return infos return infos
@ -613,10 +615,11 @@ class DeviceMgr(ThreadJob):
raise CannotAutoSelectDevice() raise CannotAutoSelectDevice()
# ask user to select device manually # ask user to select device manually
msg = _("Please select which {} device to use:").format(plugin.device) msg = _("Please select which {} device to use:").format(plugin.device)
descriptions = ["{label} ({init}, {transport})" descriptions = ["{label} ({maybe_model}{init}, {transport})"
.format(label=info.label or _("An unnamed {}").format(info.plugin_name), .format(label=info.label or _("An unnamed {}").format(info.plugin_name),
init=(_("initialized") if info.initialized else _("wiped")), init=(_("initialized") if info.initialized else _("wiped")),
transport=info.device.transport_ui_string) transport=info.device.transport_ui_string,
maybe_model=f"{info.model_name}, " if info.model_name else "")
for info in infos] for info in infos]
c = handler.query_choice(msg, descriptions) c = handler.query_choice(msg, descriptions)
if c is None: if c is None:

6
electrum/plugins/hw_wallet/plugin.py

@ -228,6 +228,12 @@ class HardwareClientBase:
password = Xpub.get_pubkey_from_xpub(xpub, ()).hex() password = Xpub.get_pubkey_from_xpub(xpub, ()).hex()
return password return password
def device_model_name(self) -> Optional[str]:
"""Return the name of the model of this device, which might be displayed in the UI.
E.g. for Trezor, "Trezor One" or "Trezor T".
"""
return None
class HardwareHandlerBase: class HardwareHandlerBase:
"""An interface between the GUI and the device handling logic for handling I/O.""" """An interface between the GUI and the device handling logic for handling I/O."""

22
electrum/plugins/ledger/ledger.py

@ -2,7 +2,7 @@ from struct import pack, unpack
import hashlib import hashlib
import sys import sys
import traceback import traceback
from typing import Optional from typing import Optional, Tuple
from electrum import ecc from electrum import ecc
from electrum import bip32 from electrum import bip32
@ -62,10 +62,10 @@ def test_pin_unlocked(func):
class Ledger_Client(HardwareClientBase): class Ledger_Client(HardwareClientBase):
def __init__(self, hidDevice, *, is_hw1: bool = False): def __init__(self, hidDevice, *, product_key: Tuple[int, int]):
self.dongleObject = btchip(hidDevice) self.dongleObject = btchip(hidDevice)
self.preflightDone = False self.preflightDone = False
self._is_hw1 = is_hw1 self._product_key = product_key
self._soft_device_id = None self._soft_device_id = None
def is_pairable(self): def is_pairable(self):
@ -92,7 +92,18 @@ class Ledger_Client(HardwareClientBase):
return self._soft_device_id return self._soft_device_id
def is_hw1(self) -> bool: def is_hw1(self) -> bool:
return self._is_hw1 return self._product_key[0] == 0x2581
def device_model_name(self):
if self.is_hw1():
return "Ledger HW.1"
if self._product_key == (0x2c97, 0x0000):
return "Ledger Blue"
if self._product_key == (0x2c97, 0x0001):
return "Ledger Nano S"
if self._product_key == (0x2c97, 0x0004):
return "Ledger Nano X"
return None
def has_usable_connection_with_device(self): def has_usable_connection_with_device(self):
try: try:
@ -594,8 +605,7 @@ class LedgerPlugin(HW_PluginBase):
client = self.get_btchip_device(device) client = self.get_btchip_device(device)
if client is not None: if client is not None:
is_hw1 = device.product_key[0] == 0x2581 client = Ledger_Client(client, product_key=device.product_key)
client = Ledger_Client(client, is_hw1=is_hw1)
return client return client
def setup_device(self, device_info, wizard, purpose): def setup_device(self, device_info, wizard, purpose):

8
electrum/plugins/trezor/clientbase.py

@ -196,6 +196,14 @@ class TrezorClientBase(HardwareClientBase, Logger):
"""Returns '1' for Trezor One, 'T' for Trezor T.""" """Returns '1' for Trezor One, 'T' for Trezor T."""
return self.features.model return self.features.model
def device_model_name(self):
model = self.get_trezor_model()
if model == '1':
return "Trezor One"
elif model == 'T':
return "Trezor T"
return None
def show_address(self, address_str, script_type, multisig=None): def show_address(self, address_str, script_type, multisig=None):
coin_name = self.plugin.get_coin_name() coin_name = self.plugin.get_coin_name()
address_n = parse_path(address_str) address_n = parse_path(address_str)

Loading…
Cancel
Save