diff --git a/electrum/gui/qml/components/Wallets.qml b/electrum/gui/qml/components/Wallets.qml index ec19f195f..5a3f816d1 100644 --- a/electrum/gui/qml/components/Wallets.qml +++ b/electrum/gui/qml/components/Wallets.qml @@ -42,7 +42,7 @@ Pane { function changePassword() { // trigger dialog via wallet (auth then signal) - Daemon.currentWallet.start_change_password() + Daemon.start_change_password() } property QtObject menu: Menu { @@ -307,6 +307,19 @@ Pane { Daemon.availableWallets.reload() app.stack.pop() } + function onRequestNewPassword() { // new unified password (all wallets) + var dialog = app.passwordDialog.createObject(app, + { + 'confirmPassword': true, + 'title': qsTr('Enter new password'), + 'infotext': qsTr('If you forget your password, you\'ll need to\ + restore from seed. Please make sure you have your seed stored safely') + } ) + dialog.accepted.connect(function() { + Daemon.set_password(dialog.password) + }) + dialog.open() + } } Connections { diff --git a/electrum/gui/qml/qedaemon.py b/electrum/gui/qml/qedaemon.py index 855488b72..683cee94a 100644 --- a/electrum/gui/qml/qedaemon.py +++ b/electrum/gui/qml/qedaemon.py @@ -6,7 +6,7 @@ from PyQt5.QtCore import Qt, QAbstractListModel, QModelIndex from electrum.util import register_callback, get_new_wallet_name, WalletFileException from electrum.logging import get_logger -from electrum.wallet import Wallet, Abstract_Wallet +from electrum.wallet import Wallet, Abstract_Wallet, update_password_for_directory from electrum.storage import WalletStorage, StorageReadWriteError from electrum.wallet_db import WalletDB @@ -104,7 +104,8 @@ class QEDaemon(AuthMixin, QObject): _available_wallets = None _current_wallet = None _path = None - + _use_single_password = False + _password = None walletLoaded = pyqtSignal() walletRequiresPassword = pyqtSignal() @@ -144,6 +145,12 @@ class QEDaemon(AuthMixin, QObject): self._loaded_wallets.add_wallet(wallet=wallet) self._current_wallet = QEWallet.getInstanceFor(wallet) self.walletLoaded.emit() + + if self.daemon.config.get('single_password'): + self._use_single_password = update_password_for_directory(self.daemon.config, password, password) + self._password = password + self._logger.info(f'use single password: {self._use_single_password}') + self.daemon.config.save_last_wallet(wallet) else: self._logger.info('could not open wallet') @@ -195,3 +202,17 @@ class QEDaemon(AuthMixin, QObject): i = i + 1 return f'wallet_{i}' + requestNewPassword = pyqtSignal() + @pyqtSlot() + @auth_protect + def start_change_password(self): + if self._use_single_password: + self.requestNewPassword.emit() + else: + self.currentWallet.requestNewPassword.emit() + + @pyqtSlot(str) + def set_password(self, password): + assert self._use_single_password + self._logger.debug('about to set password to %s for ALL wallets' % password) + update_password_for_directory(self.daemon.config, self._password, password) diff --git a/electrum/gui/qml/qewallet.py b/electrum/gui/qml/qewallet.py index c44cb1e29..8e7e321ae 100644 --- a/electrum/gui/qml/qewallet.py +++ b/electrum/gui/qml/qewallet.py @@ -57,6 +57,7 @@ class QEWallet(AuthMixin, QObject): invoiceCreateError = pyqtSignal([str,str], arguments=['code','error']) paymentSucceeded = pyqtSignal([str], arguments=['key']) paymentFailed = pyqtSignal([str,str], arguments=['key','reason']) + requestNewPassword = pyqtSignal() _network_signal = pyqtSignal(str, object) @@ -499,12 +500,6 @@ class QEWallet(AuthMixin, QObject): except InvalidPassword as e: return False - requestNewPassword = pyqtSignal() - @pyqtSlot() - @auth_protect - def start_change_password(self): - self.requestNewPassword.emit() - @pyqtSlot(str) def set_password(self, password): storage = self.wallet.storage