From c1fc67e40c1b467d50aa27a676fa65c25b767872 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Thu, 23 Nov 2017 15:53:52 +0100 Subject: Encrypted mails --- framework/src/domain/mime/mailtemplates.cpp | 45 +++++++++++++++-------------- 1 file changed, 23 insertions(+), 22 deletions(-) (limited to 'framework/src/domain/mime/mailtemplates.cpp') diff --git a/framework/src/domain/mime/mailtemplates.cpp b/framework/src/domain/mime/mailtemplates.cpp index bbe079d8..5f5b35df 100644 --- a/framework/src/domain/mime/mailtemplates.cpp +++ b/framework/src/domain/mime/mailtemplates.cpp @@ -958,7 +958,7 @@ static KMime::Types::Mailbox::List stringListToMailboxes(const QStringList &list return mailboxes; } -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, bool htmlBody, const QList &attachments, const std::vector &signingKeys) +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, bool htmlBody, const QList &attachments, const std::vector &signingKeys, const std::vector &encryptionKeys) { auto mail = existingMessage; if (!mail) { @@ -995,41 +995,42 @@ KMime::Message::Ptr MailTemplates::createMessage(KMime::Message::Ptr existingMes } mail->assemble(); - KMime::Content *bodyPart; - if (!attachments.isEmpty()) { - bodyPart = new KMime::Content; - bodyPart->contentType(true)->setMimeType("multipart/mixed"); - bodyPart->contentType()->setBoundary(KMime::multiPartBoundary()); - bodyPart->contentTransferEncoding()->setEncoding(KMime::Headers::CE7Bit); - bodyPart->setPreamble("This is a multi-part message in MIME format.\n"); - bodyPart->addContent(createBodyPart(body.toUtf8(), htmlBody)); - for (const auto &attachment : attachments) { - bodyPart->addContent(createAttachmentPart(attachment.data, attachment.filename, attachment.isInline, attachment.mimeType, attachment.name)); + std::unique_ptr bodyPart{[&] { + if (!attachments.isEmpty()) { + auto bodyPart = new KMime::Content; + bodyPart->contentType(true)->setMimeType("multipart/mixed"); + bodyPart->contentType()->setBoundary(KMime::multiPartBoundary()); + bodyPart->contentTransferEncoding()->setEncoding(KMime::Headers::CE7Bit); + bodyPart->setPreamble("This is a multi-part message in MIME format.\n"); + bodyPart->addContent(createBodyPart(body.toUtf8(), htmlBody)); + for (const auto &attachment : attachments) { + bodyPart->addContent(createAttachmentPart(attachment.data, attachment.filename, attachment.isInline, attachment.mimeType, attachment.name)); + } + return bodyPart; + } else { + return createBodyPart(body.toUtf8(), htmlBody); } - } else { - bodyPart = createBodyPart(body.toUtf8(), htmlBody); - } + }()}; bodyPart->assemble(); - KMime::Content *signedResult = nullptr; - if (!signingKeys.empty()) { - signedResult = MailCrypto::sign(bodyPart, signingKeys); - if (!signedResult) { + QByteArray bodyData; + if (!signingKeys.empty() || !encryptionKeys.empty()) { + auto result = MailCrypto::processCrypto(bodyPart.get(), signingKeys, encryptionKeys, MailCrypto::OPENPGP); + if (!result) { qWarning() << "Signing failed"; return {}; } + bodyData = result->encodedContent(); } else { if (!bodyPart->contentType(false)) { bodyPart->contentType(true)->setMimeType("text/plain"); bodyPart->assemble(); } + bodyData = bodyPart->encodedContent(); } - const QByteArray allData = mail->head() + (signedResult ? signedResult->encodedContent() : bodyPart->encodedContent()); - delete bodyPart; KMime::Message::Ptr resultMessage(new KMime::Message); - resultMessage->setContent(allData); + resultMessage->setContent(mail->head() + bodyData); resultMessage->parse(); // Not strictly necessary. - return resultMessage; } -- cgit v1.2.3