1
0

wizard: it is better to use a separate screen for passphrase

This commit is contained in:
ThomasV
2016-08-30 09:51:53 +02:00
parent 19e62ba643
commit ebab390b1a
5 changed files with 133 additions and 112 deletions

View File

@@ -249,24 +249,23 @@ class InstallWizard(QDialog, MessageBoxMixin, BaseWizard):
self.set_main_layout(slayout.layout(), title, next_enabled=False)
return slayout.get_text()
def seed_input(self, title, message, is_seed, is_passphrase):
slayout = SeedInputLayout(self, message, is_seed, is_passphrase)
def seed_input(self, title, message, is_seed):
slayout = SeedInputLayout(self, message, is_seed)
vbox = QVBoxLayout()
vbox.addLayout(slayout.layout())
if self.opt_bip39:
vbox.addStretch(1)
vbox.addWidget(QLabel(_('Options') + ':'))
def f(b):
slayout.is_valid = (lambda x: bool(x)) if b else is_valid
slayout.set_enabled()
slayout.is_seed = (lambda x: bool(x)) if b else is_valid
slayout.on_edit()
cb_bip39 = QCheckBox(_('BIP39/BIP44 seed'))
cb_bip39.toggled.connect(f)
vbox.addWidget(cb_bip39)
self.set_main_layout(vbox, title, next_enabled=False)
seed = slayout.get_seed()
passphrase = slayout.get_passphrase()
is_bip39 = cb_bip39.isChecked() if self.opt_bip39 else False
return seed, passphrase, is_bip39
return seed, is_bip39
@wizard_dialog
def restore_keys_dialog(self, title, message, is_valid, run_next):
@@ -282,14 +281,13 @@ class InstallWizard(QDialog, MessageBoxMixin, BaseWizard):
return self.text_input(title, message, is_valid)
@wizard_dialog
def restore_seed_dialog(self, run_next, is_seed):
def restore_seed_dialog(self, run_next, test):
title = _('Enter Seed')
message = _('Please enter your seed phrase in order to restore your wallet.')
is_passphrase = lambda x: True
return self.seed_input(title, message, is_seed, is_passphrase)
return self.seed_input(title, message, test)
@wizard_dialog
def confirm_seed_dialog(self, run_next, is_seed, is_passphrase):
def confirm_seed_dialog(self, run_next, test):
self.app.clipboard().clear()
title = _('Confirm Seed')
message = ' '.join([
@@ -297,13 +295,14 @@ class InstallWizard(QDialog, MessageBoxMixin, BaseWizard):
_('If you lose your seed, your money will be permanently lost.'),
_('To make sure that you have properly saved your seed, please retype it here.')
])
return self.seed_input(title, message, is_seed, is_passphrase)
seed, is_bip39 = self.seed_input(title, message, test)
return seed
@wizard_dialog
def show_seed_dialog(self, run_next, seed_text):
slayout = CreateSeedLayout(seed_text)
self.set_main_layout(slayout.layout())
return seed_text, slayout.passphrase()
return seed_text
def pw_layout(self, msg, kind):
playout = PasswordLayout(None, msg, kind, self.next_button)
@@ -380,20 +379,17 @@ class InstallWizard(QDialog, MessageBoxMixin, BaseWizard):
return clayout.selected_index()
@wizard_dialog
def account_id_dialog(self, run_next):
message = '\n'.join([
_('Enter your account number here.'),
_('If you are not sure what this is, leave this field to zero.')
])
default = '0'
title = _('Account Number')
def line_dialog(self, run_next, title, message, default, test):
vbox = QVBoxLayout()
vbox.addWidget(WWLabel(message))
line = QLineEdit()
line.setText(default)
vbox = QVBoxLayout()
vbox.addWidget(QLabel(message))
def f(text):
self.next_button.setEnabled(test(text))
line.textEdited.connect(f)
vbox.addWidget(line)
self.set_main_layout(vbox, title)
return int(line.text())
self.set_main_layout(vbox, title, next_enabled=test(default))
return ' '.join(unicode(line.text()).split())
@wizard_dialog
def show_xpub_dialog(self, xpub, run_next):

View File

@@ -47,12 +47,12 @@ def check_password_strength(password):
return password_strength[min(3, int(score))]
PW_NEW, PW_CHANGE = range(0, 2)
PW_NEW, PW_CHANGE, PW_PASSPHRASE = range(0, 3)
class PasswordLayout(object):
titles = [_("Enter Password"), _("Change Password")]
titles = [_("Enter Password"), _("Change Password"), _("Enter Passphrase")]
def __init__(self, wallet, msg, kind, OK_button):
self.wallet = wallet
@@ -60,8 +60,8 @@ class PasswordLayout(object):
self.pw = QLineEdit()
self.pw.setEchoMode(2)
self.new_pw = QLineEdit()
self.conf_pw = QLineEdit()
self.new_pw.setEchoMode(2)
self.conf_pw = QLineEdit()
self.conf_pw.setEchoMode(2)
self.kind = kind
self.OK_button = OK_button
@@ -76,24 +76,31 @@ class PasswordLayout(object):
grid.setColumnMinimumWidth(1, 100)
grid.setColumnStretch(1,1)
logo_grid = QGridLayout()
logo_grid.setSpacing(8)
logo_grid.setColumnMinimumWidth(0, 70)
logo_grid.setColumnStretch(1,1)
logo = QLabel()
logo.setAlignment(Qt.AlignCenter)
logo_grid.addWidget(logo, 0, 0)
logo_grid.addWidget(label, 0, 1, 1, 2)
vbox.addLayout(logo_grid)
m1 = _('New Password:') if kind == PW_NEW else _('Password:')
msgs = [m1, _('Confirm Password:')]
if wallet and wallet.has_password():
grid.addWidget(QLabel(_('Current Password:')), 0, 0)
grid.addWidget(self.pw, 0, 1)
lockfile = ":icons/lock.png"
if kind == PW_PASSPHRASE:
vbox.addWidget(label)
msgs = [_('Passphrase:'), _('Confirm Passphrase:')]
else:
lockfile = ":icons/unlock.png"
logo.setPixmap(QPixmap(lockfile).scaledToWidth(36))
logo_grid = QGridLayout()
logo_grid.setSpacing(8)
logo_grid.setColumnMinimumWidth(0, 70)
logo_grid.setColumnStretch(1,1)
logo = QLabel()
logo.setAlignment(Qt.AlignCenter)
logo_grid.addWidget(logo, 0, 0)
logo_grid.addWidget(label, 0, 1, 1, 2)
vbox.addLayout(logo_grid)
m1 = _('New Password:') if kind == PW_NEW else _('Password:')
msgs = [m1, _('Confirm Password:')]
if wallet and wallet.has_password():
grid.addWidget(QLabel(_('Current Password:')), 0, 0)
grid.addWidget(self.pw, 0, 1)
lockfile = ":icons/lock.png"
else:
lockfile = ":icons/unlock.png"
logo.setPixmap(QPixmap(lockfile).scaledToWidth(36))
grid.addWidget(QLabel(msgs[0]), 1, 0)
grid.addWidget(self.new_pw, 1, 1)
@@ -103,9 +110,10 @@ class PasswordLayout(object):
vbox.addLayout(grid)
# Password Strength Label
self.pw_strength = QLabel()
grid.addWidget(self.pw_strength, 3, 0, 1, 2)
self.new_pw.textChanged.connect(self.pw_changed)
if kind != PW_PASSPHRASE:
self.pw_strength = QLabel()
grid.addWidget(self.pw_strength, 3, 0, 1, 2)
self.new_pw.textChanged.connect(self.pw_changed)
def enable_OK():
OK_button.setEnabled(self.new_pw.text() == self.conf_pw.text())
@@ -139,7 +147,8 @@ class PasswordLayout(object):
def new_password(self):
pw = unicode(self.new_pw.text())
if pw == "":
# Empty passphrases are fine and returned empty.
if pw == "" and self.kind != PW_PASSPHRASE:
pw = None
return pw

View File

@@ -95,29 +95,12 @@ class CreateSeedLayout(SeedLayoutBase):
def __init__(self, seed):
title = _("Your wallet generation seed is:")
tooltip = '\n'.join([
_('You may extend your seed with a passphrase.'),
_('Note tha this is NOT your encryption password.'),
_('If you do not know what it is, leave it empty.'),
])
vbox = QVBoxLayout()
vbox.addLayout(self._seed_layout(seed=seed, title=title))
self.passphrase_e = QLineEdit()
self.passphrase_e.setToolTip(tooltip)
hbox = QHBoxLayout()
hbox.addStretch()
label = QLabel(_('Passphrase') + ':')
label.setToolTip(tooltip)
hbox.addWidget(label)
hbox.addWidget(self.passphrase_e)
vbox.addLayout(hbox)
msg = seed_warning_msg(seed)
vbox.addWidget(WWLabel(msg))
self.layout_ = vbox
def passphrase(self):
return unicode(self.passphrase_e.text()).strip()
class TextInputLayout(SeedLayoutBase):
@@ -136,30 +119,19 @@ class TextInputLayout(SeedLayoutBase):
class SeedInputLayout(SeedLayoutBase):
def __init__(self, parent, title, is_seed, is_passphrase):
def __init__(self, parent, title, is_seed):
vbox = QVBoxLayout()
vbox.addLayout(self._seed_layout(title=title))
self.passphrase_e = QLineEdit()
hbox = QHBoxLayout()
hbox.addStretch()
hbox.addWidget(QLabel(_('Passphrase') + ':'))
hbox.addWidget(self.passphrase_e)
vbox.addLayout(hbox)
self.layout_ = vbox
self.parent = parent
self.is_seed = is_seed
self.is_passphrase = is_passphrase
self.seed_e.textChanged.connect(self.on_edit)
self.passphrase_e.textChanged.connect(self.on_edit)
def get_passphrase(self):
return unicode(self.passphrase_e.text()).strip()
def get_seed(self):
return clean_text(self.seed_edit())
def on_edit(self):
self.parent.next_button.setEnabled(self.is_seed(self.get_seed()) and self.is_passphrase(self.get_passphrase()))
self.parent.next_button.setEnabled(self.is_seed(self.get_seed()))