From fe540200a9873fd29f860fada537a290c9b26cae Mon Sep 17 00:00:00 2001 From: Sander van Grieken Date: Tue, 28 Feb 2023 14:04:20 +0100 Subject: [PATCH] qml: report wallet open problems when walletdb cannot open a wallet (WalletFileException) --- electrum/gui/qml/components/Wallets.qml | 2 +- electrum/gui/qml/qedaemon.py | 5 +++ electrum/gui/qml/qewalletdb.py | 45 ++++++++++++++----------- 3 files changed, 31 insertions(+), 21 deletions(-) diff --git a/electrum/gui/qml/components/Wallets.qml b/electrum/gui/qml/components/Wallets.qml index e9d384265..9d18b3f61 100644 --- a/electrum/gui/qml/components/Wallets.qml +++ b/electrum/gui/qml/components/Wallets.qml @@ -56,7 +56,7 @@ Pane { height: row.height onClicked: { - if (Daemon.currentWallet.name != model.name) + if (!Daemon.currentWallet || Daemon.currentWallet.name != model.name) Daemon.load_wallet(model.path) else app.stack.pop() diff --git a/electrum/gui/qml/qedaemon.py b/electrum/gui/qml/qedaemon.py index f8c0a88e1..97d524dfc 100644 --- a/electrum/gui/qml/qedaemon.py +++ b/electrum/gui/qml/qedaemon.py @@ -142,12 +142,17 @@ class QEDaemon(AuthMixin, QObject): self._walletdb = QEWalletDB() self._walletdb.validPasswordChanged.connect(self.passwordValidityCheck) + self._walletdb.walletOpenProblem.connect(self.on_wallet_open_problem) @pyqtSlot() def passwordValidityCheck(self): if not self._walletdb._validPassword: self.walletRequiresPassword.emit(self._name, self._path) + @pyqtSlot(str) + def on_wallet_open_problem(self, error): + self.walletOpenError.emit(error) + @pyqtSlot() @pyqtSlot(str) @pyqtSlot(str, str) diff --git a/electrum/gui/qml/qewalletdb.py b/electrum/gui/qml/qewalletdb.py index 346e6c0d9..ebc88dc44 100644 --- a/electrum/gui/qml/qewalletdb.py +++ b/electrum/gui/qml/qewalletdb.py @@ -6,14 +6,15 @@ from electrum.logging import get_logger from electrum.storage import WalletStorage, StorageEncryptionVersion from electrum.wallet_db import WalletDB from electrum.bip32 import normalize_bip32_derivation, xpub_type -from electrum.util import InvalidPassword +from electrum.util import InvalidPassword, WalletFileException from electrum import keystore class QEWalletDB(QObject): _logger = get_logger(__name__) fileNotFound = pyqtSignal() - pathChanged = pyqtSignal([bool], arguments=["ready"]) + walletOpenProblem = pyqtSignal([str], arguments=['error']) + pathChanged = pyqtSignal([bool], arguments=['ready']) needsPasswordChanged = pyqtSignal() needsHWDeviceChanged = pyqtSignal() passwordChanged = pyqtSignal() @@ -149,21 +150,25 @@ class QEWalletDB(QObject): def load_db(self): # needs storage accessible - self._db = WalletDB(self._storage.read(), manual_upgrades=True) - if self._db.requires_split(): - self._logger.warning('wallet requires split') - self._requiresSplit = True - self.requiresSplitChanged.emit() - return - if self._db.get_action(): - self._logger.warning('action pending. QML version doesn\'t support continuation of wizard') - return - - if self._db.requires_upgrade(): - self._logger.warning('wallet requires upgrade, upgrading') - self._db.upgrade() - self._db.write(self._storage) - - self._ready = True - self.readyChanged.emit() - + try: + self._db = WalletDB(self._storage.read(), manual_upgrades=True) + if self._db.requires_split(): + self._logger.warning('wallet requires split') + self._requiresSplit = True + self.requiresSplitChanged.emit() + return + if self._db.get_action(): + self._logger.warning('action pending. QML version doesn\'t support continuation of wizard') + return + + if self._db.requires_upgrade(): + self._logger.warning('wallet requires upgrade, upgrading') + self._db.upgrade() + self._db.write(self._storage) + + self._ready = True + self.readyChanged.emit() + except WalletFileException as e: + self._logger.error(f'{repr(e)}') + self._storage = None + self.walletOpenProblem.emit(str(e))