From 07f61ebd5a5a3fd91e04f623f559c2c7156c4d6e Mon Sep 17 00:00:00 2001 From: f321x Date: Tue, 20 Jan 2026 12:30:31 +0100 Subject: [PATCH] qml: PasswordDialog: show error on invalid password Currently the PasswordDialog on QML would just close if the user enters an incorrect password. This is confusing as the user doesn't know why the dialog closed and if it initiated any action or not. With the change the PasswordDialog will get the ability to show an error message and will show "Invalid Password" if an incorrect password is entered. I also used it for the password unification warning ("Need to enter similar password ...") instead of showing a separate popup. --- .../gui/qml/components/PasswordDialog.qml | 21 ++++++++++++++++--- electrum/gui/qml/components/WalletDetails.qml | 21 +++++++++++-------- electrum/gui/qml/components/main.qml | 8 ++++--- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/electrum/gui/qml/components/PasswordDialog.qml b/electrum/gui/qml/components/PasswordDialog.qml index 71a43d9a4..550f00b23 100644 --- a/electrum/gui/qml/components/PasswordDialog.qml +++ b/electrum/gui/qml/components/PasswordDialog.qml @@ -14,8 +14,10 @@ ElDialog { iconSource: Qt.resolvedUrl('../../icons/lock.png') property bool confirmPassword: false - property string password property string infotext + property string errorMessage + + signal passwordEntered(string password) anchors.centerIn: parent width: parent.width * 4/5 @@ -84,6 +86,16 @@ ElDialog { password: pw_1.text } } + + Label { + Layout.maximumWidth: parent.width + Layout.alignment: Qt.AlignHCenter + text: errorMessage + wrapMode: Text.Wrap + visible: errorMessage + color: constants.colorError + font.pixelSize: constants.fontSizeLarge + } } FlatButton { @@ -92,10 +104,13 @@ ElDialog { icon.source: '../../icons/confirmed.png' enabled: confirmPassword ? pw_1.text.length >= 6 && pw_1.text == pw_2.text : true onClicked: { - password = pw_1.text - passworddialog.doAccept() + passwordEntered(pw_1.text) } } } + function clearPassword() { + pw_1.text = "" + pw_2.text = "" + } } diff --git a/electrum/gui/qml/components/WalletDetails.qml b/electrum/gui/qml/components/WalletDetails.qml index a86cce3dd..8522c42b2 100644 --- a/electrum/gui/qml/components/WalletDetails.qml +++ b/electrum/gui/qml/components/WalletDetails.qml @@ -473,12 +473,13 @@ Pane { 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() { - var success = Daemon.setPassword(dialog.password) + dialog.passwordEntered.connect(function(password) { + dialog.close() + var success = Daemon.setPassword(password) if (success && Biometrics.isEnabled) { if (Biometrics.isAvailable) { // also update the biometric authentication - Biometrics.enable(dialog.password) + Biometrics.enable(password) } else { // disable biometric authentication as it is not available Biometrics.disable() @@ -538,23 +539,25 @@ Pane { ? "\n\n" + qsTr('The new password needs to match the password of any other existing wallet.') : "") }) - dialog.accepted.connect(function() { + dialog.passwordEntered.connect(function(password) { if (Config.walletShouldUseSinglePassword // android && Daemon.availableWallets.rowCount() > 1 // has more than one wallet - && Daemon.numWalletsWithPassword(dialog.password) < 1 // no other wallet uses this new password + && Daemon.numWalletsWithPassword(password) < 1 // no other wallet uses this new password ) { - var success = false - var error_msg = [ + dialog.errorMessage = [ qsTr('You need to use the password of any other existing wallet.'), qsTr('Using different wallet passwords is not supported.'), ].join("\n") + dialog.clearPassword() + return } else { - var success = Daemon.currentWallet.setPassword(dialog.password) + var success = Daemon.currentWallet.setPassword(password) if (success && Config.walletShouldUseSinglePassword) { - Daemon.singlePassword = dialog.password + Daemon.singlePassword = password } var error_msg = qsTr('Password change failed') } + dialog.close() if (success && Biometrics.isEnabled) { // unlikely to happen as this means the user somehow moved from // a unified password to differing passwords diff --git a/electrum/gui/qml/components/main.qml b/electrum/gui/qml/components/main.qml index 5a5fb5875..420213092 100644 --- a/electrum/gui/qml/components/main.qml +++ b/electrum/gui/qml/components/main.qml @@ -852,11 +852,13 @@ ApplicationWindow // 'payment_auth' should have been converted to 'wallet' at this point if (method === 'wallet' || method === 'wallet_password_only') { var dialog = app.passwordDialog.createObject(app, authMessage ? {'title': authMessage} : {}) - dialog.accepted.connect(function() { - if (Daemon.currentWallet.verifyPassword(dialog.password)) { + dialog.passwordEntered.connect(function(password) { + if (Daemon.currentWallet.verifyPassword(password)) { + dialog.close() qtobject.authProceed() } else { - qtobject.authCancel() + dialog.clearPassword() + dialog.errorMessage = qsTr("Invalid Password") } }) dialog.rejected.connect(function() {