wizard: handle UserFacingException in WCWalletPasswordHardware
Handles `UserFacingException` in the `WCWalletPasswordHardware` step of the hardware wallet wizard flow. This fixes the previous FIXME and prevents the crash reporter from getting triggered if the the user e.g. disconnects his hardware wallet during the wallet encryption step.
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user