Messagelib

dkimcheckpolicyjob.cpp
1 /*
2  SPDX-FileCopyrightText: 2019-2023 Laurent Montel <[email protected]>
3 
4  SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6 
7 #include "dkimcheckpolicyjob.h"
8 #include "dkim-verify/dkimmanagerrules.h"
9 #include "dkim-verify/dmarcmanager.h"
10 #include "messageviewer_dkimcheckerdebug.h"
11 
12 using namespace MessageViewer;
13 DKIMCheckPolicyJob::DKIMCheckPolicyJob(QObject *parent)
14  : QObject(parent)
15 {
16 }
17 
18 DKIMCheckPolicyJob::~DKIMCheckPolicyJob() = default;
19 
20 bool DKIMCheckPolicyJob::canStart() const
21 {
22  return !mEmailAddress.isEmpty();
23 }
24 
25 bool DKIMCheckPolicyJob::start()
26 {
27  if (!canStart()) {
28  qCWarning(MESSAGEVIEWER_DKIMCHECKER_LOG) << "Impossible to start DKIMCheckPolicyJob" << mEmailAddress;
29  Q_EMIT result(mCheckResult);
30  deleteLater();
31  return false;
32  }
33  if (mPolicy.useDMarc()) {
34  if (DMARCManager::self()->isNoDMarcServerAddress(mEmailAddress)) {
35  Q_EMIT result(mCheckResult);
36  deleteLater();
37  return true;
38  }
39  auto job = new DMARCPolicyJob(this);
40  job->setEmailAddress(mEmailAddress);
41  connect(job, &DMARCPolicyJob::result, this, &DKIMCheckPolicyJob::dmarcPolicyResult);
42  if (!job->start()) {
43  qCWarning(MESSAGEVIEWER_DKIMCHECKER_LOG) << "Impossible to start DKIMCheckPolicyJob" << mEmailAddress;
44  Q_EMIT result(mCheckResult);
45  deleteLater();
46  return false;
47  }
48  } else {
49  if (mPolicy.useDefaultRules()) {
50  compareWithDefaultRules();
51  } else {
52  Q_EMIT result(mCheckResult);
53  deleteLater();
54  }
55  }
56  return true;
57 }
58 
59 void DKIMCheckPolicyJob::compareWithDefaultRules()
60 {
61  const QVector<DKIMRule> rules = DKIMManagerRules::self()->rules();
62  for (const DKIMRule &rule : rules) {
63  if (rule.enabled()) {
64  if (rule.from() == mEmailAddress || rule.from() == QLatin1Char('*')) {
65  // Check SDID
66  const QStringList signedDomainIdentifier = rule.signedDomainIdentifier();
67  for (const QString &ssid : signedDomainIdentifier) {
68  if (mCheckResult.sdid == ssid) {
69  switch (rule.ruleType()) {
70  case DKIMRule::RuleType::Unknown:
71  // Invalid rule !
72  qCWarning(MESSAGEVIEWER_DKIMCHECKER_LOG) << "Invalid rule found " << rule;
73  break;
74  case DKIMRule::RuleType::MustBeSigned:
75  mCheckResult.status = DKIMCheckSignatureJob::DKIMStatus::NeedToBeSigned;
76  break;
77  case DKIMRule::RuleType::CanBeSigned:
78  // Show a warning ?
79  break;
80  case DKIMRule::RuleType::IgnoreEmailNotSigned:
81  // Nothing !
82  break;
83  }
84  break;
85  }
86  }
87  }
88  }
89  }
90  Q_EMIT result(mCheckResult);
91  deleteLater();
92 }
93 
94 void DKIMCheckPolicyJob::dmarcPolicyResult(const MessageViewer::DMARCPolicyJob::DMARCResult &value, const QString &emailAddress)
95 {
96  if (value.isValid()) {
97  if (mCheckResult.status == DKIMCheckSignatureJob::DKIMStatus::EmailNotSigned) {
98  mCheckResult.status = DKIMCheckSignatureJob::DKIMStatus::NeedToBeSigned;
99  // qDebug() << " void DKIMCheckPolicyJob::dmarcPolicyResult(const MessageViewer::DMARCPolicyJob::DMARCResult &value)"<<value.mDomain << "value " <<
100  // value.mSource;
101  // TODO verify it.
102  mCheckResult.sdid = value.mSource;
103  }
104  } else {
105  DMARCManager::self()->addNoDMarcServerAddress(emailAddress);
106  }
107  Q_EMIT result(mCheckResult);
108  deleteLater();
109 }
110 
111 MessageViewer::DKIMCheckSignatureJob::CheckSignatureResult DKIMCheckPolicyJob::checkResult() const
112 {
113  return mCheckResult;
114 }
115 
116 void DKIMCheckPolicyJob::setCheckResult(const MessageViewer::DKIMCheckSignatureJob::CheckSignatureResult &checkResult)
117 {
118  mCheckResult = checkResult;
119 }
120 
121 QString DKIMCheckPolicyJob::emailAddress() const
122 {
123  return mEmailAddress;
124 }
125 
126 void DKIMCheckPolicyJob::setEmailAddress(const QString &emailAddress)
127 {
128  mEmailAddress = emailAddress;
129 }
130 
131 DKIMCheckPolicy DKIMCheckPolicyJob::policy() const
132 {
133  return mPolicy;
134 }
135 
136 void DKIMCheckPolicyJob::setPolicy(const DKIMCheckPolicy &policy)
137 {
138  mPolicy = policy;
139 }
Q_EMITQ_EMIT
The DKIMCheckPolicy class.
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
void deleteLater()
bool isEmpty() const const
The DKIMRule class.
Definition: dkimrule.h:17
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Mon Mar 27 2023 04:08:17 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.