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"