1
0

daemon: load_wallet: add force_check_password arg, and use it in qml

- fix: qml gui errors when trying to open a wallets with only keystore-encryption
  - fixes https://github.com/spesmilo/electrum/issues/10171
- qml gui to prompt for password on wallet open even if wallet is not storage-encrypted
This commit is contained in:
SomberNight
2025-08-23 16:54:48 +00:00
parent 23a82f328f
commit 92bdc4d4ca
3 changed files with 105 additions and 11 deletions

View File

@@ -228,3 +228,79 @@ class TestCommandsWithDaemon(DaemonTestCase):
self.assertEqual(self.SEED, await cmds.getseed(wallet_path=wpath))
self.assertEqual(self.SEED, await cmds.getseed(wallet_path=basename))
self.assertEqual(self.SEED, await cmds.getseed(wallet=wallet))
class TestLoadWallet(DaemonTestCase):
async def test_simple_load(self):
path1 = self._restore_wallet_from_text("9dk", password=None)
wallet1 = self.daemon.load_wallet(path1, password=None)
await self.daemon._stop_wallet(path1)
async def test_password_checks_for_no_password(self):
real_password = None
path1 = self._restore_wallet_from_text("9dk", password=real_password)
# load_wallet will not validate the password arg unless needed for storage.decrypt():
wallet1 = self.daemon.load_wallet(path1, password="garbage")
await self.daemon._stop_wallet(path1)
# unless force_check_password is set:
with self.assertRaises(util.InvalidPassword):
wallet1 = self.daemon.load_wallet(path1, password="garbage", force_check_password=True)
wallet1 = self.daemon.load_wallet(path1, password=real_password)
await self.daemon._stop_wallet(path1)
wallet1 = self.daemon.load_wallet(path1, password=real_password, force_check_password=True)
await self.daemon._stop_wallet(path1)
# load_wallet will not validate the password arg if wallet is already loaded, unless force_check_password
wallet1 = self.daemon.load_wallet(path1, password=real_password)
wallet1 = self.daemon.load_wallet(path1, password="garbage")
with self.assertRaises(util.InvalidPassword):
wallet1 = self.daemon.load_wallet(path1, password="garbage", force_check_password=True)
async def test_password_checks_for_ks_enc(self):
real_password = "1234"
path1 = self._restore_wallet_from_text("9dk", password=real_password, encrypt_file=False)
# load_wallet will not validate the password arg unless needed for storage.decrypt():
wallet1 = self.daemon.load_wallet(path1, password="garbage")
await self.daemon._stop_wallet(path1)
# unless force_check_password is set:
with self.assertRaises(util.InvalidPassword):
wallet1 = self.daemon.load_wallet(path1, password="garbage", force_check_password=True)
wallet1 = self.daemon.load_wallet(path1, password=real_password)
await self.daemon._stop_wallet(path1)
wallet1 = self.daemon.load_wallet(path1, password=real_password, force_check_password=True)
await self.daemon._stop_wallet(path1)
# load_wallet will not validate the password arg if wallet is already loaded, unless force_check_password
wallet1 = self.daemon.load_wallet(path1, password=real_password)
wallet1 = self.daemon.load_wallet(path1, password="garbage")
with self.assertRaises(util.InvalidPassword):
wallet1 = self.daemon.load_wallet(path1, password="garbage", force_check_password=True)
async def test_password_checks_for_sto_enc(self):
real_password = "1234"
path1 = self._restore_wallet_from_text("9dk", password=real_password, encrypt_file=True)
with self.assertRaises(util.InvalidPassword):
wallet1 = self.daemon.load_wallet(path1, password="garbage")
with self.assertRaises(util.InvalidPassword):
wallet1 = self.daemon.load_wallet(path1, password="garbage", force_check_password=True)
wallet1 = self.daemon.load_wallet(path1, password=real_password)
await self.daemon._stop_wallet(path1)
wallet1 = self.daemon.load_wallet(path1, password=real_password, force_check_password=True)
await self.daemon._stop_wallet(path1)
# load_wallet will not validate the password arg if wallet is already loaded, unless force_check_password
wallet1 = self.daemon.load_wallet(path1, password=real_password)
wallet1 = self.daemon.load_wallet(path1, password="garbage")
with self.assertRaises(util.InvalidPassword):
wallet1 = self.daemon.load_wallet(path1, password="garbage", force_check_password=True)