File indexing completed on 2024-06-23 05:18:32

0001 /*
0002  * This file is part of KMail.
0003  *
0004  * SPDX-FileCopyrightText: 2010 KDAB
0005  * SPDX-FileContributor: Tobias Koenig <tokoe@kde.org>
0006  * SPDX-FileContributor: Leo Franchi <lfranchi@kde.org>
0007  *
0008  * SPDX-License-Identifier: GPL-2.0-or-later
0009  */
0010 
0011 #include "job/emailaddressresolvejob.h"
0012 
0013 #include "aliasesexpandjob.h"
0014 #include "settings/messagecomposersettings.h"
0015 
0016 #include "MessageComposer/Composer"
0017 #include "MessageComposer/InfoPart"
0018 
0019 #include <KEmailAddress>
0020 #include <QVariant>
0021 
0022 using namespace MessageComposer;
0023 
0024 class MessageComposer::EmailAddressResolveJobPrivate
0025 {
0026 public:
0027     EmailAddressResolveJobPrivate() = default;
0028 
0029     QVariantMap mResultMap;
0030     QString mFrom;
0031     QStringList mTo;
0032     QStringList mCc;
0033     QStringList mBcc;
0034     QStringList mReplyTo;
0035     QString mDefaultDomainName;
0036     int mJobCount = 0;
0037 };
0038 
0039 EmailAddressResolveJob::EmailAddressResolveJob(QObject *parent)
0040     : KJob(parent)
0041     , d(new MessageComposer::EmailAddressResolveJobPrivate)
0042 {
0043 }
0044 
0045 EmailAddressResolveJob::~EmailAddressResolveJob() = default;
0046 
0047 static inline bool containsAliases(const QString &address)
0048 {
0049     // an valid email is defined as foo@foo.extension
0050     return !(address.contains(QLatin1Char('@')) && address.contains(QLatin1Char('.')));
0051 }
0052 
0053 static bool containsAliases(const QStringList &addresses)
0054 {
0055     for (const QString &address : addresses) {
0056         if (containsAliases(address)) {
0057             return true;
0058         }
0059     }
0060 
0061     return false;
0062 }
0063 
0064 void EmailAddressResolveJob::setDefaultDomainName(const QString &domainName)
0065 {
0066     d->mDefaultDomainName = domainName;
0067 }
0068 
0069 void EmailAddressResolveJob::start()
0070 {
0071     QList<AliasesExpandJob *> jobs;
0072 
0073     if (containsAliases(d->mFrom)) {
0074         auto job = new AliasesExpandJob(d->mFrom, d->mDefaultDomainName, this);
0075         job->setProperty("id", QStringLiteral("infoPartFrom"));
0076         connect(job, &AliasesExpandJob::result, this, &EmailAddressResolveJob::slotAliasExpansionDone);
0077         jobs << job;
0078     }
0079     if (containsAliases(d->mTo)) {
0080         auto job = new AliasesExpandJob(d->mTo.join(QLatin1StringView(", ")), d->mDefaultDomainName, this);
0081         job->setProperty("id", QStringLiteral("infoPartTo"));
0082         connect(job, &AliasesExpandJob::result, this, &EmailAddressResolveJob::slotAliasExpansionDone);
0083         jobs << job;
0084     }
0085 
0086     if (containsAliases(d->mCc)) {
0087         auto job = new AliasesExpandJob(d->mCc.join(QLatin1StringView(", ")), d->mDefaultDomainName, this);
0088         job->setProperty("id", QStringLiteral("infoPartCc"));
0089         connect(job, &AliasesExpandJob::result, this, &EmailAddressResolveJob::slotAliasExpansionDone);
0090         jobs << job;
0091     }
0092 
0093     if (containsAliases(d->mBcc)) {
0094         auto job = new AliasesExpandJob(d->mBcc.join(QLatin1StringView(", ")), d->mDefaultDomainName, this);
0095         job->setProperty("id", QStringLiteral("infoPartBcc"));
0096         connect(job, &AliasesExpandJob::result, this, &EmailAddressResolveJob::slotAliasExpansionDone);
0097         jobs << job;
0098     }
0099     if (containsAliases(d->mReplyTo)) {
0100         auto job = new AliasesExpandJob(d->mReplyTo.join(QLatin1StringView(", ")), d->mDefaultDomainName, this);
0101         job->setProperty("id", QStringLiteral("infoPartReplyTo"));
0102         connect(job, &AliasesExpandJob::result, this, &EmailAddressResolveJob::slotAliasExpansionDone);
0103         jobs << job;
0104     }
0105 
0106     d->mJobCount = jobs.count();
0107 
0108     if (d->mJobCount == 0) {
0109         emitResult();
0110     } else {
0111         for (AliasesExpandJob *job : std::as_const(jobs)) {
0112             job->start();
0113         }
0114     }
0115 }
0116 
0117 void EmailAddressResolveJob::slotAliasExpansionDone(KJob *job)
0118 {
0119     if (job->error()) {
0120         setError(job->error());
0121         setErrorText(job->errorText());
0122         emitResult();
0123         return;
0124     }
0125 
0126     const AliasesExpandJob *expandJob = qobject_cast<AliasesExpandJob *>(job);
0127     d->mResultMap.insert(expandJob->property("id").toString(), expandJob->addresses());
0128 
0129     d->mJobCount--;
0130     if (d->mJobCount == 0) {
0131         emitResult();
0132     }
0133 }
0134 
0135 void EmailAddressResolveJob::setFrom(const QString &from)
0136 {
0137     d->mFrom = from;
0138     d->mResultMap.insert(QStringLiteral("infoPartFrom"), from);
0139 }
0140 
0141 void EmailAddressResolveJob::setTo(const QStringList &to)
0142 {
0143     d->mTo = to;
0144     d->mResultMap.insert(QStringLiteral("infoPartTo"), to.join(QLatin1StringView(", ")));
0145 }
0146 
0147 void EmailAddressResolveJob::setCc(const QStringList &cc)
0148 {
0149     d->mCc = cc;
0150     d->mResultMap.insert(QStringLiteral("infoPartCc"), cc.join(QLatin1StringView(", ")));
0151 }
0152 
0153 void EmailAddressResolveJob::setBcc(const QStringList &bcc)
0154 {
0155     d->mBcc = bcc;
0156     d->mResultMap.insert(QStringLiteral("infoPartBcc"), bcc.join(QLatin1StringView(", ")));
0157 }
0158 
0159 void EmailAddressResolveJob::setReplyTo(const QStringList &replyTo)
0160 {
0161     d->mReplyTo = replyTo;
0162     d->mResultMap.insert(QStringLiteral("infoPartReplyTo"), replyTo.join(QLatin1StringView(", ")));
0163 }
0164 
0165 QString EmailAddressResolveJob::expandedFrom() const
0166 {
0167     return d->mResultMap.value(QStringLiteral("infoPartFrom")).toString();
0168 }
0169 
0170 QStringList EmailAddressResolveJob::expandedTo() const
0171 {
0172     return KEmailAddress::splitAddressList(d->mResultMap.value(QStringLiteral("infoPartTo")).toString());
0173 }
0174 
0175 QStringList EmailAddressResolveJob::expandedCc() const
0176 {
0177     return KEmailAddress::splitAddressList(d->mResultMap.value(QStringLiteral("infoPartCc")).toString());
0178 }
0179 
0180 QStringList EmailAddressResolveJob::expandedBcc() const
0181 {
0182     return KEmailAddress::splitAddressList(d->mResultMap.value(QStringLiteral("infoPartBcc")).toString());
0183 }
0184 
0185 QStringList EmailAddressResolveJob::expandedReplyTo() const
0186 {
0187     return KEmailAddress::splitAddressList(d->mResultMap.value(QStringLiteral("infoPartReplyTo")).toString());
0188 }
0189 
0190 #include "moc_emailaddressresolvejob.cpp"