File indexing completed on 2025-03-09 04:54:28

0001 /*
0002    SPDX-FileCopyrightText: 2019-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "dkimcheckpolicyjob.h"
0008 #include "dkim-verify/dkimmanagerrules.h"
0009 #include "dkim-verify/dmarcmanager.h"
0010 #include "messageviewer_dkimcheckerdebug.h"
0011 
0012 using namespace MessageViewer;
0013 DKIMCheckPolicyJob::DKIMCheckPolicyJob(QObject *parent)
0014     : QObject(parent)
0015 {
0016 }
0017 
0018 DKIMCheckPolicyJob::~DKIMCheckPolicyJob() = default;
0019 
0020 bool DKIMCheckPolicyJob::canStart() const
0021 {
0022     return !mEmailAddress.isEmpty();
0023 }
0024 
0025 bool DKIMCheckPolicyJob::start()
0026 {
0027     if (!canStart()) {
0028         qCWarning(MESSAGEVIEWER_DKIMCHECKER_LOG) << "Impossible to start DKIMCheckPolicyJob" << mEmailAddress;
0029         Q_EMIT result(mCheckResult);
0030         deleteLater();
0031         return false;
0032     }
0033     if (mPolicy.useDMarc()) {
0034         if (DMARCManager::self()->isNoDMarcServerAddress(mEmailAddress)) {
0035             Q_EMIT result(mCheckResult);
0036             deleteLater();
0037             return true;
0038         }
0039         auto job = new DMARCPolicyJob(this);
0040         job->setEmailAddress(mEmailAddress);
0041         connect(job, &DMARCPolicyJob::result, this, &DKIMCheckPolicyJob::dmarcPolicyResult);
0042         if (!job->start()) {
0043             qCWarning(MESSAGEVIEWER_DKIMCHECKER_LOG) << "Impossible to start DKIMCheckPolicyJob" << mEmailAddress;
0044             Q_EMIT result(mCheckResult);
0045             deleteLater();
0046             return false;
0047         }
0048     } else {
0049         if (mPolicy.useDefaultRules()) {
0050             compareWithDefaultRules();
0051         } else {
0052             Q_EMIT result(mCheckResult);
0053             deleteLater();
0054         }
0055     }
0056     return true;
0057 }
0058 
0059 void DKIMCheckPolicyJob::compareWithDefaultRules()
0060 {
0061     const QList<DKIMRule> rules = DKIMManagerRules::self()->rules();
0062     for (const DKIMRule &rule : rules) {
0063         if (rule.enabled()) {
0064             if (rule.from() == mEmailAddress || rule.from() == QLatin1Char('*')) {
0065                 // Check SDID
0066                 const QStringList signedDomainIdentifier = rule.signedDomainIdentifier();
0067                 for (const QString &ssid : signedDomainIdentifier) {
0068                     if (mCheckResult.sdid == ssid) {
0069                         switch (rule.ruleType()) {
0070                         case DKIMRule::RuleType::Unknown:
0071                             // Invalid rule !
0072                             qCWarning(MESSAGEVIEWER_DKIMCHECKER_LOG) << "Invalid rule found " << rule;
0073                             break;
0074                         case DKIMRule::RuleType::MustBeSigned:
0075                             mCheckResult.status = DKIMCheckSignatureJob::DKIMStatus::NeedToBeSigned;
0076                             break;
0077                         case DKIMRule::RuleType::CanBeSigned:
0078                             // Show a warning ?
0079                             break;
0080                         case DKIMRule::RuleType::IgnoreEmailNotSigned:
0081                             // Nothing !
0082                             break;
0083                         }
0084                         break;
0085                     }
0086                 }
0087             }
0088         }
0089     }
0090     Q_EMIT result(mCheckResult);
0091     deleteLater();
0092 }
0093 
0094 void DKIMCheckPolicyJob::dmarcPolicyResult(const MessageViewer::DMARCPolicyJob::DMARCResult &value, const QString &emailAddress)
0095 {
0096     if (value.isValid()) {
0097         if (mCheckResult.status == DKIMCheckSignatureJob::DKIMStatus::EmailNotSigned) {
0098             mCheckResult.status = DKIMCheckSignatureJob::DKIMStatus::NeedToBeSigned;
0099             // qDebug() << " void DKIMCheckPolicyJob::dmarcPolicyResult(const MessageViewer::DMARCPolicyJob::DMARCResult &value)"<<value.mDomain << "value " <<
0100             // value.mSource;
0101             // TODO verify it.
0102             mCheckResult.sdid = value.mSource;
0103         }
0104     } else {
0105         DMARCManager::self()->addNoDMarcServerAddress(emailAddress);
0106     }
0107     Q_EMIT result(mCheckResult);
0108     deleteLater();
0109 }
0110 
0111 MessageViewer::DKIMCheckSignatureJob::CheckSignatureResult DKIMCheckPolicyJob::checkResult() const
0112 {
0113     return mCheckResult;
0114 }
0115 
0116 void DKIMCheckPolicyJob::setCheckResult(const MessageViewer::DKIMCheckSignatureJob::CheckSignatureResult &checkResult)
0117 {
0118     mCheckResult = checkResult;
0119 }
0120 
0121 QString DKIMCheckPolicyJob::emailAddress() const
0122 {
0123     return mEmailAddress;
0124 }
0125 
0126 void DKIMCheckPolicyJob::setEmailAddress(const QString &emailAddress)
0127 {
0128     mEmailAddress = emailAddress;
0129 }
0130 
0131 DKIMCheckPolicy DKIMCheckPolicyJob::policy() const
0132 {
0133     return mPolicy;
0134 }
0135 
0136 void DKIMCheckPolicyJob::setPolicy(const DKIMCheckPolicy &policy)
0137 {
0138     mPolicy = policy;
0139 }
0140 
0141 #include "moc_dkimcheckpolicyjob.cpp"