File indexing completed on 2024-05-12 05:25:39
0001 /* 0002 SPDX-FileCopyrightText: 2020-2024 Laurent Montel <montel@kde.org> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "readserversieveconfigjob.h" 0008 0009 #include "sieveeditor_debug.h" 0010 #include "sieveserversettings.h" 0011 0012 #include <KConfig> 0013 #include <KSharedConfig> 0014 #include <QRegularExpression> 0015 0016 using namespace QKeychain; 0017 0018 ReadServerSieveConfigJob::ReadServerSieveConfigJob(QObject *parent) 0019 : QObject(parent) 0020 { 0021 connect(this, &ReadServerSieveConfigJob::loadNextConfig, this, &ReadServerSieveConfigJob::slotReadNextConfig); 0022 } 0023 0024 ReadServerSieveConfigJob::~ReadServerSieveConfigJob() = default; 0025 0026 void ReadServerSieveConfigJob::loadSettings(const QString &conf) 0027 { 0028 mCurrentSieveServerConfig = {}; 0029 KSharedConfigPtr cfg = KSharedConfig::openConfig(); 0030 KConfigGroup group = cfg->group(conf); 0031 // Sieve Account Settings 0032 mCurrentSieveServerConfig.sieveSettings.port = group.readEntry(QStringLiteral("Port"), 0); 0033 mCurrentSieveServerConfig.sieveSettings.serverName = group.readEntry(QStringLiteral("ServerName")); 0034 mCurrentSieveServerConfig.sieveSettings.userName = group.readEntry(QStringLiteral("UserName")); 0035 mCurrentSieveServerConfig.enabled = group.readEntry(QStringLiteral("Enabled"), true); 0036 mCurrentSieveServerConfig.sieveSettings.authenticationType = static_cast<MailTransport::Transport::EnumAuthenticationType>( 0037 group.readEntry(QStringLiteral("Authentication"), static_cast<int>(MailTransport::Transport::EnumAuthenticationType::PLAIN))); 0038 0039 // Imap Account Settings 0040 mCurrentSieveServerConfig.sieveImapAccountSettings.setPort(group.readEntry(QStringLiteral("ImapPort"), 0)); 0041 mCurrentSieveServerConfig.sieveImapAccountSettings.setServerName(group.readEntry(QStringLiteral("ImapServerName"))); 0042 mCurrentSieveServerConfig.sieveImapAccountSettings.setUserName(group.readEntry(QStringLiteral("ImapUserName"))); 0043 mCurrentSieveServerConfig.sieveImapAccountSettings.setAuthenticationType(static_cast<KSieveCore::SieveImapAccountSettings::AuthenticationMode>( 0044 group.readEntry(QStringLiteral("ImapAuthentication"), static_cast<int>(KSieveCore::SieveImapAccountSettings::Plain)))); 0045 mCurrentSieveServerConfig.sieveImapAccountSettings.setEncryptionMode(static_cast<KSieveCore::SieveImapAccountSettings::EncryptionMode>( 0046 group.readEntry(QStringLiteral("ImapEncrypt"), static_cast<int>(KSieveCore::SieveImapAccountSettings::SSLorTLS)))); 0047 0048 const QString walletEntry = mCurrentSieveServerConfig.sieveSettings.userName + QLatin1Char('@') + mCurrentSieveServerConfig.sieveSettings.serverName; 0049 auto readJob = new ReadPasswordJob(SieveEditorUtil::walletFolderName(), this); 0050 connect(readJob, &Job::finished, this, &ReadServerSieveConfigJob::readSieveServerPasswordFinished); 0051 readJob->setKey(walletEntry); 0052 readJob->start(); 0053 } 0054 0055 void ReadServerSieveConfigJob::readSieveServerPasswordFinished(QKeychain::Job *baseJob) 0056 { 0057 auto job = qobject_cast<ReadPasswordJob *>(baseJob); 0058 Q_ASSERT(job); 0059 if (!job->error()) { 0060 mCurrentSieveServerConfig.sieveSettings.password = job->textData(); 0061 } else { 0062 qCWarning(SIEVEEDITOR_LOG) << "We have an error during reading password " << job->errorString(); 0063 } 0064 0065 loadImapAccountSettings(); 0066 } 0067 0068 void ReadServerSieveConfigJob::loadImapAccountSettings() 0069 { 0070 if (!mCurrentSieveServerConfig.sieveImapAccountSettings.userName().isEmpty() && !mCurrentSieveServerConfig.sieveImapAccountSettings.serverName().isEmpty() 0071 && (mCurrentSieveServerConfig.sieveImapAccountSettings.userName() != mCurrentSieveServerConfig.sieveSettings.userName) 0072 && (mCurrentSieveServerConfig.sieveImapAccountSettings.serverName() != mCurrentSieveServerConfig.sieveSettings.serverName)) { 0073 mCurrentSieveServerConfig.useImapCustomServer = true; 0074 0075 const QString imapWalletEntry = QLatin1StringView("Imap") + mCurrentSieveServerConfig.sieveImapAccountSettings.userName() + QLatin1Char('@') 0076 + mCurrentSieveServerConfig.sieveImapAccountSettings.serverName(); 0077 auto readJob = new ReadPasswordJob(SieveEditorUtil::walletFolderName(), this); 0078 connect(readJob, &Job::finished, this, &ReadServerSieveConfigJob::readImapPasswordFinished); 0079 readJob->setKey(imapWalletEntry); 0080 readJob->start(); 0081 } else { 0082 // Use Sieve Account Settings 0083 mCurrentSieveServerConfig.sieveImapAccountSettings.setUserName(mCurrentSieveServerConfig.sieveSettings.userName); 0084 mCurrentSieveServerConfig.sieveImapAccountSettings.setServerName(mCurrentSieveServerConfig.sieveSettings.serverName); 0085 mCurrentSieveServerConfig.sieveImapAccountSettings.setPassword(mCurrentSieveServerConfig.sieveSettings.password); 0086 mCurrentSieveServerConfig.useImapCustomServer = false; 0087 mLstConfig.append(mCurrentSieveServerConfig); 0088 Q_EMIT loadNextConfig(); 0089 } 0090 } 0091 0092 void ReadServerSieveConfigJob::readImapPasswordFinished(QKeychain::Job *baseJob) 0093 { 0094 auto job = qobject_cast<ReadPasswordJob *>(baseJob); 0095 Q_ASSERT(job); 0096 if (!job->error()) { 0097 mCurrentSieveServerConfig.sieveImapAccountSettings.setPassword(job->textData()); 0098 } else { 0099 qCWarning(SIEVEEDITOR_LOG) << "We have an error during reading password (imap) " << job->errorString(); 0100 } 0101 mLstConfig.append(mCurrentSieveServerConfig); 0102 Q_EMIT loadNextConfig(); 0103 } 0104 0105 void ReadServerSieveConfigJob::start() 0106 { 0107 KSharedConfigPtr cfg = KSharedConfig::openConfig(); 0108 QRegularExpression re(QStringLiteral("^ServerSieve (.+)$")); 0109 mGroupsConfigs = cfg->groupList().filter(re); 0110 0111 slotReadNextConfig(); 0112 } 0113 0114 void ReadServerSieveConfigJob::slotReadNextConfig() 0115 { 0116 if (mGroupsConfigs.isEmpty()) { 0117 Q_EMIT finished(mLstConfig); 0118 deleteLater(); 0119 } else { 0120 const QString conf = mGroupsConfigs.takeFirst(); 0121 loadSettings(conf); 0122 } 0123 } 0124 0125 #include "moc_readserversieveconfigjob.cpp"