7#include "autocryptutils.h"
9#include "autocryptstorage.h"
11#include "autocrypt_debug.h"
15using namespace MessageCore;
23QDateTime HeaderMixupNodeHelper::dateHeader()
const
25 return mNodeHelper->dateHeader(message);
28bool HeaderMixupNodeHelper::hasMailHeader(
const char *header)
const
30 return mNodeHelper->hasMailHeader(header, message);
33QSharedPointer<KMime::Headers::Generics::AddressList> HeaderMixupNodeHelper::mailHeaderAsAddressList(
const char *header)
const
35 return mNodeHelper->mailHeaderAsAddressList(header, message);
38const KMime::Headers::Base *HeaderMixupNodeHelper::mailHeaderAsBase(
const char *header)
const
40 return mNodeHelper->mailHeaderAsBase(header, message);
43QList<MimeTreeParser::MessagePart::Ptr> HeaderMixupNodeHelper::messagePartsOfMailHeader(
const char *header)
const
45 return mNodeHelper->messagePartsOfMailHeader(header, message);
48QList<KMime::Headers::Base *> HeaderMixupNodeHelper::headers(
const char *header)
const
50 return mNodeHelper->headers(header, message);
53QHash<QByteArray, QByteArray> MessageCore::paramsFromAutocryptHeader(
const KMime::Headers::Base *
const header)
55 QHash<QByteArray, QByteArray> params;
58 for (
const auto &part : parts) {
59 const auto &i = part.split(
'=');
60 params[i[0].trimmed()] = i[1].trimmed();
65void MessageCore::processAutocryptfromMail(
const HeaderMixupNodeHelper &mixup)
67 auto storage = AutocryptStorage::self();
69 QByteArray messageid =
"<NO Message-ID header>";
70 if (mixup.mailHeaderAsBase(
"Message-ID")) {
71 messageid = mixup.mailHeaderAsBase(
"Message-ID")->
as7BitString(
false);
74 const auto fromAddr = mixup.mailHeaderAsAddressList(
"from");
75 if (fromAddr->addresses().size() != 1) {
76 qInfo(AUTOCRYPT_LOG) <<
"Don't update Autocrypt storage, none or multiple From headers found in " << messageid;
80 if (mixup.hasMailHeader(
"Autocrypt")) {
81 KMime::Headers::Base *header =
nullptr;
83 for (
const auto h : mixup.headers(
"Autocrypt")) {
84 const auto params = paramsFromAutocryptHeader(h);
85 if (params.
value(
"addr") != fromAddr->addresses().value(0)) {
89 for (
const auto &key : params.
keys()) {
92 }
else if (key ==
"prefer-encrypt") {
94 }
else if (key ==
"keydata") {
96 }
else if (key[0] ==
'_') {
112 const auto params = paramsFromAutocryptHeader(header);
113 auto recipient = storage->addRecipient(params.
value(
"addr"));
114 recipient->updateFromMessage(mixup, header);
115 qInfo(AUTOCRYPT_LOG) <<
"Update Autocrypt information for " << recipient->addr() <<
" from " << messageid;
117 qInfo(AUTOCRYPT_LOG) <<
"Don't update Autocrypt storage, because we have multiple valid Autocrypt headers found in " << messageid;
120 auto recipient = storage->getRecipient(fromAddr->addresses().value(0));
122 recipient->updateFromMessage(mixup,
nullptr);
123 qInfo(AUTOCRYPT_LOG) <<
"Update Autocrypt information for " << recipient->addr() <<
" from " << messageid;
127 if (mixup.hasMailHeader(
"Autocrypt-Gossip")) {
128 MimeTreeParser::MessagePart::Ptr messagePart(
nullptr);
129 for (
const auto &mp : mixup.messagePartsOfMailHeader(
"Autocrypt-Gossip")) {
130 if (mp.staticCast<MimeTreeParser::EncryptedMessagePart>()) {
136 for (
const auto &header : messagePart->headers(
"Autocrypt-Gossip")) {
137 const auto params = paramsFromAutocryptHeader(header);
138 auto recipient = storage->addRecipient(params.
value(
"addr"));
139 recipient->updateFromGossip(mixup, header);
140 qInfo(AUTOCRYPT_LOG) <<
"Update Autocrypt Gossip information for" << recipient->addr() <<
" from " << messageid;
QList< QByteArray > split(char sep) const const
QList< Key > keys() const const
T value(const Key &key) const const