1
0

trezor: more user friendly when cannot connect

Tell the user and ask if they want to try again.  If they
say no, raise a silent exception.  Apply this more friendly
behaviour to the install wizard too (see issue #1668).
This commit is contained in:
Neil Booth
2016-02-06 19:51:39 +09:00
parent 317e6cea32
commit 16397b1ed7
9 changed files with 51 additions and 44 deletions

View File

@@ -26,7 +26,7 @@ import time
from util import *
from i18n import _
from util import profiler, PrintError, DaemonThread
from util import profiler, PrintError, DaemonThread, UserCancelled
import wallet
class Plugins(DaemonThread):
@@ -386,26 +386,20 @@ class DeviceMgr(PrintError):
# The wallet has not been previously paired, so let the user
# choose an unpaired device and compare its first address.
info = self.select_device(wallet, plugin, devices)
if info:
client = self.client_lookup(info.device.id_)
if client and client.is_pairable():
# See comment above for same code
client.handler = wallet.handler
# This will trigger a PIN/passphrase entry request
client_first_address = client.first_address(derivation)
if client_first_address == first_address:
self.pair_wallet(wallet, info.device.id_)
return client
if info and client:
# The user input has wrong PIN or passphrase
raise DeviceUnpairableError(
_('Unable to pair with your %s.') % plugin.device)
client = self.client_lookup(info.device.id_)
if client and client.is_pairable():
# See comment above for same code
client.handler = wallet.handler
# This will trigger a PIN/passphrase entry request
client_first_address = client.first_address(derivation)
if client_first_address == first_address:
self.pair_wallet(wallet, info.device.id_)
return client
raise DeviceNotFoundError(
_('Could not connect to your %s. Verify the cable is '
'connected and that no other application is using it.')
% plugin.device)
# The user input has wrong PIN or passphrase, or it is not pairable
raise DeviceUnpairableError(
_('Unable to pair with your %s.') % plugin.device)
def unpaired_device_infos(self, handler, plugin, devices=None):
'''Returns a list of DeviceInfo objects: one for each connected,
@@ -432,9 +426,17 @@ class DeviceMgr(PrintError):
def select_device(self, wallet, plugin, devices=None):
'''Ask the user to select a device to use if there is more than one,
and return the DeviceInfo for the device.'''
infos = self.unpaired_device_infos(wallet.handler, plugin, devices)
if not infos:
return None
while True:
infos = self.unpaired_device_infos(wallet.handler, plugin, devices)
if infos:
break
msg = _('Could not connect to your %s. Verify the cable is '
'connected and that no other application is using it.\n\n'
'Try to connect again?') % plugin.device
if not wallet.handler.yes_no_question(msg):
raise UserCancelled()
devices = None
if len(infos) == 1:
return infos[0]
msg = _("Please select which %s device to use:") % plugin.device