Browse Source

qml wizard: "confirm seed" screen to normalize whitespaces

fixes https://github.com/spesmilo/electrum/issues/8442
master
SomberNight 3 years ago
parent
commit
e9475345e4
No known key found for this signature in database
GPG Key ID: B33B5F232C6271E9
  1. 6
      electrum/base_wizard.py
  2. 2
      electrum/gui/qml/components/wizard/WCConfirmSeed.qml
  3. 6
      electrum/gui/qml/qewizard.py
  4. 10
      electrum/mnemonic.py
  5. 22
      electrum/tests/test_mnemonic.py

6
electrum/base_wizard.py

@ -719,7 +719,11 @@ class BaseWizard(Logger):
def confirm_seed(self, seed, passphrase):
f = lambda x: self.confirm_passphrase(seed, passphrase)
self.confirm_seed_dialog(run_next=f, seed=seed if self.config.get('debug_seed') else '', test=lambda x: x==seed)
self.confirm_seed_dialog(
run_next=f,
seed=seed if self.config.get('debug_seed') else '',
test=lambda x: mnemonic.is_matching_seed(seed=seed, seed_again=x),
)
def confirm_passphrase(self, seed, passphrase):
f = lambda x: self.run('create_keystore', seed, x)

2
electrum/gui/qml/components/wizard/WCConfirmSeed.qml

@ -13,7 +13,7 @@ WizardComponent {
valid: false
function checkValid() {
var seedvalid = confirm.text == wizard_data['seed']
var seedvalid = wizard.wiz.isMatchingSeed(wizard_data['seed'], confirm.text)
var customwordsvalid = customwordstext.text == wizard_data['seed_extra_words']
valid = seedvalid && (wizard_data['seed_extend'] ? customwordsvalid : true)
}

6
electrum/gui/qml/qewizard.py

@ -4,8 +4,10 @@ from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject
from PyQt5.QtQml import QQmlApplicationEngine
from electrum.logging import get_logger
from electrum import mnemonic
from electrum.wizard import NewWalletWizard, ServerConnectWizard
class QEAbstractWizard(QObject):
_logger = get_logger(__name__)
@ -93,6 +95,10 @@ class QENewWalletWizard(NewWalletWizard, QEAbstractWizard):
data = js_data.toVariant()
return self.has_heterogeneous_masterkeys(data)
@pyqtSlot(str, str, result=bool)
def isMatchingSeed(self, seed, seed_again):
return mnemonic.is_matching_seed(seed=seed, seed_again=seed_again)
@pyqtSlot('QJSValue', bool, str)
def createStorage(self, js_data, single_password_enabled, single_password):
self._logger.info('Creating wallet from wizard data')

10
electrum/mnemonic.py

@ -90,6 +90,16 @@ def normalize_text(seed: str) -> str:
return seed
def is_matching_seed(*, seed: str, seed_again: str) -> bool:
"""Compare two seeds for equality, as used in "confirm seed" screen in wizard.
Not just for electrum seeds, but other types (e.g. bip39) as well.
Note: we don't use normalize_text, as that is specific to electrum seeds.
"""
seed = " ".join(seed.split())
seed_again = " ".join(seed_again.split())
return seed == seed_again
_WORDLIST_CACHE = {} # type: Dict[str, Wordlist]

22
electrum/tests/test_mnemonic.py

@ -7,7 +7,7 @@ from electrum import mnemonic
from electrum import slip39
from electrum import old_mnemonic
from electrum.util import bfh
from electrum.mnemonic import is_new_seed, is_old_seed, seed_type
from electrum.mnemonic import is_new_seed, is_old_seed, seed_type, is_matching_seed
from electrum.version import SEED_PREFIX_SW, SEED_PREFIX
from . import ElectrumTestCase
@ -193,6 +193,26 @@ class Test_seeds(ElectrumTestCase):
with self.subTest(msg=f"seed_type_subcase_{idx}", seed_words=seed_words):
self.assertEqual(_type, seed_type(seed_words), msg=seed_words)
def test_is_matching_seed(self):
self.assertTrue(is_matching_seed(seed="9dk", seed_again="9dk "))
self.assertTrue(is_matching_seed(seed="9dk", seed_again=" 9dk"))
self.assertTrue(is_matching_seed(seed="9dk", seed_again=" 9dk "))
self.assertTrue(is_matching_seed(seed="when blade focus", seed_again="when blade focus "))
self.assertTrue(is_matching_seed(seed="when blade focus", seed_again=" when blade focus "))
self.assertTrue(is_matching_seed(seed=" when blade focus ", seed_again=" when blade focus "))
self.assertTrue(is_matching_seed(
seed=" when blade focus ",
seed_again=
""" when blade
focus """))
self.assertFalse(is_matching_seed(seed="when blade focus", seed_again="wen blade focus"))
self.assertFalse(is_matching_seed(seed="when blade focus", seed_again="when bladefocus"))
self.assertFalse(is_matching_seed(seed="when blade focus", seed_again="when blAde focus"))
self.assertFalse(is_matching_seed(seed="when blade focus", seed_again="when bl4de focus"))
self.assertFalse(is_matching_seed(seed="when blade focus", seed_again="when bla4de focus"))
class Test_slip39(ElectrumTestCase):
""" Test SLIP39 test vectors. """

Loading…
Cancel
Save