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 }