Browse Source

hww: move trigger_pairings to DeviceMgr

patch-4
SomberNight 3 years ago
parent
commit
745e697188
No known key found for this signature in database GPG Key ID: B33B5F232C6271E9
  1. 54
      electrum/plugin.py
  2. 22
      electrum/plugins/hw_wallet/qt.py

54
electrum/plugin.py

@ -43,7 +43,7 @@ from .logging import get_logger, Logger
if TYPE_CHECKING:
from .plugins.hw_wallet import HW_PluginBase, HardwareClientBase, HardwareHandlerBase
from .keystore import Hardware_KeyStore
from .keystore import Hardware_KeyStore, KeyStore
from .wallet import Abstract_Wallet
@ -776,3 +776,55 @@ class DeviceMgr(ThreadJob):
except ImportError:
ret["hidapi.version"] = None
return ret
def trigger_pairings(
self,
keystores: Sequence['KeyStore'],
*,
allow_user_interaction: bool = True,
devices: Sequence['Device'] = None,
) -> None:
"""Given a list of keystores, try to pair each with a connected hardware device.
E.g. for a multisig-wallet, it is more user-friendly to use this method than to
try to pair each keystore individually. Consider the following scenario:
- three hw keystores in a 2-of-3 multisig wallet, devices d2 (for ks2) and d3 (for ks3) are connected
- assume none of the devices are paired yet
1. if we tried to individually pair keystores, we might try with ks1 first
- but ks1 cannot be paired automatically, as neither d2 nor d3 matches the stored fingerprint
- the user might then be prompted if they want to manually pair ks1 with either d2 or d3,
which is confusing and error-prone. It's especially problematic if the hw device does
not support labels (such as Ledger), as then the user cannot easily distinguish
same-type devices. (see #4199)
2. instead, if using this method, we would auto-pair ks2-d2 and ks3-d3 first,
and then tell the user ks1 could not be paired (and there are no devices left to try)
"""
from .keystore import Hardware_KeyStore
keystores = [ks for ks in keystores if isinstance(ks, Hardware_KeyStore)]
if not keystores:
return
if devices is None:
devices = self.scan_devices()
# first pair with all devices that can be auto-selected
for ks in keystores:
try:
ks.plugin.get_client(
keystore=ks,
force_pair=True,
allow_user_interaction=False,
devices=devices,
)
except UserCancelled:
pass
if allow_user_interaction:
# now do manual selections
for ks in keystores:
try:
ks.plugin.get_client(
keystore=ks,
force_pair=True,
allow_user_interaction=True,
devices=devices,
)
except UserCancelled:
pass

22
electrum/plugins/hw_wallet/qt.py

@ -227,28 +227,8 @@ class QtPluginBase(object):
keystore.thread = TaskThread(window, on_error=partial(self.on_task_thread_error, window, keystore))
self.add_show_address_on_hw_device_button_for_receive_addr(wallet, keystore, window)
# Trigger pairings
def trigger_pairings():
devmgr = self.device_manager()
devices = devmgr.scan_devices()
# first pair with all devices that can be auto-selected
for keystore in relevant_keystores:
try:
self.get_client(keystore=keystore,
force_pair=True,
allow_user_interaction=False,
devices=devices)
except UserCancelled:
pass
# now do manual selections
for keystore in relevant_keystores:
try:
self.get_client(keystore=keystore,
force_pair=True,
allow_user_interaction=True,
devices=devices)
except UserCancelled:
pass
trigger_pairings = partial(devmgr.trigger_pairings, relevant_keystores, allow_user_interaction=True)
some_keystore = relevant_keystores[0]
some_keystore.thread.add(trigger_pairings)

Loading…
Cancel
Save