summaryrefslogtreecommitdiffstats
path: root/framework/src/domain/mime/mailtemplates.cpp
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2017-08-03 08:44:40 -0600
committerChristian Mollekopf <chrigi_1@fastmail.fm>2017-08-03 08:44:40 -0600
commitc71bc1b1fdd4055dfe2e2155961827b8652dd96c (patch)
tree866f35cd91af26a474eddd4f534b355f0734f53b /framework/src/domain/mime/mailtemplates.cpp
parent1f67b45ec91d7bb201adc980f1019ef2f975b922 (diff)
downloadkube-c71bc1b1fdd4055dfe2e2155961827b8652dd96c.tar.gz
kube-c71bc1b1fdd4055dfe2e2155961827b8652dd96c.zip
A first signed message
Diffstat (limited to 'framework/src/domain/mime/mailtemplates.cpp')
-rw-r--r--framework/src/domain/mime/mailtemplates.cpp34
1 files changed, 28 insertions, 6 deletions
diff --git a/framework/src/domain/mime/mailtemplates.cpp b/framework/src/domain/mime/mailtemplates.cpp
index 608f7546..dc713ee4 100644
--- a/framework/src/domain/mime/mailtemplates.cpp
+++ b/framework/src/domain/mime/mailtemplates.cpp
@@ -39,6 +39,8 @@
39 39
40#include <mimetreeparser/objecttreeparser.h> 40#include <mimetreeparser/objecttreeparser.h>
41 41
42#include "mailcrypto.h"
43
42namespace KMime { 44namespace KMime {
43 namespace Types { 45 namespace Types {
44static bool operator==(const KMime::Types::AddrSpec &left, const KMime::Types::AddrSpec &right) 46static bool operator==(const KMime::Types::AddrSpec &left, const KMime::Types::AddrSpec &right)
@@ -910,7 +912,6 @@ static KMime::Content *createBodyPart(const QByteArray &body) {
910 auto mainMessage = new KMime::Content; 912 auto mainMessage = new KMime::Content;
911 mainMessage->setBody(body); 913 mainMessage->setBody(body);
912 mainMessage->contentType(true)->setMimeType("text/plain"); 914 mainMessage->contentType(true)->setMimeType("text/plain");
913 // return MailCrypto::sign(mainMessage, {});
914 return mainMessage; 915 return mainMessage;
915} 916}
916 917
@@ -930,12 +931,13 @@ static void applyAddresses(const QStringList &list, std::function<void(const QBy
930// applyAddresses(KEmailAddress::splitAddressList(list), callback); 931// applyAddresses(KEmailAddress::splitAddressList(list), callback);
931// } 932// }
932 933
933KMime::Message::Ptr MailTemplates::createMessage(KMime::Message::Ptr existingMessage, const QStringList &to, const QStringList &cc, const QStringList &bcc, const KMime::Types::Mailbox &from, const QString &subject, const QString &body, const QList<Attachment> &attachments) 934KMime::Message::Ptr MailTemplates::createMessage(KMime::Message::Ptr existingMessage, const QStringList &to, const QStringList &cc, const QStringList &bcc, const KMime::Types::Mailbox &from, const QString &subject, const QString &body, const QList<Attachment> &attachments, const std::vector<GpgME::Key> &signingKeys)
934{ 935{
935 auto mail = existingMessage; 936 auto mail = existingMessage;
936 if (!mail) { 937 if (!mail) {
937 mail = KMime::Message::Ptr::create(); 938 mail = KMime::Message::Ptr::create();
938 } 939 }
940
939 mail->to(true)->clear(); 941 mail->to(true)->clear();
940 applyAddresses(to, [&](const QByteArray &addrSpec, const QByteArray &displayName) { 942 applyAddresses(to, [&](const QByteArray &addrSpec, const QByteArray &displayName) {
941 mail->to(true)->addAddress(addrSpec, displayName); 943 mail->to(true)->addAddress(addrSpec, displayName);
@@ -966,6 +968,7 @@ KMime::Message::Ptr MailTemplates::createMessage(KMime::Message::Ptr existingMes
966 mail->date(true)->setDateTime(QDateTime::currentDateTimeUtc()); 968 mail->date(true)->setDateTime(QDateTime::currentDateTimeUtc());
967 } 969 }
968 970
971 KMime::Content *bodyPart;
969 if (!attachments.isEmpty()) { 972 if (!attachments.isEmpty()) {
970 mail->contentType(true)->setMimeType("multipart/mixed"); 973 mail->contentType(true)->setMimeType("multipart/mixed");
971 mail->contentType()->setBoundary(KMime::multiPartBoundary()); 974 mail->contentType()->setBoundary(KMime::multiPartBoundary());
@@ -974,13 +977,32 @@ KMime::Message::Ptr MailTemplates::createMessage(KMime::Message::Ptr existingMes
974 for (const auto &attachment : attachments) { 977 for (const auto &attachment : attachments) {
975 mail->addContent(createAttachmentPart(attachment.data, attachment.filename, attachment.isInline, attachment.mimeType, attachment.name)); 978 mail->addContent(createAttachmentPart(attachment.data, attachment.filename, attachment.isInline, attachment.mimeType, attachment.name));
976 } 979 }
977 mail->addContent(createBodyPart(body.toUtf8())); 980 bodyPart = createBodyPart(body.toUtf8());
978 } else { 981 } else {
979 //FIXME same implementation as above for attachments 982 //FIXME same implementation as above for attachments
980 mail->setBody(body.toUtf8()); 983 bodyPart = createBodyPart(body.toUtf8());
981 mail->contentType(true)->setMimeType("text/plain");
982 } 984 }
985 mail->assemble();
983 986
987 KMime::Content *signedResult = nullptr;
988 if (!signingKeys.empty()) {
989 signedResult = MailCrypto::sign(bodyPart, signingKeys);
990 if (!signedResult) {
991 qWarning() << "Signing failed";
992 return {};
993 }
994 } else {
995 if (!mail->contentType(false)) {
996 mail->contentType(true)->setMimeType("text/plain");
997 }
998 }
984 mail->assemble(); 999 mail->assemble();
985 return mail; 1000
1001 const QByteArray allData = mail->head() + (signedResult ? signedResult->encodedContent() : bodyPart->encodedContent());
1002 delete bodyPart;
1003 KMime::Message::Ptr resultMessage(new KMime::Message);
1004 resultMessage->setContent(allData);
1005 resultMessage->parse(); // Not strictly necessary.
1006
1007 return resultMessage;
986} 1008}