From b361d02467da9597e19d6155a3615092b40407c1 Mon Sep 17 00:00:00 2001 From: Sander van Grieken Date: Mon, 5 Feb 2024 17:41:56 +0100 Subject: [PATCH 1/3] qml: tighten self._loading guard to encompass whole loadWallet fn, not just task thread. Also make sure QEWallet is never instantiated within the task thread. --- electrum/gui/qml/qedaemon.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/electrum/gui/qml/qedaemon.py b/electrum/gui/qml/qedaemon.py index 6f5a1bbb1..9145f8e64 100644 --- a/electrum/gui/qml/qedaemon.py +++ b/electrum/gui/qml/qedaemon.py @@ -168,6 +168,10 @@ class QEDaemon(AuthMixin, QObject): @pyqtSlot(str) @pyqtSlot(str, str) def loadWallet(self, path=None, password=None): + if self._loading: + return + self._loading = True + if path is None: self._path = self.daemon.config.get('wallet_path') # command line -w option if self._path is None: @@ -175,8 +179,11 @@ class QEDaemon(AuthMixin, QObject): else: self._path = path if self._path is None: + self._loading = False return + self.loadingChanged.emit() + self._path = standardize_path(self._path) self._name = os.path.basename(self._path) @@ -189,12 +196,11 @@ class QEDaemon(AuthMixin, QObject): if not password: password = self._password - wallet_already_open = self.daemon.get_wallet(self._path) is not None + wallet_already_open = self.daemon.get_wallet(self._path) + if wallet_already_open is not None: + wallet_already_open_password = QEWallet.getInstanceFor(wallet_already_open).password def load_wallet_task(): - self._loading = True - self.loadingChanged.emit() - try: local_password = password # need this in local scope wallet = None @@ -214,10 +220,10 @@ class QEDaemon(AuthMixin, QObject): if wallet is None: return - if wallet_already_open: + if wallet_already_open is not None: # wallet already open. daemon.load_wallet doesn't mind, but # we need the correct current wallet password below - local_password = QEWallet.getInstanceFor(wallet).password + local_password = wallet_already_open_password if self.daemon.config.WALLET_USE_SINGLE_PASSWORD: self._use_single_password = self.daemon.update_password_for_directory(old_password=local_password, new_password=local_password) From 5aa782a19e514cf39f1767eb46b9fdae33f50251 Mon Sep 17 00:00:00 2001 From: Sander van Grieken Date: Mon, 5 Feb 2024 17:56:02 +0100 Subject: [PATCH 2/3] qml: extend self._loading guard to encompass _on_backend_wallet_loaded slot as well --- electrum/gui/qml/qedaemon.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/electrum/gui/qml/qedaemon.py b/electrum/gui/qml/qedaemon.py index 9145f8e64..bfd29f514 100644 --- a/electrum/gui/qml/qedaemon.py +++ b/electrum/gui/qml/qedaemon.py @@ -201,6 +201,7 @@ class QEDaemon(AuthMixin, QObject): wallet_already_open_password = QEWallet.getInstanceFor(wallet_already_open).password def load_wallet_task(): + success = False try: local_password = password # need this in local scope wallet = None @@ -237,10 +238,12 @@ class QEDaemon(AuthMixin, QObject): run_hook('load_wallet', wallet) + success = True self._backendWalletLoaded.emit(local_password) finally: - self._loading = False - self.loadingChanged.emit() + if not success: # if successful, _loading guard will be reset by _on_backend_wallet_loaded + self._loading = False + self.loadingChanged.emit() threading.Thread(target=load_wallet_task, daemon=False).start() @@ -253,6 +256,8 @@ class QEDaemon(AuthMixin, QObject): self._current_wallet = QEWallet.getInstanceFor(wallet) self.availableWallets.updateWallet(self._path) self._current_wallet.password = password if password else None + self._loading = False + self.loadingChanged.emit() self.walletLoaded.emit(self._name, self._path) @pyqtSlot(QEWallet) From c755a58661ae489ba610543613d9666f2c65920b Mon Sep 17 00:00:00 2001 From: Sander van Grieken Date: Mon, 5 Feb 2024 18:07:12 +0100 Subject: [PATCH 3/3] qedaemon: remove redundant, small code style fixes --- electrum/gui/qml/qedaemon.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/electrum/gui/qml/qedaemon.py b/electrum/gui/qml/qedaemon.py index bfd29f514..1bcb06966 100644 --- a/electrum/gui/qml/qedaemon.py +++ b/electrum/gui/qml/qedaemon.py @@ -142,10 +142,10 @@ class QEDaemon(AuthMixin, QObject): loadingChanged = pyqtSignal() requestNewPassword = pyqtSignal() - walletLoaded = pyqtSignal([str,str], arguments=['name','path']) - walletRequiresPassword = pyqtSignal([str,str], arguments=['name','path']) + walletLoaded = pyqtSignal([str, str], arguments=['name', 'path']) + walletRequiresPassword = pyqtSignal([str, str], arguments=['name', 'path']) walletOpenError = pyqtSignal([str], arguments=["error"]) - walletDeleteError = pyqtSignal([str,str], arguments=['code', 'message']) + walletDeleteError = pyqtSignal([str, str], arguments=['code', 'message']) def __init__(self, daemon: 'Daemon', plugins: 'Plugins', parent=None): super().__init__(parent) @@ -160,10 +160,6 @@ class QEDaemon(AuthMixin, QObject): if not self._walletdb._validPassword: self.walletRequiresPassword.emit(self._name, self._path) - @pyqtSlot(str) - def onWalletOpenProblem(self, error): - self.walletOpenError.emit(error) - @pyqtSlot() @pyqtSlot(str) @pyqtSlot(str, str)