1
0

plugins: ledger: better error msg for hw.1

This commit is contained in:
SomberNight
2025-03-18 17:24:23 +00:00
parent 154adf0081
commit 4c970fd8fa
2 changed files with 41 additions and 6 deletions

View File

@@ -269,6 +269,35 @@ class HardwareClientBase(ABC):
return self.plugin.name
class HardwareClientDummy(HardwareClientBase):
"""Hw device we recognize but do not support.
E.g. for Ledger HW.1 devices that we used to support in the past, but no longer do.
This allows showing an error message to the user.
"""
def __init__(self, *, plugin: 'HW_PluginBase', error_text: str):
HardwareClientBase.__init__(self, plugin=plugin)
self.error_text = error_text
def get_xpub(self, bip32_path: str, xtype) -> str:
raise Exception(self.error_text)
def is_pairable(self) -> bool:
return False
def close(self):
pass
def is_initialized(self) -> bool:
"""True if initialized, False if wiped."""
return True
def label(self) -> Optional[str]:
return "dummy_client"
def has_usable_connection_with_device(self) -> bool:
return True
class HardwareHandlerBase:
"""An interface between the GUI and the device handling logic for handling I/O."""
win = None

View File

@@ -4,7 +4,7 @@
from abc import ABC, abstractmethod
import base64
import hashlib
from typing import Dict, List, Optional, Sequence, Tuple, TYPE_CHECKING
from typing import Dict, List, Optional, Sequence, Tuple, TYPE_CHECKING, Union
import electrum_ecc as ecc
@@ -23,6 +23,7 @@ from electrum.wallet import Standard_Wallet
from ..hw_wallet import HardwareClientBase, HW_PluginBase
from ..hw_wallet.plugin import is_any_tx_output_on_change_branch, validate_op_return_output, LibraryFoundButUnusable
from ..hw_wallet.plugin import HardwareClientDummy
if TYPE_CHECKING:
from electrum.plugin import DeviceInfo
@@ -306,10 +307,15 @@ class Ledger_Client(HardwareClientBase, ABC):
is_legacy: bool
@staticmethod
def construct_new(*args, device: Device, **kwargs) -> 'Ledger_Client':
def construct_new(
*args, device: Device, plugin: 'LedgerPlugin', **kwargs,
) -> Union['Ledger_Client', HardwareClientDummy]:
"""The 'real' constructor, that automatically decides which subclass to use."""
if LedgerPlugin.is_hw1(device.product_key):
raise Exception("ledger hw.1 devices are no longer supported")
return HardwareClientDummy(
plugin=plugin,
error_text="ledger hw.1 devices are no longer supported",
)
# for nano S or newer hw, decide which client impl to use based on software/firmware version:
hid_device = HID()
hid_device.path = device.path
@@ -328,10 +334,10 @@ class Ledger_Client(HardwareClientBase, ABC):
cl = None
if isinstance(cl, ledger_bitcoin.client.NewClient):
_logger.debug(f"Ledger_Client.construct_new(). creating NewClient for {device=}.")
return Ledger_Client_New(hid_device, *args, **kwargs)
return Ledger_Client_New(hid_device, *args, plugin=plugin, **kwargs)
else:
_logger.debug(f"Ledger_Client.construct_new(). creating LegacyClient for {device=}.")
return Ledger_Client_Legacy(hid_device, *args, **kwargs)
return Ledger_Client_Legacy(hid_device, *args, plugin=plugin, **kwargs)
def __init__(self, *, plugin: HW_PluginBase):
HardwareClientBase.__init__(self, plugin=plugin)
@@ -1311,7 +1317,7 @@ class LedgerPlugin(HW_PluginBase):
return device
@runs_in_hwd_thread
def create_client(self, device, handler) -> Optional[Ledger_Client]:
def create_client(self, device, handler) -> Union[Ledger_Client, None, HardwareClientDummy]:
try:
return Ledger_Client.construct_new(device=device, product_key=device.product_key, plugin=self)
except Exception as e: