From 7a1be6819dd46a3e3d4be8383ad5fd28895603cd Mon Sep 17 00:00:00 2001 From: Minijackson Date: Mon, 5 Mar 2018 14:56:02 +0100 Subject: Fix Signed + Encrypted mail --- framework/src/domain/mime/mailcrypto.cpp | 59 ++++++++++++++++---------------- 1 file changed, 29 insertions(+), 30 deletions(-) diff --git a/framework/src/domain/mime/mailcrypto.cpp b/framework/src/domain/mime/mailcrypto.cpp index 62a71e42..2dc2d245 100644 --- a/framework/src/domain/mime/mailcrypto.cpp +++ b/framework/src/domain/mime/mailcrypto.cpp @@ -145,21 +145,20 @@ KMime::Content *setBodyAndCTE(QByteArray &encodedBody, KMime::Headers::ContentTy return ret; } -void makeToplevelContentType(KMime::Content *content, bool sign, const QByteArray &hashAlgo) +void makeToplevelContentType(KMime::Content *content, bool encrypt, const QByteArray &hashAlgo) { - //Kleo::CryptoMessageFormat format, + //Kleo::CryptoMessageFormat format, // switch (format) { // default: // case Kleo::InlineOpenPGPFormat: // case Kleo::OpenPGPMIMEFormat: - if (sign) { + if (encrypt) { + content->contentType()->setMimeType(QByteArrayLiteral("multipart/encrypted")); + content->contentType()->setParameter(QStringLiteral("protocol"), QStringLiteral("application/pgp-encrypted")); + } else { content->contentType()->setMimeType(QByteArrayLiteral("multipart/signed")); content->contentType()->setParameter(QStringLiteral("protocol"), QStringLiteral("application/pgp-signature")); content->contentType()->setParameter(QStringLiteral("micalg"), QString::fromLatin1(QByteArray(QByteArrayLiteral("pgp-") + hashAlgo)).toLower()); - - } else { - content->contentType()->setMimeType(QByteArrayLiteral("multipart/encrypted")); - content->contentType()->setParameter(QStringLiteral("protocol"), QStringLiteral("application/pgp-encrypted")); } return; // case Kleo::SMIMEFormat: @@ -187,17 +186,17 @@ void makeToplevelContentType(KMime::Content *content, bool sign, const QByteArra // } } -void setNestedContentType(KMime::Content *content, bool sign) +void setNestedContentType(KMime::Content *content, bool encrypt) { // , Kleo::CryptoMessageFormat format // switch (format) { // case Kleo::OpenPGPMIMEFormat: - if (sign) { + if (encrypt) { + content->contentType()->setMimeType(QByteArrayLiteral("application/octet-stream")); + } else { content->contentType()->setMimeType(QByteArrayLiteral("application/pgp-signature")); content->contentType()->setParameter(QStringLiteral("name"), QString::fromLatin1("signature.asc")); content->contentDescription()->from7BitString("This is a digitally signed message part."); - } else { - content->contentType()->setMimeType(QByteArrayLiteral("application/octet-stream")); } return; // case Kleo::SMIMEFormat: @@ -214,11 +213,11 @@ void setNestedContentType(KMime::Content *content, bool sign) // } } -void setNestedContentDisposition(KMime::Content *content, bool sign) +void setNestedContentDisposition(KMime::Content *content, bool encrypt) { -// Kleo::CryptoMessageFormat format, +// Kleo::CryptoMessageFormat format, // if (!sign && format & Kleo::OpenPGPMIMEFormat) { - if (!sign) { + if (encrypt) { content->contentDisposition()->setDisposition(KMime::Headers::CDinline); content->contentDisposition()->setFilename(QStringLiteral("msg.asc")); // } else if (sign && format & Kleo::SMIMEFormat) { @@ -238,7 +237,7 @@ void setNestedContentDisposition(KMime::Content *content, bool sign) // } // } -KMime::Content *composeHeadersAndBody(KMime::Content *orig, QByteArray encodedBody, bool sign, const QByteArray &hashAlgo) +KMime::Content *composeHeadersAndBody(KMime::Content *orig, QByteArray encodedBody, bool encrypt, const QByteArray &hashAlgo) { // Kleo::CryptoMessageFormat format, KMime::Content *result = new KMime::Content; @@ -248,7 +247,7 @@ KMime::Content *composeHeadersAndBody(KMime::Content *orig, QByteArray encodedBo // if (!(format & Kleo::InlineOpenPGPFormat)) { // make a MIME message // qDebug() << "making MIME message, format:" << format; - makeToplevelContentType(result, sign, hashAlgo); + makeToplevelContentType(result, encrypt, hashAlgo); // if (makeMultiMime(sign)) { // sign/enc PGPMime, sign SMIME if (true) { // sign/enc PGPMime, sign SMIME @@ -263,20 +262,10 @@ KMime::Content *composeHeadersAndBody(KMime::Content *orig, QByteArray encodedBo // Build a MIME part holding the code information // taking the body contents returned in ciphertext. KMime::Content *code = new KMime::Content; - setNestedContentType(code, sign); - setNestedContentDisposition(code, sign); + setNestedContentType(code, encrypt); + setNestedContentDisposition(code, encrypt); - if (sign) { // sign PGPMime, sign SMIME - // if (format & Kleo::AnySMIME) { // sign SMIME - // code->contentTransferEncoding()->setEncoding(KMime::Headers::CEbase64); - // code->contentTransferEncoding()->needToEncode(); - // code->setBody(encodedBody); - // } else { // sign PGPMmime - setBodyAndCTE(encodedBody, orig->contentType(), code); - // } - result->addContent(orig); - result->addContent(code); - } else { // enc PGPMime + if (encrypt) { // enc PGPMime (and or sign) setBodyAndCTE(encodedBody, orig->contentType(), code); // Build a MIME part holding the version information @@ -290,6 +279,16 @@ KMime::Content *composeHeadersAndBody(KMime::Content *orig, QByteArray encodedBo result->addContent(vers); result->addContent(code); + } else { // sign PGPMime, sign SMIME + // if (format & Kleo::AnySMIME) { // sign SMIME + // code->contentTransferEncoding()->setEncoding(KMime::Headers::CEbase64); + // code->contentTransferEncoding()->needToEncode(); + // code->setBody(encodedBody); + // } else { // sign PGPMmime + setBodyAndCTE(encodedBody, orig->contentType(), code); + // } + result->addContent(orig); + result->addContent(code); } } else { //enc SMIME, sign/enc SMIMEOpaque result->contentTransferEncoding()->setEncoding(KMime::Headers::CEbase64); @@ -453,7 +452,7 @@ KMime::Content *MailCrypto::processCrypto(KMime::Content *content, const std::ve return nullptr; } - return composeHeadersAndBody(content, resultContent, sign, hashAlgo); + return composeHeadersAndBody(content, resultContent, encrypt, hashAlgo); } KMime::Content *MailCrypto::sign(KMime::Content *content, const std::vector &signers) -- cgit v1.2.3