def passphrase_dialog(self, msg, confirm): # If confirm is true, require the user to enter the passphrase twice parent = self.top_level_window() d = WindowModalDialog(parent, _("Enter Passphrase")) if confirm: OK_button = OkButton(d) playout = PasswordLayout(msg=msg, kind=PW_PASSPHRASE, OK_button=OK_button) vbox = QtWidgets.QVBoxLayout() vbox.addLayout(playout.layout()) vbox.addLayout(Buttons(CancelButton(d), OK_button)) d.setLayout(vbox) passphrase = playout.new_password() if d.exec_() else None else: pw = PasswordLineEdit() pw.setMinimumWidth(200) vbox = QtWidgets.QVBoxLayout() vbox.addWidget(WWLabel(msg)) vbox.addWidget(pw) vbox.addLayout(Buttons(CancelButton(d), OkButton(d))) d.setLayout(vbox) passphrase = pw.text() if d.exec_() else None self.passphrase = passphrase self.done.set()
def reset_seed_dialog(self, msg): print_error("In reset_seed_dialog") parent = self.top_level_window() d = WindowModalDialog(parent, _("Enter PIN")) pw = PasswordLineEdit() pw.setMinimumWidth(200) vbox = QtWidgets.QVBoxLayout() vbox.addWidget(WWLabel(msg)) vbox.addWidget(pw) vbox.addLayout(Buttons(CancelButton(d), OkButton(d))) d.setLayout(vbox) passphrase = pw.text() if d.exec_() else None return passphrase
def __init__(self, parent=None, msg=None): msg = msg or _('Please enter your password') WindowModalDialog.__init__(self, parent, _("Enter Password")) self.pw = pw = PasswordLineEdit() vbox = QtWidgets.QVBoxLayout() vbox.addWidget(QtWidgets.QLabel(msg)) grid = QtWidgets.QGridLayout() grid.setSpacing(8) grid.addWidget(QtWidgets.QLabel(_('Password')), 1, 0) grid.addWidget(pw, 1, 1) vbox.addLayout(grid) vbox.addLayout(Buttons(CancelButton(self), OkButton(self))) self.setLayout(vbox) run_hook('password_dialog', pw, grid, 1)
def __init__(self, handler, data): '''Ask user for 2nd factor authentication. Support text and security card methods. Use last method from settings, but support downgrade. ''' QtWidgets.QDialog.__init__(self, handler.top_level_window()) self.handler = handler self.txdata = data self.idxs = self.txdata[ 'keycardData'] if self.txdata['confirmationType'] > 1 else '' self.setMinimumWidth(1000) self.setWindowTitle(_("Ledger Wallet Authentication")) self.cfg = copy.deepcopy(self.handler.win.wallet.get_keystore().cfg) self.dongle = self.handler.win.wallet.get_keystore().get_client( ).dongle self.pin = '' self.devmode = self.getDevice2FAMode() if self.devmode == 0x11 or self.txdata['confirmationType'] == 1: self.cfg['mode'] = 0 vbox = QtWidgets.QVBoxLayout() self.setLayout(vbox) def on_change_mode(idx): self.cfg[ 'mode'] = 0 if self.devmode == 0x11 else idx if idx > 0 else 1 if self.cfg['mode'] > 0: self.handler.win.wallet.get_keystore().cfg = self.cfg self.handler.win.wallet.save_keystore() self.update_dlg() def return_pin(): self.pin = self.pintxt.text( ) if self.txdata['confirmationType'] == 1 else self.cardtxt.text() if self.cfg['mode'] == 1: self.pin = ''.join(chr(int(str(i), 16)) for i in self.pin) self.accept() self.modebox = QtWidgets.QWidget() modelayout = QtWidgets.QHBoxLayout() self.modebox.setLayout(modelayout) modelayout.addWidget(QtWidgets.QLabel(_("Method:"))) self.modes = QtWidgets.QComboBox() modelayout.addWidget(self.modes, 2) modelayout.addStretch(1) self.modebox.setMaximumHeight(50) vbox.addWidget(self.modebox) self.populate_modes() self.modes.currentIndexChanged.connect(on_change_mode) self.helpmsg = QtWidgets.QTextEdit() self.helpmsg.setStyleSheet( "QTextEdit { background-color: lightgray; }") self.helpmsg.setReadOnly(True) vbox.addWidget(self.helpmsg) self.pinbox = QtWidgets.QWidget() pinlayout = QtWidgets.QHBoxLayout() self.pinbox.setLayout(pinlayout) self.pintxt = PasswordLineEdit() self.pintxt.setMaxLength(4) self.pintxt.returnPressed.connect(return_pin) pinlayout.addWidget(QtWidgets.QLabel(_("Enter PIN:"))) pinlayout.addWidget(self.pintxt) pinlayout.addWidget(QtWidgets.QLabel(_("NOT DEVICE PIN - see above"))) pinlayout.addStretch(1) self.pinbox.setVisible(self.cfg['mode'] == 0) vbox.addWidget(self.pinbox) self.cardbox = QtWidgets.QWidget() card = QtWidgets.QVBoxLayout() self.cardbox.setLayout(card) self.addrtext = QtWidgets.QTextEdit() self.addrtext.setStyleSheet( "QTextEdit { color:blue; background-color:lightgray; padding:15px 10px; border:none; font-size:20pt; }" ) self.addrtext.setReadOnly(True) self.addrtext.setMaximumHeight(120) card.addWidget(self.addrtext) def pin_changed(s): if len(s) < len(self.idxs): i = self.idxs[len(s)] address = self.txdata['address'] # Always generate the mainnet address as the code is generated from mainnet address addressstr = address.to_string(Address.FMT_LEGACY, net=networks.MainNet) addressstr = addressstr[:i] + '<u><b>' + addressstr[ i:i + 1] + '</u></b>' + addressstr[i + 1:] # We also show the UI address if it is different if networks.net.TESTNET or not Address.FMT_UI == Address.FMT_LEGACY: addressstr = address.to_ui_string() + '\n' + addressstr self.addrtext.setHtml(str(addressstr)) else: self.addrtext.setHtml(_("Press Enter")) pin_changed('') cardpin = QtWidgets.QHBoxLayout() cardpin.addWidget(QtWidgets.QLabel(_("Enter PIN:"))) self.cardtxt = PasswordLineEdit() self.cardtxt.setMaxLength(len(self.idxs)) self.cardtxt.textChanged.connect(pin_changed) self.cardtxt.returnPressed.connect(return_pin) cardpin.addWidget(self.cardtxt) cardpin.addWidget(QtWidgets.QLabel(_("NOT DEVICE PIN - see above"))) cardpin.addStretch(1) card.addLayout(cardpin) self.cardbox.setVisible(self.cfg['mode'] == 1) vbox.addWidget(self.cardbox) self.update_dlg()
def __init__( self, msg, kind, OK_button, wallet=None, *, permit_empty: bool = True, force_disable_encrypt_cb: bool = False, ): self.wallet = wallet self.permit_empty = bool(permit_empty) self.pw = PasswordLineEdit() self.new_pw = PasswordLineEdit() self.conf_pw = PasswordLineEdit() self.kind = kind self.OK_button = OK_button self.all_lineedits = ( self.pw, self.new_pw, self.conf_pw ) self.pw_strength = None # Will be a QLabel if kind != PW_PASSPHRASE vbox = QtWidgets.QVBoxLayout() label = QtWidgets.QLabel(msg + "\n") label.setWordWrap(True) grid = QtWidgets.QGridLayout() grid.setSpacing(8) grid.setColumnStretch(1, 1) if kind == PW_PASSPHRASE: vbox.addWidget(label) msgs = [_('Passphrase:'), _('Confirm Passphrase:')] else: logo_grid = QtWidgets.QGridLayout() logo_grid.setSpacing(8) logo_grid.setColumnMinimumWidth(0, 70) logo_grid.setColumnStretch(1,1) logo = QtWidgets.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:'******'Password:'******'Confirm Password:'******'Current Password:'******'Show')) f = self.show_cb.font(); f.setPointSize(f.pointSize()-1); self.show_cb.setFont(f) # make font -1 grid.addWidget(self.show_cb, 3, 2, Qt.AlignRight) def toggle_show_pws(): show = self.show_cb.isChecked() for le in self.all_lineedits: le.setEchoMode(QtWidgets.QLineEdit.Password if not show else QtWidgets.QLineEdit.Normal) self.show_cb.toggled.connect(toggle_show_pws) self.encrypt_cb = QtWidgets.QCheckBox(_('Encrypt wallet file')) self.encrypt_cb.setEnabled(False) grid.addWidget(self.encrypt_cb, 4, 0, 1, -1) self.encrypt_cb.setVisible(kind != PW_PASSPHRASE) def enable_OK(): ok = bool(self.new_pw.text() == self.conf_pw.text() and (self.new_pw.text() or self.permit_empty)) OK_button.setEnabled(ok) self.encrypt_cb.setEnabled(ok and bool(self.new_pw.text()) and not force_disable_encrypt_cb) self.new_pw.textChanged.connect(enable_OK) self.conf_pw.textChanged.connect(enable_OK) if not self.permit_empty: enable_OK() # force buttons to OFF state initially. self.vbox = vbox
class PasswordLayout: titles = [_("Enter Password"), _("Change Password"), _("Enter Passphrase")] def __init__( self, msg, kind, OK_button, wallet=None, *, permit_empty: bool = True, force_disable_encrypt_cb: bool = False, ): self.wallet = wallet self.permit_empty = bool(permit_empty) self.pw = PasswordLineEdit() self.new_pw = PasswordLineEdit() self.conf_pw = PasswordLineEdit() self.kind = kind self.OK_button = OK_button self.all_lineedits = ( self.pw, self.new_pw, self.conf_pw ) self.pw_strength = None # Will be a QLabel if kind != PW_PASSPHRASE vbox = QtWidgets.QVBoxLayout() label = QtWidgets.QLabel(msg + "\n") label.setWordWrap(True) grid = QtWidgets.QGridLayout() grid.setSpacing(8) grid.setColumnStretch(1, 1) if kind == PW_PASSPHRASE: vbox.addWidget(label) msgs = [_('Passphrase:'), _('Confirm Passphrase:')] else: logo_grid = QtWidgets.QGridLayout() logo_grid.setSpacing(8) logo_grid.setColumnMinimumWidth(0, 70) logo_grid.setColumnStretch(1,1) logo = QtWidgets.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:'******'Password:'******'Confirm Password:'******'Current Password:'******'Show')) f = self.show_cb.font(); f.setPointSize(f.pointSize()-1); self.show_cb.setFont(f) # make font -1 grid.addWidget(self.show_cb, 3, 2, Qt.AlignRight) def toggle_show_pws(): show = self.show_cb.isChecked() for le in self.all_lineedits: le.setEchoMode(QtWidgets.QLineEdit.Password if not show else QtWidgets.QLineEdit.Normal) self.show_cb.toggled.connect(toggle_show_pws) self.encrypt_cb = QtWidgets.QCheckBox(_('Encrypt wallet file')) self.encrypt_cb.setEnabled(False) grid.addWidget(self.encrypt_cb, 4, 0, 1, -1) self.encrypt_cb.setVisible(kind != PW_PASSPHRASE) def enable_OK(): ok = bool(self.new_pw.text() == self.conf_pw.text() and (self.new_pw.text() or self.permit_empty)) OK_button.setEnabled(ok) self.encrypt_cb.setEnabled(ok and bool(self.new_pw.text()) and not force_disable_encrypt_cb) self.new_pw.textChanged.connect(enable_OK) self.conf_pw.textChanged.connect(enable_OK) if not self.permit_empty: enable_OK() # force buttons to OFF state initially. self.vbox = vbox def title(self): return self.titles[self.kind] def layout(self): return self.vbox def pw_changed(self): if not self.pw_strength: return password = self.new_pw.text() if password: colors = {"Weak":"Red", "Medium":"Blue", "Strong":"Green", "Very Strong":"Green"} strength = check_password_strength(password) label = (_("Password Strength") + ": " + "<font color=" + colors[strength] + ">" + strength + "</font>") else: label = "" self.pw_strength.setText(label) def old_password(self): if self.kind == PW_CHANGE: return self.pw.text() or None return None def new_password(self): pw = self.new_pw.text() # Empty passphrases are fine and returned empty. if pw == "" and self.kind != PW_PASSPHRASE: pw = None return pw
def passphrase_dialog(self, msg, confirm): # If confirm is true, require the user to enter the passphrase twice parent = self.top_level_window() d = WindowModalDialog(parent, _('Enter Passphrase')) OK_button = OkButton(d, _('Enter Passphrase')) OnDevice_button = QtWidgets.QPushButton(_('Enter Passphrase on Device')) new_pw = PasswordLineEdit() conf_pw = PasswordLineEdit() vbox = QtWidgets.QVBoxLayout() label = QtWidgets.QLabel(msg + "\n") label.setWordWrap(True) grid = QtWidgets.QGridLayout() grid.setSpacing(8) grid.setColumnMinimumWidth(0, 150) grid.setColumnMinimumWidth(1, 100) grid.setColumnStretch(1,1) vbox.addWidget(label) grid.addWidget(QtWidgets.QLabel(_('Passphrase:')), 0, 0) grid.addWidget(new_pw, 0, 1) if confirm: grid.addWidget(QtWidgets.QLabel(_('Confirm Passphrase:')), 1, 0) grid.addWidget(conf_pw, 1, 1) vbox.addLayout(grid) def enable_OK(): if not confirm: ok = True else: ok = new_pw.text() == conf_pw.text() OK_button.setEnabled(ok) new_pw.textChanged.connect(enable_OK) conf_pw.textChanged.connect(enable_OK) vbox.addWidget(OK_button) if self.passphrase_on_device: vbox.addWidget(OnDevice_button) d.setLayout(vbox) self.passphrase = None def ok_clicked(): self.passphrase = new_pw.text() def on_device_clicked(): self.passphrase = PASSPHRASE_ON_DEVICE OK_button.clicked.connect(ok_clicked) OnDevice_button.clicked.connect(on_device_clicked) OnDevice_button.clicked.connect(d.accept) d.exec_() self.done.set()