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"