diff options
author | Christian Mollekopf <chrigi_1@fastmail.fm> | 2017-08-03 08:44:40 -0600 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2017-08-03 08:44:40 -0600 |
commit | c71bc1b1fdd4055dfe2e2155961827b8652dd96c (patch) | |
tree | 866f35cd91af26a474eddd4f534b355f0734f53b /framework/src/domain/mime/mailtemplates.cpp | |
parent | 1f67b45ec91d7bb201adc980f1019ef2f975b922 (diff) | |
download | kube-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.cpp | 34 |
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 | |||
42 | namespace KMime { | 44 | namespace KMime { |
43 | namespace Types { | 45 | namespace Types { |
44 | static bool operator==(const KMime::Types::AddrSpec &left, const KMime::Types::AddrSpec &right) | 46 | static 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 | ||
933 | KMime::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) | 934 | KMime::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 | } |