Messagelib

dkimchecksignaturejob.h
1/*
2 SPDX-FileCopyrightText: 2018-2025 Laurent Montel <montel@kde.org>
3
4 SPDX-License-Identifier: LGPL-2.0-or-later
5*/
6
7#pragma once
8
9#include "messageviewer_export.h"
10#include <KMime/Message>
11#include <MessageViewer/DKIMCheckPolicy>
12#include <MessageViewer/DKIMHeaderParser>
13#include <MessageViewer/DKIMInfo>
14#include <MessageViewer/DKIMKeyRecord>
15#include <QObject>
16
17namespace MessageViewer
18{
19/**
20 * @brief The DKIMCheckSignatureJob class
21 * @author Laurent Montel <montel@kde.org>
22 */
23class MESSAGEVIEWER_EXPORT DKIMCheckSignatureJob : public QObject
24{
26public:
27 enum class DKIMStatus : uint8_t {
28 Unknown = 0,
29 Valid = 1,
30 Invalid = 2,
31 EmailNotSigned = 3,
32 NeedToBeSigned = 4,
33 };
34 Q_ENUM(DKIMStatus)
35
36 enum class DKIMError : uint8_t {
37 Any = 0,
38 CorruptedBodyHash = 1,
39 DomainNotExist = 2,
40 MissingFrom = 3,
41 MissingSignature = 4,
42 InvalidQueryMethod = 5,
43 InvalidHeaderCanonicalization = 6,
44 InvalidBodyCanonicalization = 7,
45 InvalidBodyHashAlgorithm = 8,
46 InvalidSignAlgorithm = 9,
47 PublicKeyWasRevoked = 10,
48 SignatureTooLarge = 11,
49 InsupportedHashAlgorithm = 12,
50 PublicKeyTooSmall = 13,
51 ImpossibleToVerifySignature = 14,
52 DomainI = 15,
53 TestKeyMode = 16,
54 ImpossibleToDownloadKey = 17,
55 HashAlgorithmUnsafeSha1 = 18,
56 IDomainError = 19,
57 PublicKeyConversionError = 20,
58 };
59 Q_ENUM(DKIMError)
60 enum class DKIMWarning : uint8_t {
61 Any = 0,
62 SignatureExpired = 1,
63 SignatureCreatedInFuture = 2,
64 SignatureTooSmall = 3,
65 HashAlgorithmUnsafe = 4,
66 PublicRsaKeyTooSmall = 5,
67 };
68 Q_ENUM(DKIMWarning)
69
70 enum class AuthenticationMethod : uint8_t {
71 Unknown = 0,
72 Dkim = 1,
73 Spf = 2,
74 Dmarc = 3,
75 Dkimatps = 4,
76 Auth = 5,
77 XTls = 6,
78 };
79 Q_ENUM(AuthenticationMethod)
80
81 struct MESSAGEVIEWER_EXPORT DKIMCheckSignatureAuthenticationResult {
82 QString errorStr;
83 QString infoResult;
84 AuthenticationMethod method = AuthenticationMethod::Unknown;
85 DKIMCheckSignatureJob::DKIMStatus status = DKIMCheckSignatureJob::DKIMStatus::Unknown;
86 QString sdid; // Signing Domain Identifier
87 QString auid; // DKIM MAY optionally provide a single responsible Agent or User Identifier (AUID).
88 [[nodiscard]] bool operator==(const DKIMCheckSignatureAuthenticationResult &other) const;
89 [[nodiscard]] bool isValid() const;
90 };
91
92 struct MESSAGEVIEWER_EXPORT CheckSignatureResult {
93 [[nodiscard]] bool isValid() const;
94
95 [[nodiscard]] bool operator==(const CheckSignatureResult &other) const;
96
97 [[nodiscard]] bool operator!=(const CheckSignatureResult &other) const;
98
99 DKIMCheckSignatureJob::DKIMError error = DKIMCheckSignatureJob::DKIMError::Any;
100 DKIMCheckSignatureJob::DKIMWarning warning = DKIMCheckSignatureJob::DKIMWarning::Any;
101 DKIMCheckSignatureJob::DKIMStatus status = DKIMCheckSignatureJob::DKIMStatus::Unknown;
102 QString sdid; // Signing Domain Identifier
103 QString auid; // DKIM MAY optionally provide a single responsible Agent or User Identifier (AUID).
104 QString fromEmail;
105
106 QList<DKIMCheckSignatureAuthenticationResult> listSignatureAuthenticationResult;
107 };
108
109 explicit DKIMCheckSignatureJob(QObject *parent = nullptr);
110 ~DKIMCheckSignatureJob() override;
111 void start();
112
113 [[nodiscard]] QString dkimValue() const;
114
115 [[nodiscard]] DKIMCheckSignatureJob::DKIMStatus status() const;
116 void setStatus(MessageViewer::DKIMCheckSignatureJob::DKIMStatus status);
117
118 [[nodiscard]] MessageViewer::DKIMCheckSignatureJob::DKIMStatus checkSignature(const MessageViewer::DKIMInfo &info);
119
120 [[nodiscard]] DKIMCheckSignatureJob::DKIMError error() const;
121
122 [[nodiscard]] KMime::Message::Ptr message() const;
123 void setMessage(const KMime::Message::Ptr &message);
124
125 [[nodiscard]] DKIMCheckSignatureJob::DKIMWarning warning() const;
126 void setWarning(MessageViewer::DKIMCheckSignatureJob::DKIMWarning warning);
127
128 [[nodiscard]] QString headerCanonizationResult() const;
129
130 [[nodiscard]] QString bodyCanonizationResult() const;
131
132 [[nodiscard]] DKIMCheckPolicy policy() const;
133 void setPolicy(const DKIMCheckPolicy &policy);
134
135 void setHeaderParser(const DKIMHeaderParser &headerParser);
136
137 void setCheckSignatureAuthenticationResult(const QList<DKIMCheckSignatureJob::DKIMCheckSignatureAuthenticationResult> &lst);
138
140 void result(const MessageViewer::DKIMCheckSignatureJob::CheckSignatureResult &checkResult);
141 void storeKey(const QString &key, const QString &domain, const QString &selector);
142
143private:
144 MESSAGEVIEWER_NO_EXPORT void downloadKey(const DKIMInfo &info);
145 MESSAGEVIEWER_NO_EXPORT void slotDownloadKeyDone(const QList<QByteArray> &lst, const QString &domain, const QString &selector);
146 MESSAGEVIEWER_NO_EXPORT void parseDKIMKeyRecord(const QString &str, const QString &domain, const QString &selector, bool storeKeyValue = true);
147 [[nodiscard]] MESSAGEVIEWER_NO_EXPORT QString headerCanonizationSimple() const;
148 [[nodiscard]] MESSAGEVIEWER_NO_EXPORT QString headerCanonizationRelaxed(bool removeQuoteOnContentType) const;
149 [[nodiscard]] MESSAGEVIEWER_NO_EXPORT QString bodyCanonizationRelaxed() const;
150 [[nodiscard]] MESSAGEVIEWER_NO_EXPORT QString bodyCanonizationSimple() const;
151 [[nodiscard]] MESSAGEVIEWER_NO_EXPORT MessageViewer::DKIMCheckSignatureJob::CheckSignatureResult createCheckResult() const;
152 MESSAGEVIEWER_NO_EXPORT void verifySignature();
153 MESSAGEVIEWER_NO_EXPORT void verifyRSASignature();
154 MESSAGEVIEWER_NO_EXPORT void verifyEd25519Signature();
155 MESSAGEVIEWER_NO_EXPORT void computeHeaderCanonization(bool removeQuoteOnContentType);
156 MESSAGEVIEWER_NO_EXPORT void verificationFailed(DKIMError error);
157
159 DKIMCheckPolicy mPolicy;
160 DKIMHeaderParser mHeaderParser;
161 KMime::Message::Ptr mMessage;
162 QString mFromEmail;
163 DKIMInfo mDkimInfo;
164 DKIMKeyRecord mDkimKeyRecord;
165 QString mDkimValue;
166 QString mHeaderCanonizationResult;
167 QString mBodyCanonizationResult;
168 DKIMCheckSignatureJob::DKIMError mError = DKIMCheckSignatureJob::DKIMError::Any;
169 DKIMCheckSignatureJob::DKIMWarning mWarning = DKIMCheckSignatureJob::DKIMWarning::Any;
170 DKIMCheckSignatureJob::DKIMStatus mStatus = DKIMCheckSignatureJob::DKIMStatus::Unknown;
171};
172}
173MESSAGEVIEWER_EXPORT QDebug operator<<(QDebug d, const MessageViewer::DKIMCheckSignatureJob::CheckSignatureResult &t);
174MESSAGEVIEWER_EXPORT QDebug operator<<(QDebug d, const MessageViewer::DKIMCheckSignatureJob::DKIMCheckSignatureAuthenticationResult &t);
175Q_DECLARE_METATYPE(MessageViewer::DKIMCheckSignatureJob::CheckSignatureResult)
176Q_DECLARE_TYPEINFO(MessageViewer::DKIMCheckSignatureJob::DKIMCheckSignatureAuthenticationResult, Q_RELOCATABLE_TYPE);
QSharedPointer< Message > Ptr
The DKIMCheckPolicy class.
The DKIMHeaderParser class.
The DKIMInfo class.
Definition dkiminfo.h:20
The DKIMKeyRecord class.
Q_SCRIPTABLE CaptureState status()
Q_SCRIPTABLE Q_NOREPLY void start()
QObject(QObject *parent)
Q_ENUM(...)
Q_OBJECTQ_OBJECT
Q_SIGNALSQ_SIGNALS
QObject * parent() const const
This file is part of the KDE documentation.
Documentation copyright © 1996-2025 The KDE developers.
Generated on Fri Feb 28 2025 11:50:07 by doxygen 1.13.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.