File indexing completed on 2024-04-14 15:32:44

0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 // SPDX-FileCopyrightText: 2009, 2010, 2011 Dario Andres Rodriguez <andresbajotierra@gmail.com>
0003 // SPDX-FileCopyrightText: 2019-2022 Harald Sitter <sitter@kde.org>
0004 
0005 #include "credentialstore.h"
0006 
0007 #include <QVariant>
0008 
0009 #include "drkonqi_debug.h"
0010 #include "drkonqi_globals.h"
0011 
0012 static const char kWalletEntryUsername[] = "username";
0013 static const char kWalletEntryPassword[] = "password";
0014 
0015 static const QString konquerorKWalletEntryName = KDE_BUGZILLA_URL + QStringLiteral("index.cgi#login");
0016 static const char konquerorKWalletEntryUsername[] = "Bugzilla_login";
0017 static const char konquerorKWalletEntryPassword[] = "Bugzilla_password";
0018 
0019 void CredentialStore::openWallet()
0020 {
0021     // Store if the wallet was previously opened so we can know if we should close it later
0022     m_walletWasOpenedBefore = KWallet::Wallet::isOpen(KWallet::Wallet::NetworkWallet());
0023     qCDebug(DRKONQI_LOG) << "Wallet was open?" << m_walletWasOpenedBefore;
0024 
0025     // Request open the wallet
0026     const WId windowId = m_window ? m_window->winId() : 0;
0027 
0028     m_wallet = KWallet::Wallet::openWallet(KWallet::Wallet::NetworkWallet(), windowId);
0029     qCDebug(DRKONQI_LOG) << "wallet?" << m_wallet;
0030 }
0031 
0032 bool CredentialStore::kWalletEntryExists(const QString &entryName)
0033 {
0034     return !KWallet::Wallet::keyDoesNotExist(KWallet::Wallet::NetworkWallet(), KWallet::Wallet::FormDataFolder(), entryName);
0035 }
0036 
0037 void CredentialStore::load()
0038 {
0039     if (m_wallet) { // already open, nothing to do
0040         return;
0041     }
0042     qCDebug(DRKONQI_LOG) << "Wallet not open";
0043     QString username;
0044     QString password;
0045     if (kWalletEntryExists(m_walletEntryName)) { // Key exists!
0046         qCDebug(DRKONQI_LOG) << "wallet entry exists";
0047         openWallet();
0048         // Was the wallet opened?
0049         if (m_wallet) {
0050             m_wallet->setFolder(KWallet::Wallet::FormDataFolder());
0051 
0052             // Use wallet data to try login
0053             QMap<QString, QString> values;
0054             m_wallet->readMap(m_walletEntryName, values);
0055             username = values.value(QLatin1String(kWalletEntryUsername));
0056             password = values.value(QLatin1String(kWalletEntryPassword));
0057         }
0058     } else if (kWalletEntryExists(konquerorKWalletEntryName)) {
0059         qCDebug(DRKONQI_LOG) << "wallet entry does not exist";
0060         // If the DrKonqi entry is empty, but a Konqueror entry exists, use and copy it.
0061         openWallet();
0062         if (m_wallet) {
0063             m_wallet->setFolder(KWallet::Wallet::FormDataFolder());
0064 
0065             // Fetch Konqueror data
0066             QMap<QString, QString> values;
0067             m_wallet->readMap(konquerorKWalletEntryName, values);
0068             username = values.value(QLatin1String(konquerorKWalletEntryUsername));
0069             password = values.value(QLatin1String(konquerorKWalletEntryPassword));
0070         }
0071     }
0072     if (!username.isEmpty() && !password.isEmpty()) {
0073         setProperty("email", username);
0074         setProperty("password", password);
0075     }
0076 }
0077 
0078 void CredentialStore::store()
0079 {
0080     qCDebug(DRKONQI_LOG) << "trying to store credentials";
0081     if (!m_wallet) {
0082         openWallet();
0083     }
0084     qCDebug(DRKONQI_LOG) << "Wallet opened?" << m_wallet;
0085     // Got wallet open ?
0086     if (!m_wallet) {
0087         return;
0088     }
0089 
0090     if (!m_wallet->hasFolder(KWallet::Wallet::FormDataFolder())) {
0091         m_wallet->createFolder(KWallet::Wallet::FormDataFolder());
0092     }
0093 
0094     QMap<QString, QString> values;
0095     values.insert(QLatin1String(kWalletEntryUsername), m_email);
0096     values.insert(QLatin1String(kWalletEntryPassword), m_password);
0097     m_wallet->writeMap(m_walletEntryName, values);
0098 }
0099 
0100 void CredentialStore::drop()
0101 {
0102     if (!kWalletEntryExists(m_walletEntryName)) {
0103         return;
0104     }
0105 
0106     if (!m_wallet) {
0107         openWallet();
0108     }
0109     if (m_wallet && m_wallet->hasFolder(KWallet::Wallet::FormDataFolder())) {
0110         m_wallet->setFolder(KWallet::Wallet::FormDataFolder());
0111         m_wallet->removeEntry(m_walletEntryName);
0112     }
0113 }