From 8ce1e6453b0557b1c6224009b3c419dc6b48b6f7 Mon Sep 17 00:00:00 2001 From: Sander van Grieken Date: Wed, 21 Feb 2024 14:19:52 +0100 Subject: [PATCH] wizard: skip/hide passphrase option for 'old' and '2fa' seeds (see #4326) --- .../gui/qml/components/wizard/WCHaveSeed.qml | 44 +++++++++++-------- electrum/gui/qml/qewizard.py | 5 ++- electrum/gui/qt/wizard/wallet.py | 6 ++- electrum/wizard.py | 5 ++- 4 files changed, 36 insertions(+), 24 deletions(-) diff --git a/electrum/gui/qml/components/wizard/WCHaveSeed.qml b/electrum/gui/qml/components/wizard/WCHaveSeed.qml index 9f1b322e3..68e2ff768 100644 --- a/electrum/gui/qml/components/wizard/WCHaveSeed.qml +++ b/electrum/gui/qml/components/wizard/WCHaveSeed.qml @@ -20,20 +20,23 @@ WizardComponent { property string _seedType property string _validationMessage + property bool _canPassphrase + property bool _seedValid function apply() { + var seed_extend = extendcb.checked && _canPassphrase if (cosigner) { wizard_data['multisig_cosigner_data'][cosigner.toString()]['seed'] = seedtext.text wizard_data['multisig_cosigner_data'][cosigner.toString()]['seed_variant'] = seed_variant_cb.currentValue wizard_data['multisig_cosigner_data'][cosigner.toString()]['seed_type'] = _seedType - wizard_data['multisig_cosigner_data'][cosigner.toString()]['seed_extend'] = extendcb.checked - wizard_data['multisig_cosigner_data'][cosigner.toString()]['seed_extra_words'] = extendcb.checked ? customwordstext.text : '' + wizard_data['multisig_cosigner_data'][cosigner.toString()]['seed_extend'] = seed_extend + wizard_data['multisig_cosigner_data'][cosigner.toString()]['seed_extra_words'] = seed_extend ? customwordstext.text : '' } else { wizard_data['seed'] = seedtext.text wizard_data['seed_variant'] = seed_variant_cb.currentValue wizard_data['seed_type'] = _seedType - wizard_data['seed_extend'] = extendcb.checked - wizard_data['seed_extra_words'] = extendcb.checked ? customwordstext.text : '' + wizard_data['seed_extend'] = seed_extend + wizard_data['seed_extra_words'] = seed_extend ? customwordstext.text : '' // determine script type from electrum seed type // (used to limit script type options for bip39 cosigners) @@ -69,19 +72,16 @@ WizardComponent { function checkValid() { valid = false - _validationMessage = '' - - if (extendcb.checked && customwordstext.text == '') - return + _seedValid = false var verifyResult = wiz.verifySeed(seedtext.text, seed_variant_cb.currentValue, wizard_data['wallet_type']) _validationMessage = verifyResult.message _seedType = verifyResult.type + _canPassphrase = verifyResult.can_passphrase if (!cosigner || !verifyResult.valid) { - valid = verifyResult.valid - return + _seedValid = verifyResult.valid } else { // bip39 validate after derivation path is known if (seed_variant_cb.currentValue == 'electrum') { @@ -93,12 +93,19 @@ WizardComponent { validationtext.text = qsTr('Error: master public key types do not match') return } else { - valid = true + _seedValid = true } } else { - valid = true + _seedValid = true } } + + if (_canPassphrase && extendcb.checked && customwordstext.text == '') { + valid = false + return + } + + valid = _seedValid } Flickable { @@ -202,16 +209,14 @@ WizardComponent { placeholderText: cosigner ? qsTr('Enter cosigner seed') : qsTr('Enter your seed') - indicatorValid: root.valid + indicatorValid: root._seedValid ? root._seedType == 'bip39' && root._validationMessage ? false - : root.valid - : root.valid - indicatorText: root.valid - ? root._validationMessage + : root._seedValid + : root._seedValid + indicatorText: root._validationMessage ? root._validationMessage : root._seedType - : '' onTextChanged: { startValidationTimer() } @@ -221,13 +226,14 @@ WizardComponent { id: extendcb Layout.columnSpan: 2 Layout.fillWidth: true + visible: _canPassphrase text: qsTr('Extend seed with custom words') onCheckedChanged: startValidationTimer() } TextField { id: customwordstext - visible: extendcb.checked + visible: extendcb.checked && extendcb.visible Layout.fillWidth: true Layout.columnSpan: 2 placeholderText: qsTr('Enter your custom word(s)') diff --git a/electrum/gui/qml/qewizard.py b/electrum/gui/qml/qewizard.py index c35709c02..b49d56349 100644 --- a/electrum/gui/qml/qewizard.py +++ b/electrum/gui/qml/qewizard.py @@ -111,11 +111,12 @@ class QENewWalletWizard(NewWalletWizard, QEAbstractWizard): @pyqtSlot(str, str, str, result='QVariantMap') def verifySeed(self, seed, seed_variant, wallet_type='standard'): - seed_valid, seed_type, validation_message = self.validate_seed(seed, seed_variant, wallet_type) + seed_valid, seed_type, validation_message, can_passphrase = self.validate_seed(seed, seed_variant, wallet_type) return { 'valid': seed_valid, 'type': seed_type, - 'message': validation_message + 'message': validation_message, + 'can_passphrase': can_passphrase } def _wallet_path_from_wallet_name(self, wallet_name: str) -> str: diff --git a/electrum/gui/qt/wizard/wallet.py b/electrum/gui/qt/wizard/wallet.py index 7bcc7bdae..8b283dfa2 100644 --- a/electrum/gui/qt/wizard/wallet.py +++ b/electrum/gui/qt/wizard/wallet.py @@ -612,6 +612,8 @@ class WCHaveSeed(WalletWizardComponent, Logger): self.next_button = Hack() + self.can_passphrase = True + def on_ready(self): options = ['ext'] if self.wizard_data['wallet_type'] == '2fa' else ['ext', 'bip39', 'slip39'] self.slayout = SeedLayout( @@ -640,7 +642,7 @@ class WCHaveSeed(WalletWizardComponent, Logger): seed = self.slayout.get_seed() seed_variant = self.slayout.seed_type wallet_type = self.wizard_data['wallet_type'] - seed_valid, seed_type, validation_message = self.wizard.validate_seed(seed, seed_variant, wallet_type) # + seed_valid, seed_type, validation_message, self.can_passphrase = self.wizard.validate_seed(seed, seed_variant, wallet_type) is_cosigner = self.wizard_data['wallet_type'] == 'multisig' and 'multisig_current_cosigner' in self.wizard_data @@ -664,7 +666,7 @@ class WCHaveSeed(WalletWizardComponent, Logger): cosigner_data['seed_type'] = mnemonic.seed_type(self.slayout.get_seed()) else: cosigner_data['seed_type'] = self.slayout.seed_type - cosigner_data['seed_extend'] = self.slayout.is_ext + cosigner_data['seed_extend'] = self.slayout.is_ext if self.can_passphrase else False cosigner_data['seed_extra_words'] = '' # empty default diff --git a/electrum/wizard.py b/electrum/wizard.py index 077ea2470..f9293b77e 100644 --- a/electrum/wizard.py +++ b/electrum/wizard.py @@ -486,11 +486,14 @@ class NewWalletWizard(AbstractWizard): seed_type = '' seed_valid = False validation_message = '' + can_passphrase = True if seed_variant == 'electrum': seed_type = mnemonic.seed_type(seed) if seed_type != '': seed_valid = True + if seed_type in ['old', '2fa']: + can_passphrase = False elif seed_variant == 'bip39': is_checksum, is_wordlist = keystore.bip39_is_checksum_valid(seed) validation_message = ('' if is_checksum else _('BIP39 checksum failed')) if is_wordlist else _('Unknown BIP39 wordlist') @@ -520,7 +523,7 @@ class NewWalletWizard(AbstractWizard): self._logger.debug(f'seed verified: {seed_valid}, type={seed_type}, validation_message={validation_message}') - return seed_valid, seed_type, validation_message + return seed_valid, seed_type, validation_message, can_passphrase def create_storage(self, path: str, data: dict): assert data['wallet_type'] in ['standard', '2fa', 'imported', 'multisig']