9 #include "messageviewer_dkimcheckerdebug.h"
11 using namespace MessageViewer;
13 DKIMInfo::DKIMInfo() =
default;
15 bool DKIMInfo::parseDKIM(
const QString &header)
18 qCWarning(MESSAGEVIEWER_DKIMCHECKER_LOG) <<
"Error: trying to parse empty header";
24 bool foundCanonizations =
false;
25 for (
int i = 0; i < items.
count(); ++i) {
26 const QString elem = items.
at(i).trimmed();
28 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
34 qCWarning(MESSAGEVIEWER_DKIMCHECKER_LOG) <<
"Version is not correct " << mVersion;
43 parseCanonicalization(elem.
right(elem.
length() - 2));
44 foundCanonizations =
true;
48 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
54 mAgentOrUserIdentifier = elem.
right(elem.
length() - 2);
58 qCWarning(MESSAGEVIEWER_DKIMCHECKER_LOG) <<
"Query is not correct and not supported " << mQuery;
67 const QString str = MessageViewer::DKIMUtil::cleanString(elem.
right(elem.
length() - 2));
74 qCWarning(MESSAGEVIEWER_DKIMCHECKER_LOG) <<
" Unknown element type" << elem <<
" : items : " << items;
77 if (!foundCanonizations) {
78 mHeaderCanonization = Simple;
79 mBodyCanonization = Simple;
85 mQuery = QStringLiteral(
"dns/txt");
87 if (mAgentOrUserIdentifier.
isEmpty()) {
88 mAgentOrUserIdentifier =
QLatin1Char(
'@') + mDomain;
92 if (lst.
count() == 2) {
93 if (mAgentOrUserIdentifier.
isEmpty()) {
94 mAgentOrUserIdentifier =
QLatin1Char(
'@') + mDomain;
102 void DKIMInfo::parseAlgorithm(
const QString &str)
106 if (lst.
count() != 2) {
107 qCWarning(MESSAGEVIEWER_DKIMCHECKER_LOG) <<
"algorithm is invalid " << str;
110 mSigningAlgorithm = lst.
at(0);
113 mHashingAlgorithm = HashingAlgorithmType::Sha1;
115 mHashingAlgorithm = HashingAlgorithmType::Sha256;
117 mHashingAlgorithm = HashingAlgorithmType::Unknown;
122 QString DKIMInfo::iDomain()
const
127 void DKIMInfo::setIDomain(
const QString &iDomain)
132 void DKIMInfo::parseCanonicalization(
const QString &str)
137 if (canonicalization.
count() >= 1) {
139 mHeaderCanonization = DKIMInfo::Relaxed;
141 mHeaderCanonization = DKIMInfo::Simple;
143 qCWarning(MESSAGEVIEWER_DKIMCHECKER_LOG) <<
"canonicalization for header unknown " << canonicalization.
at(0);
144 mHeaderCanonization = DKIMInfo::Unknown;
147 if (canonicalization.
count() == 1) {
148 mBodyCanonization = DKIMInfo::Simple;
149 }
else if (canonicalization.
count() == 2) {
151 mBodyCanonization = DKIMInfo::Relaxed;
153 mBodyCanonization = DKIMInfo::Simple;
155 qCWarning(MESSAGEVIEWER_DKIMCHECKER_LOG) <<
"canonicalization for body unknown " << canonicalization.
at(1);
156 mBodyCanonization = DKIMInfo::Unknown;
160 qCWarning(MESSAGEVIEWER_DKIMCHECKER_LOG) <<
" Problem during parsing canonicalization " << str;
161 mHeaderCanonization = DKIMInfo::Unknown;
162 mBodyCanonization = DKIMInfo::Unknown;
170 return mCopiedHeaderField;
173 void DKIMInfo::setCopiedHeaderField(
const QStringList &copiedHeaderField)
175 mCopiedHeaderField = copiedHeaderField;
178 DKIMInfo::CanonicalizationType DKIMInfo::bodyCanonization()
const
180 return mBodyCanonization;
183 void DKIMInfo::setBodyCanonization(CanonicalizationType bodyCanonization)
185 mBodyCanonization = bodyCanonization;
188 bool DKIMInfo::operator==(
const DKIMInfo &other)
const
190 return mVersion == other.version() && mHashingAlgorithm == other.hashingAlgorithm() && mSigningAlgorithm == other.signingAlgorithm()
191 && mDomain == other.domain() && mSelector == other.selector() && mBodyHash == other.bodyHash() && mSignatureTimeStamp == other.signatureTimeStamp()
192 && mExpireTime == other.expireTime() && mQuery == other.query() && mSignature == other.signature()
193 && mAgentOrUserIdentifier == other.agentOrUserIdentifier() && mBodyLengthCount == other.bodyLengthCount()
194 && mListSignedHeader == other.listSignedHeader() && mHeaderCanonization == other.headerCanonization() && mBodyCanonization == other.bodyCanonization()
195 && mIDomain == other.iDomain();
198 DKIMInfo::CanonicalizationType DKIMInfo::headerCanonization()
const
200 return mHeaderCanonization;
203 void DKIMInfo::setHeaderCanonization(CanonicalizationType headerCanonization)
205 mHeaderCanonization = headerCanonization;
208 int DKIMInfo::version()
const
213 void DKIMInfo::setVersion(
int version)
218 DKIMInfo::HashingAlgorithmType DKIMInfo::hashingAlgorithm()
const
220 return mHashingAlgorithm;
223 void DKIMInfo::setHashingAlgorithm(DKIMInfo::HashingAlgorithmType hashingAlgorithm)
225 mHashingAlgorithm = hashingAlgorithm;
228 QString DKIMInfo::domain()
const
233 void DKIMInfo::setDomain(
const QString &domain)
238 QString DKIMInfo::selector()
const
243 void DKIMInfo::setSelector(
const QString &selector)
245 mSelector = selector;
248 QString DKIMInfo::bodyHash()
const
253 void DKIMInfo::setBodyHash(
const QString &bodyHash)
255 mBodyHash = bodyHash;
258 bool DKIMInfo::isValid()
const
260 if (mBodyCanonization == DKIMInfo::Unknown || mHeaderCanonization == DKIMInfo::Unknown) {
265 && ((mHashingAlgorithm == HashingAlgorithmType::Sha1) || mHashingAlgorithm == HashingAlgorithmType::Sha256);
270 return mListSignedHeader;
273 void DKIMInfo::setListSignedHeader(
const QStringList &listSignedHeader)
275 mListSignedHeader = listSignedHeader;
278 QString DKIMInfo::signingAlgorithm()
const
280 return mSigningAlgorithm;
283 void DKIMInfo::setSigningAlgorithm(
const QString &signingAlgorithm)
285 mSigningAlgorithm = signingAlgorithm;
288 qint64 DKIMInfo::signatureTimeStamp()
const
290 return mSignatureTimeStamp;
293 void DKIMInfo::setSignatureTimeStamp(qint64 signatureTimeStamp)
295 mSignatureTimeStamp = signatureTimeStamp;
298 QString DKIMInfo::query()
const
303 void DKIMInfo::setQuery(
const QString &query)
308 qint64 DKIMInfo::expireTime()
const
313 void DKIMInfo::setExpireTime(qint64 expireTime)
315 mExpireTime = expireTime;
318 QString DKIMInfo::signature()
const
323 void DKIMInfo::setSignature(
const QString &signature)
325 mSignature = signature;
328 QString DKIMInfo::agentOrUserIdentifier()
const
330 return mAgentOrUserIdentifier;
333 void DKIMInfo::setAgentOrUserIdentifier(
const QString &userAgent)
335 mAgentOrUserIdentifier = userAgent;
338 int DKIMInfo::bodyLengthCount()
const
340 return mBodyLengthCount;
343 void DKIMInfo::setBodyLengthCount(
int bodyLengthCount)
345 mBodyLengthCount = bodyLengthCount;
350 d <<
"mVersion " << t.version();
351 d <<
"mHashingAlgorithm " << t.hashingAlgorithm();
352 d <<
"mSigningAlgorithm " << t.signingAlgorithm();
353 d <<
"mDomain " << t.domain();
354 d <<
"mSelector " << t.selector();
355 d <<
"mBodyHash " << t.bodyHash();
356 d <<
"mSignatureTimeStamp " << t.signatureTimeStamp();
357 d <<
"mExpireTime " << t.expireTime();
358 d <<
"mQuery " << t.query();
359 d <<
"mSignature " << t.signature();
360 d <<
"mAgentOrUserIdentifier " << t.agentOrUserIdentifier();
361 d <<
"mBodyLengthCount " << t.bodyLengthCount();
362 d <<
"mListSignedHeader " << t.listSignedHeader();
363 d <<
"mHeaderCanonization " << t.headerCanonization();
364 d <<
"mBodyCanonization " << t.bodyCanonization();
365 d <<
"mIdomain " << t.iDomain();