diff --git a/messageviewer/autotests/data/smime-cert.mbox b/messageviewer/autotests/data/smime-cert.mbox new file mode 100644 --- /dev/null +++ b/messageviewer/autotests/data/smime-cert.mbox @@ -0,0 +1,24 @@ +From test@example.com Sat, 13 Apr 2013 01:54:30 +0200 +From: test +To: you@you.com +Subject: test +Date: Sat, 13 Apr 2013 01:54:30 +0200 +Message-ID: <1576646.QQxzHWx8dA@tabin> +X-KMail-Identity: 505942601 +User-Agent: KMail/4.10.2 (Linux/3.9.0-rc4-experimental-amd64; KDE/4.10.60; x86_64; git-fc9b82c; 2013-04-11) +MIME-Version: 1.0 +Content-Type: application/pkcs7-mime; name="smime.crt"; smime-type="certs-only" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; filename="smime.crt" + +asdfasdfasdfasdfasdfasdfasdfasdf +asdfasdfadsfsadfasdf +asdfasdf +sadfas +dfasdf +sadf +sadf +adsf +adsf +asdf + diff --git a/messageviewer/autotests/unencryptedmessagetest.cpp b/messageviewer/autotests/unencryptedmessagetest.cpp --- a/messageviewer/autotests/unencryptedmessagetest.cpp +++ b/messageviewer/autotests/unencryptedmessagetest.cpp @@ -42,6 +42,7 @@ void testAsync_data(); void testAsync(); void testInlinePGPEncryptedNotDecrypted(); + void testSMimeAutoCertImport(); }; QTEST_MAIN(UnencryptedMessageTest) @@ -267,4 +268,19 @@ QCOMPARE((bool) unencryptedMessage, false); } +void UnencryptedMessageTest::testSMimeAutoCertImport() +{ + KMime::Message::Ptr originalMessage = readAndParseMail(QStringLiteral("smime-cert.mbox")); + + NodeHelper nodeHelper; + TestHtmlWriter testWriter; + TestCSSHelper testCSSHelper; + MessageViewer::Test::TestObjectTreeSource emptySource(&testWriter, &testCSSHelper); + ObjectTreeParser otp(&emptySource, &nodeHelper); + otp.parseObjectTree(originalMessage.data()); + + QCOMPARE(otp.plainTextContent().toLatin1().data(), ""); + QVERIFY(testWriter.html.contains(QStringLiteral("Sorry, no certificates were found in this message."))); +} + #include "unencryptedmessagetest.moc" diff --git a/messageviewer/src/viewer/messagepart.h b/messageviewer/src/viewer/messagepart.h --- a/messageviewer/src/viewer/messagepart.h +++ b/messageviewer/src/viewer/messagepart.h @@ -33,6 +33,11 @@ class QTextCodec; +namespace GpgME +{ + class ImportResult; +} + namespace KMime { class Content; @@ -176,6 +181,23 @@ bool mOnlyOneMimePart; }; +class CertMessagePart : public MessagePart +{ +public: + typedef QSharedPointer Ptr; + CertMessagePart(MessageViewer::ObjectTreeParser* otp, KMime::Content* node, const Kleo::CryptoBackend::Protocol *cryptoProto, bool autoImport); + virtual ~CertMessagePart(); + + QString text() const Q_DECL_OVERRIDE; + void html(bool decorate) Q_DECL_OVERRIDE; + +private: + KMime::Content* mNode; + bool mAutoImport; + GpgME::ImportResult mImportResult; + const Kleo::CryptoBackend::Protocol *mCryptoProto; +}; + class EncapsulatedRfc822MessagePart : public MessagePart { public: diff --git a/messageviewer/src/viewer/messagepart.cpp b/messageviewer/src/viewer/messagepart.cpp --- a/messageviewer/src/viewer/messagepart.cpp +++ b/messageviewer/src/viewer/messagepart.cpp @@ -19,14 +19,16 @@ #include "messagepart.h" #include "messageviewer_debug.h" +#include #include "objecttreeparser.h" #include #include #include #include +#include #include #include #include @@ -327,6 +329,49 @@ return renderInternalText(); } +//-----CertMessageBlock---------------------- + +CertMessagePart::CertMessagePart(ObjectTreeParser* otp, KMime::Content* node, const Kleo::CryptoBackend::Protocol *cryptoProto, bool autoImport) +: MessagePart(otp, QString()) +, mAutoImport(autoImport) +, mCryptoProto(cryptoProto) +{ + if (!mNode) { + qCWarning(MESSAGEVIEWER_LOG) << "not a valid node"; + return; + } + + if (!mAutoImport) { + return; + } + + const QByteArray certData = node->decodedContent(); + + Kleo::ImportJob *import = mCryptoProto->importJob(); + KleoJobExecutor executor; + mImportResult = executor.exec(import, certData); +} + +CertMessagePart::~CertMessagePart() +{ + +} + +void CertMessagePart::html(bool decorate) +{ + MessageViewer::HtmlWriter *writer = mOtp->htmlWriter(); + + if (!writer) { + return; + } + mOtp->writeCertificateImportResult(mImportResult); +} + +QString CertMessagePart::text() const +{ + return QString(); +} + //-----CryptMessageBlock--------------------- CryptoMessagePart::CryptoMessagePart(ObjectTreeParser *otp, diff --git a/messageviewer/src/viewer/objecttreeparser.h b/messageviewer/src/viewer/objecttreeparser.h --- a/messageviewer/src/viewer/objecttreeparser.h +++ b/messageviewer/src/viewer/objecttreeparser.h @@ -515,6 +515,7 @@ friend class MessagePart; friend class CryptoMessagePart; + friend class CertMessagePart; friend class EncapsulatedRfc822MessagePart; friend class TextMessagePart; }; diff --git a/messageviewer/src/viewer/objecttreeparser.cpp b/messageviewer/src/viewer/objecttreeparser.cpp --- a/messageviewer/src/viewer/objecttreeparser.cpp +++ b/messageviewer/src/viewer/objecttreeparser.cpp @@ -1291,20 +1291,9 @@ if (smimeType == QLatin1String("certs-only")) { result.setNeverDisplayInline(true); - if (!htmlWriter()) { - return false; - } - - if (!MessageViewer::MessageViewerSettings::self()->autoImportKeys()) { - return false; - } - - const QByteArray certData = node->decodedContent(); - Kleo::ImportJob *import = smimeCrypto->importJob(); - KleoJobExecutor executor; - const GpgME::ImportResult res = executor.exec(import, certData); - writeCertificateImportResult(res); + CertMessagePart mp(this, node, smimeCrypto, MessageViewer::MessageViewerSettings::self()->autoImportKeys()); + mp.html(true); return true; }