diff --git a/electrum/daemon.py b/electrum/daemon.py index 96ac2cf7d..f6efa490e 100644 --- a/electrum/daemon.py +++ b/electrum/daemon.py @@ -623,13 +623,18 @@ class Daemon(Logger): if not wallet.storage.is_encrypted(): is_unified = False try: - wallet.check_password(old_password) + try: + wallet.check_password(old_password) + old_password_real = old_password + except util.InvalidPassword: + wallet.check_password(None) + old_password_real = None except Exception: failed.append(path) continue if new_password: self.logger.info(f'updating password for wallet: {path!r}') - wallet.update_password(old_password, new_password, encrypt_storage=True) + wallet.update_password(old_password_real, new_password, encrypt_storage=True) can_be_unified = failed == [] is_unified = can_be_unified and is_unified return can_be_unified, is_unified diff --git a/electrum/storage.py b/electrum/storage.py index fbf7cbe70..2eecc7eb0 100644 --- a/electrum/storage.py +++ b/electrum/storage.py @@ -29,6 +29,7 @@ import hashlib import base64 import zlib from enum import IntEnum +from typing import Optional from . import ecc from .util import (profiler, InvalidPassword, WalletFileException, bfh, standardize_path, @@ -186,9 +187,11 @@ class WalletStorage(Logger): s = s.decode('utf8') return s - def check_password(self, password) -> None: + def check_password(self, password: Optional[str]) -> None: """Raises an InvalidPassword exception on invalid password""" if not self.is_encrypted(): + if password is not None: + raise InvalidPassword("password given but wallet has no password") return if not self.is_past_initial_decryption(): self.decrypt(password) # this sets self.pubkey diff --git a/electrum/wallet.py b/electrum/wallet.py index b0c9f6813..9d7d68925 100644 --- a/electrum/wallet.py +++ b/electrum/wallet.py @@ -2682,7 +2682,12 @@ class Abstract_Wallet(ABC, Logger, EventListener): def may_have_password(cls): return True - def check_password(self, password): + def check_password(self, password: Optional[str]) -> None: + """Raises an InvalidPassword exception on invalid password""" + if not self.has_password(): + if password is not None: + raise InvalidPassword("password given but wallet has no password") + return if self.has_keystore_encryption(): self.keystore.check_password(password) if self.has_storage_encryption():