diff --git a/electrum/gui/qt/wizard/wallet.py b/electrum/gui/qt/wizard/wallet.py index 6d0926b6e..8397b7ba3 100644 --- a/electrum/gui/qt/wizard/wallet.py +++ b/electrum/gui/qt/wizard/wallet.py @@ -1275,19 +1275,40 @@ class WCWalletPasswordHardware(WalletWizardComponent): self.layout().addLayout(self.playout.layout()) self.layout().addStretch(1) - self._valid = True + self._hw_password = None # type: Optional[str] + self._valid = False + + def on_ready(self): + _name, info = self.wizard_data['hardware_device'] + device_id = info.device.id_ + client = self.plugins.device_manager.client_by_id(device_id, scan_now=False) + if client is None: + self.valid = False + self.error = _("Client for hardware device was unpaired.") + return + + def retrieve_password_task(): + try: + self._hw_password = client.get_password_for_storage_encryption() + self.valid = True + except UserFacingException as e: + self.error = str(e) + self.valid = False + finally: + self.busy = False + + self.busy = True + t = threading.Thread(target=retrieve_password_task, daemon=True) + t.start() def apply(self): + if not self.valid: + return self.wizard_data['encrypt'] = True if self.playout.should_encrypt_storage_with_xpub(): self.wizard_data['xpub_encrypt'] = True - _name, _info = self.wizard_data['hardware_device'] - device_id = _info.device.id_ - client = self.plugins.device_manager.client_by_id(device_id, scan_now=False) - # client.handler = self.plugin.create_handler(self.wizard) - # FIXME client can be None if it was recently disconnected. - # also, even if not None, this might raise (e.g. if it disconnected *just now*): - self.wizard_data['password'] = client.get_password_for_storage_encryption() + assert self._hw_password + self.wizard_data['password'] = self._hw_password else: self.wizard_data['xpub_encrypt'] = False self.wizard_data['password'] = self.playout.new_password()