[frameworks/kwallet] src: Query NetworkWallet and LocalWallet from backend

Marco Martin <[email protected]>
Newsgroups gmane.comp.kde.cvs
Message-ID <[email protected]>
Git commit 034ca0fb85f9b6c8258551101ef6a3b8d08503dc by Marco Martin, on behalf of Nicolas Fella.
Committed on 27/07/2026 at 10:14.
Pushed by nicolasfella into branch 'master'.

Query NetworkWallet and LocalWallet from backend

Currently the API directly reads the config file.

However, when a different backend is used that should
be the source of truth for the default wallet.

The migration code to a third-party backend has some code
to set the default wallet, but it's better to use the actual
backend as source of truth, rather than the kwallet-specific
config file.

Move the code that reads kwalletrc to the backend lib so that
kwalletd and ksecretd can use it, without using the public KWallet
API (which would result in a loop now).

M  +19   -18   src/api/KWallet/kwallet.cpp
M  +5    -5    src/runtime/ksecretd/ksecretd.cpp
M  +1    -0    src/runtime/kwalletbackend/CMakeLists.txt
M  +33   -2    src/runtime/kwalletbackend/kwalletbackend.cc
M  +2    -0    src/runtime/kwalletbackend/kwalletbackend.h
M  +1    -1    src/runtime/kwalletd/kwalletd.cpp

https://invent.kde.org/frameworks/kwallet/-/commit/034ca0fb85f9b6c8258551101ef6a3b8d08503dc

diff --git a/src/api/KWallet/kwallet.cpp b/src/api/KWallet/kwallet.cpp
index cfe6ff49..4b88d40a 100644
--- a/src/api/KWallet/kwallet.cpp
+++ b/src/api/KWallet/kwallet.cpp
@@ -56,31 +56,32 @@ static void registerTypes()
 
 const QString Wallet::LocalWallet()
 {
-    KConfigGroup cfg(KSharedConfig::openConfig(QStringLiteral("kwalletrc"))->group(QStringLiteral("Wallet")));
-    if (!cfg.readEntry("Use One Wallet", true)) {
-        QString tmp = cfg.readEntry("Local Wallet", "localwallet");
-        if (tmp.isEmpty()) {
-            return QStringLiteral("localwallet");
+    if (walletLauncher()->m_walletEnabled) {
+        QDBusReply<QString> r = walletLauncher()->getInterface().localWallet();
+        if (!r.isValid()) {
+            qCDebug(KWALLET_API_LOG) << "Invalid DBus reply: " << r.error();
+            return QString();
+        } else {
+            return r;
         }
-        return tmp;
-    }
-
-    QString tmp = cfg.readEntry("Default Wallet", "kdewallet");
-    if (tmp.isEmpty()) {
-        return QStringLiteral("kdewallet");
+    } else {
+        return QString();
     }
-    return tmp;
 }
 
 const QString Wallet::NetworkWallet()
 {
-    KConfigGroup cfg(KSharedConfig::openConfig(QStringLiteral("kwalletrc"))->group(QStringLiteral("Wallet")));
-
-    QString tmp = cfg.readEntry("Default Wallet", "kdewallet");
-    if (tmp.isEmpty()) {
-        return QStringLiteral("kdewallet");
+    if (walletLauncher()->m_walletEnabled) {
+        QDBusReply<QString> r = walletLauncher()->getInterface().networkWallet();
+        if (!r.isValid()) {
+            qCDebug(KWALLET_API_LOG) << "Invalid DBus reply: " << r.error();
+            return QString();
+        } else {
+            return r;
+        }
+    } else {
+        return QString();
     }
-    return tmp;
 }
 
 const QString Wallet::PasswordFolder()
diff --git a/src/runtime/ksecretd/ksecretd.cpp b/src/runtime/ksecretd/ksecretd.cpp
index 7ec15155..88753832 100644
--- a/src/runtime/ksecretd/ksecretd.cpp
+++ b/src/runtime/ksecretd/ksecretd.cpp
@@ -465,12 +465,12 @@ int KSecretD::doTransactionOpen(const QString &appid, const QString &wallet, boo
     if (_firstUse && !isPath) {
         // if the user specifies a wallet name, the use it as the default
         // wallet name
-        if (wallet != KWallet::Wallet::LocalWallet()) {
+        if (wallet != KWallet::Backend::localWallet()) {
             KConfig kwalletrc(QStringLiteral("kwalletrc"));
             KConfigGroup cfg(&kwalletrc, "Wallet");
             cfg.writeEntry("Default Wallet", wallet);
         }
-        if (wallets().contains(KWallet::Wallet::LocalWallet())) {
+        if (wallets().contains(KWallet::Backend::localWallet())) {
             KConfig kwalletrc(QStringLiteral("kwalletrc"));
             KConfigGroup cfg(&kwalletrc, "Wallet");
             _firstUse = false;
@@ -686,7 +686,7 @@ int KSecretD::internalOpen(const QString &appid, const QString &wallet, bool isP
                 KNewPasswordDialog *kpd = new KNewPasswordDialog();
                 KColorScheme colorScheme(QPalette::Active, KColorScheme::View);
                 kpd->setBackgroundWarningColor(colorScheme.background(KColorScheme::NegativeBackground).color());
-                if (wallet == KWallet::Wallet::LocalWallet() || wallet == KWallet::Wallet::NetworkWallet()) {
+                if (wallet == KWallet::Backend::localWallet() || wallet == KWallet::Backend::networkWallet()) {
                     // Auto create these wallets.
                     if (appid.isEmpty()) {
                         kpd->setPrompt(
@@ -1800,12 +1800,12 @@ void KSecretD::closeAllWallets()
 
 QString KSecretD::networkWallet()
 {
-    return KWallet::Wallet::NetworkWallet();
+    return KWallet::Backend::networkWallet();
 }
 
 QString KSecretD::localWallet()
 {
-    return KWallet::Wallet::LocalWallet();
+    return KWallet::Backend::localWallet();
 }
 
 void KSecretD::activatePasswordDialog()
diff --git a/src/runtime/kwalletbackend/CMakeLists.txt b/src/runtime/kwalletbackend/CMakeLists.txt
index 63d11b30..21673381 100644
--- a/src/runtime/kwalletbackend/CMakeLists.txt
+++ b/src/runtime/kwalletbackend/CMakeLists.txt
@@ -71,6 +71,7 @@ target_link_libraries(KF6WalletBackend
     KF6::WidgetsAddons
     KF6::CoreAddons
     KF6::Notifications
+    KF6::ConfigCore
     KF6::I18n
     ${LIBGCRYPT_LIBRARIES}
 )
diff --git a/src/runtime/kwalletbackend/kwalletbackend.cc b/src/runtime/kwalletbackend/kwalletbackend.cc
index f2559d0b..c35af3d1 100644
--- a/src/runtime/kwalletbackend/kwalletbackend.cc
+++ b/src/runtime/kwalletbackend/kwalletbackend.cc
@@ -14,9 +14,11 @@
 #ifdef HAVE_GPGMEPP
 #include <gpgme++/key.h>
 #endif
-#include <gcrypt.h>
-#include <KNotification>
+#include <KConfigGroup>
 #include <KLocalizedString>
+#include <KNotification>
+#include <KSharedConfig>
+#include <gcrypt.h>
 
 #include <QDir>
 #include <QFile>
@@ -62,6 +64,35 @@ QString Backend::decodeWalletName(const QString &encodedName) {
     return QString::fromUtf8(QByteArray::fromPercentEncoding(encodedName.toUtf8(), ';'));
 }
 
+QString Backend::networkWallet()
+{
+    KConfigGroup cfg(KSharedConfig::openConfig(QStringLiteral("kwalletrc"))->group(QStringLiteral("Wallet")));
+
+    QString tmp = cfg.readEntry("Default Wallet", "kdewallet");
+    if (tmp.isEmpty()) {
+        return QStringLiteral("kdewallet");
+    }
+    return tmp;
+}
+
+QString Backend::localWallet()
+{
+    KConfigGroup cfg(KSharedConfig::openConfig(QStringLiteral("kwalletrc"))->group(QStringLiteral("Wallet")));
+    if (!cfg.readEntry("Use One Wallet", true)) {
+        QString tmp = cfg.readEntry("Local Wallet", "localwallet");
+        if (tmp.isEmpty()) {
+            return QStringLiteral("localwallet");
+        }
+        return tmp;
+    }
+
+    QString tmp = cfg.readEntry("Default Wallet", "kdewallet");
+    if (tmp.isEmpty()) {
+        return QStringLiteral("kdewallet");
+    }
+    return tmp;
+}
+
 gcry_error_t ensureGcryptInit()
 {
     bool static gcry_secmem_init = false;
diff --git a/src/runtime/kwalletbackend/kwalletbackend.h b/src/runtime/kwalletbackend/kwalletbackend.h
index 09f1c5bb..d881489e 100644
--- a/src/runtime/kwalletbackend/kwalletbackend.h
+++ b/src/runtime/kwalletbackend/kwalletbackend.h
@@ -194,6 +194,8 @@ public:
     static QString getSaveLocation();
     static QString encodeWalletName(const QString &name);
     static QString decodeWalletName(const QString &encodedName);
+    static QString networkWallet();
+    static QString localWallet();
 
 private:
     Q_DISABLE_COPY(Backend)
diff --git a/src/runtime/kwalletd/kwalletd.cpp b/src/runtime/kwalletd/kwalletd.cpp
index f4b11156..0dd54579 100644
--- a/src/runtime/kwalletd/kwalletd.cpp
+++ b/src/runtime/kwalletd/kwalletd.cpp
@@ -1117,7 +1117,7 @@ QString KWalletD::localWallet()
     const bool ksecretdEnabled = ksecretdGroup.readEntry("Enabled", true);
 
     if (ksecretdEnabled) {
-        return KWallet::Wallet::LocalWallet(); // keep in sync with KSecretD::localWallet()
+        return KWallet::Backend::localWallet();
     } else {
         bool ok;
         const QString defaultWallet = m_backend->defaultCollection(&ok);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.