|
|
@ -383,8 +383,18 @@ class DeviceMgr(ThreadJob, PrintError): |
|
|
|
self.scan_devices() |
|
|
|
return self.client_lookup(id_) |
|
|
|
|
|
|
|
def client_for_xpub(self, plugin, xpub, derivation, handler, force_pair): |
|
|
|
devices = self.scan_devices() |
|
|
|
def client_for_keystore(self, plugin, keystore, force_pair): |
|
|
|
with self.lock: |
|
|
|
devices = self.scan_devices() |
|
|
|
xpub = keystore.xpub |
|
|
|
derivation = keystore.get_derivation() |
|
|
|
handler = keystore.handler |
|
|
|
client = self.client_by_xpub(plugin, xpub, handler, devices) |
|
|
|
if client is None and force_pair: |
|
|
|
info = self.select_device(handler, plugin, keystore, devices) |
|
|
|
client = self.force_pair_xpub(plugin, handler, info, xpub, derivation, devices) |
|
|
|
|
|
|
|
def client_by_xpub(self, plugin, xpub, handler, devices): |
|
|
|
_id = self.xpub_id(xpub) |
|
|
|
client = self.client_lookup(_id) |
|
|
|
if client: |
|
|
@ -397,16 +407,11 @@ class DeviceMgr(ThreadJob, PrintError): |
|
|
|
if device.id_ == _id: |
|
|
|
return self.create_client(device, handler, plugin) |
|
|
|
|
|
|
|
if force_pair: |
|
|
|
return self.force_pair_xpub(plugin, handler, xpub, derivation, devices) |
|
|
|
|
|
|
|
return None |
|
|
|
|
|
|
|
def force_pair_xpub(self, plugin, handler, xpub, derivation, devices): |
|
|
|
def force_pair_xpub(self, plugin, handler, info, xpub, derivation, devices): |
|
|
|
# The wallet has not been previously paired, so let the user |
|
|
|
# choose an unpaired device and compare its first address. |
|
|
|
with self.lock: |
|
|
|
info = self.select_device(handler, plugin, devices) |
|
|
|
|
|
|
|
client = self.client_lookup(info.device.id_) |
|
|
|
if client and client.is_pairable(): |
|
|
|
# See comment above for same code |
|
|
@ -447,7 +452,7 @@ class DeviceMgr(ThreadJob, PrintError): |
|
|
|
|
|
|
|
return infos |
|
|
|
|
|
|
|
def select_device(self, handler, plugin, devices=None): |
|
|
|
def select_device(self, handler, plugin, keystore, devices=None): |
|
|
|
'''Ask the user to select a device to use if there is more than one, |
|
|
|
and return the DeviceInfo for the device.''' |
|
|
|
while True: |
|
|
@ -460,12 +465,17 @@ class DeviceMgr(ThreadJob, PrintError): |
|
|
|
if not handler.yes_no_question(msg): |
|
|
|
raise UserCancelled() |
|
|
|
devices = None |
|
|
|
|
|
|
|
if len(infos) == 1: |
|
|
|
return infos[0] |
|
|
|
# select device by label |
|
|
|
for info in infos: |
|
|
|
if info.label == keystore.label: |
|
|
|
return info |
|
|
|
msg = _("Please select which %s device to use:") % plugin.device |
|
|
|
descriptions = [info.label + ' (%s)'%(_("initialized") if info.initialized else _("wiped")) for info in infos] |
|
|
|
return infos[handler.query_choice(msg, descriptions)] |
|
|
|
info = infos[handler.query_choice(msg, descriptions)] |
|
|
|
# save new label |
|
|
|
keystore.set_label(info.label) |
|
|
|
keystore.handler.win.wallet.save_keystore() |
|
|
|
return info |
|
|
|
|
|
|
|
def scan_devices(self): |
|
|
|
# All currently supported hardware libraries use hid, so we |
|
|
|