File indexing completed on 2025-03-09 04:53:54

0001 /*
0002   SPDX-FileCopyrightText: 2009 Klaralvdalens Datakonsult AB, a KDAB Group company, info@kdab.net
0003   SPDX-FileCopyrightText: 2009 Leo Franchi <lfranchi@kde.org>
0004 
0005   SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "encryptjobtest.h"
0009 
0010 #include "cryptofunctions.h"
0011 #include "qtest_messagecomposer.h"
0012 #include "setupenv.h"
0013 
0014 #include <KMime/Content>
0015 
0016 #include <Libkleo/Enum>
0017 
0018 #include <MessageComposer/Composer>
0019 #include <MessageComposer/EncryptJob>
0020 #include <MessageComposer/GlobalPart>
0021 #include <MessageComposer/MainTextJob>
0022 #include <MessageComposer/TextPart>
0023 #include <MessageComposer/TransparentJob>
0024 #include <MessageComposer/Util>
0025 
0026 #include <MimeTreeParser/NodeHelper>
0027 #include <MimeTreeParser/ObjectTreeParser>
0028 
0029 #include <QGpgME/DecryptVerifyJob>
0030 #include <QGpgME/Protocol>
0031 
0032 #include <gpgme++/decryptionresult.h>
0033 #include <gpgme++/verificationresult.h>
0034 
0035 #include <cstdlib>
0036 
0037 #include <QTest>
0038 #include <decryptionresult.h>
0039 
0040 QTEST_MAIN(EncryptJobTest)
0041 
0042 using namespace MessageComposer;
0043 
0044 void EncryptJobTest::initTestCase()
0045 {
0046     Test::setupEnv();
0047 }
0048 
0049 void EncryptJobTest::testContentDirect()
0050 {
0051     Composer composer;
0052     const QList<QByteArray> charsets = {"us-ascii"};
0053     composer.globalPart()->setCharsets(charsets);
0054 
0055     TextPart part;
0056     part.setWordWrappingEnabled(false);
0057     part.setCleanPlainText(QStringLiteral("one flew over the cuckoo's nest"));
0058 
0059     auto mainTextJob = new MainTextJob(&part, &composer);
0060 
0061     QVERIFY(mainTextJob);
0062 
0063     VERIFYEXEC(mainTextJob);
0064 
0065     const std::vector<GpgME::Key> &keys = Test::getKeys();
0066 
0067     auto eJob = new EncryptJob(&composer);
0068 
0069     QVERIFY(eJob);
0070 
0071     const QStringList recipients = {QStringLiteral("test@kolab.org")};
0072 
0073     eJob->setContent(mainTextJob->content());
0074     eJob->setCryptoMessageFormat(Kleo::OpenPGPMIMEFormat);
0075     eJob->setRecipients(recipients);
0076     eJob->setEncryptionKeys(keys);
0077 
0078     checkEncryption(eJob);
0079 }
0080 
0081 void EncryptJobTest::testContentChained()
0082 {
0083     Composer composer;
0084     const QList<QByteArray> charsets = {"us-ascii"};
0085     composer.globalPart()->setCharsets(charsets);
0086 
0087     TextPart part;
0088     part.setWordWrappingEnabled(false);
0089     part.setCleanPlainText(QStringLiteral("one flew over the cuckoo's nest"));
0090 
0091     auto mainTextJob = new MainTextJob(&part, &composer);
0092 
0093     QVERIFY(mainTextJob);
0094 
0095     VERIFYEXEC(mainTextJob);
0096 
0097     const std::vector<GpgME::Key> &keys = Test::getKeys();
0098     auto eJob = new EncryptJob(&composer);
0099 
0100     const QStringList recipients = {QStringLiteral("test@kolab.org")};
0101 
0102     eJob->setCryptoMessageFormat(Kleo::OpenPGPMIMEFormat);
0103     eJob->setRecipients(recipients);
0104     eJob->setEncryptionKeys(keys);
0105     eJob->setContent(mainTextJob->content());
0106 
0107     checkEncryption(eJob);
0108 }
0109 
0110 void EncryptJobTest::testContentSubjobChained()
0111 {
0112     const std::vector<GpgME::Key> &keys = Test::getKeys();
0113 
0114     const QByteArray data(QStringLiteral("one flew over the cuckoo's nest").toUtf8());
0115     KMime::Message skeletonMessage;
0116 
0117     auto content = new KMime::Content;
0118     content->contentType(true)->setMimeType("text/plain");
0119     content->setBody(data);
0120 
0121     auto tJob = new TransparentJob;
0122     tJob->setContent(content);
0123 
0124     const QStringList recipients = {QStringLiteral("test@kolab.org")};
0125 
0126     Composer composer;
0127     auto eJob = new EncryptJob(&composer);
0128 
0129     eJob->setCryptoMessageFormat(Kleo::OpenPGPMIMEFormat);
0130     eJob->setRecipients(recipients);
0131     eJob->setEncryptionKeys(keys);
0132     eJob->setSkeletonMessage(&skeletonMessage);
0133     eJob->appendSubjob(tJob);
0134 
0135     checkEncryption(eJob);
0136 }
0137 
0138 void EncryptJobTest::testHeaders()
0139 {
0140     const std::vector<GpgME::Key> &keys = Test::getKeys();
0141 
0142     auto eJob = new EncryptJob(this);
0143 
0144     QVERIFY(eJob);
0145 
0146     const QByteArray data(QStringLiteral("one flew over the cuckoo's nest").toUtf8());
0147     auto content = new KMime::Content;
0148     content->setBody(data);
0149 
0150     const QStringList recipients = {QStringLiteral("test@kolab.org")};
0151 
0152     eJob->setContent(content);
0153     eJob->setCryptoMessageFormat(Kleo::OpenPGPMIMEFormat);
0154     eJob->setRecipients(recipients);
0155     eJob->setEncryptionKeys(keys);
0156 
0157     VERIFYEXEC(eJob);
0158 
0159     QByteArray mimeType("multipart/encrypted");
0160     QByteArray charset("ISO-8859-1");
0161 
0162     KMime::Content *result = eJob->content();
0163     result->assemble();
0164 
0165     QVERIFY(result->contentType(false));
0166     QCOMPARE(result->contentType(false)->mimeType(), mimeType);
0167     QCOMPARE(result->contentType(false)->charset(), charset);
0168     QCOMPARE(result->contentType(false)->parameter(QStringLiteral("protocol")), QStringLiteral("application/pgp-encrypted"));
0169     QCOMPARE(result->contentTransferEncoding()->encoding(), KMime::Headers::CE7Bit);
0170 
0171     delete result;
0172 }
0173 
0174 void EncryptJobTest::testProtectedHeaders_data()
0175 {
0176     QTest::addColumn<bool>("protectedHeaders");
0177     QTest::addColumn<bool>("protectedHeadersObvoscate");
0178     QTest::addColumn<QString>("referenceFile");
0179 
0180     QTest::newRow("simple-obvoscate") << true << true << QStringLiteral("protected_headers-obvoscate.mbox");
0181     QTest::newRow("simple-non-obvoscate") << true << false << QStringLiteral("protected_headers-non-obvoscate.mbox");
0182     QTest::newRow("non-protected_headers") << false << false << QStringLiteral("non-protected_headers.mbox");
0183 }
0184 
0185 void EncryptJobTest::testProtectedHeaders()
0186 {
0187     QFETCH(bool, protectedHeaders);
0188     QFETCH(bool, protectedHeadersObvoscate);
0189     QFETCH(QString, referenceFile);
0190 
0191     const std::vector<GpgME::Key> &keys = Test::getKeys();
0192 
0193     Composer composer;
0194     auto eJob = new EncryptJob(&composer);
0195 
0196     QVERIFY(eJob);
0197 
0198     const QByteArray data(QStringLiteral("one flew over the cuckoo's nest").toUtf8());
0199     const QString subject(QStringLiteral("asdfghjklö"));
0200 
0201     auto content = new KMime::Content;
0202     content->contentType(true)->setMimeType("text/plain");
0203     content->setBody(data);
0204 
0205     KMime::Message skeletonMessage;
0206     skeletonMessage.contentType(true)->setMimeType("foo/bla");
0207     skeletonMessage.to(true)->from7BitString("to@test.de, to2@test.de");
0208     skeletonMessage.cc(true)->from7BitString("cc@test.de, cc2@test.de");
0209     skeletonMessage.bcc(true)->from7BitString("bcc@test.de, bcc2@test.de");
0210     skeletonMessage.subject(true)->fromUnicodeString(subject, "utf-8");
0211 
0212     const QStringList recipients = {QStringLiteral("test@kolab.org")};
0213 
0214     eJob->setContent(content);
0215     eJob->setCryptoMessageFormat(Kleo::OpenPGPMIMEFormat);
0216     eJob->setRecipients(recipients);
0217     eJob->setEncryptionKeys(keys);
0218     eJob->setSkeletonMessage(&skeletonMessage);
0219     eJob->setProtectedHeaders(protectedHeaders);
0220     eJob->setProtectedHeadersObvoscate(protectedHeadersObvoscate);
0221 
0222     VERIFYEXEC(eJob);
0223 
0224     if (protectedHeadersObvoscate) {
0225         QCOMPARE(skeletonMessage.subject()->as7BitString(false), "...");
0226     } else {
0227         QCOMPARE(skeletonMessage.subject()->asUnicodeString(), subject);
0228     }
0229 
0230     KMime::Content *result = eJob->content();
0231     result->assemble();
0232 
0233     KMime::Content *encPart = Util::findTypeInMessage(result, "application", "octet-stream");
0234     KMime::Content tempNode;
0235     {
0236         QByteArray plainText;
0237         auto job = QGpgME::openpgp()->decryptVerifyJob();
0238         job->exec(encPart->encodedBody(), plainText);
0239 
0240         tempNode.setContent(KMime::CRLFtoLF(plainText.constData()));
0241         tempNode.parse();
0242     }
0243     if (protectedHeadersObvoscate) {
0244         tempNode.contentType(false)->setBoundary("123456789");
0245         tempNode.assemble();
0246     }
0247 
0248     delete result;
0249 
0250     Test::compareFile(&tempNode, QStringLiteral(MAIL_DATA_DIR "/") + referenceFile);
0251 }
0252 
0253 void EncryptJobTest::testSetGnupgHome()
0254 {
0255     Composer composer;
0256 
0257     KMime::Content content;
0258     content.setBody("one flew over the cuckoo's nest");
0259 
0260     const std::vector<GpgME::Key> &keys = Test::getKeys();
0261 
0262     const QStringList recipients = {QStringLiteral("test@kolab.org")};
0263 
0264     QTemporaryDir dir;
0265     {
0266         auto eJob = new EncryptJob(&composer);
0267         QVERIFY(eJob);
0268 
0269         eJob->setContent(&content);
0270         eJob->setCryptoMessageFormat(Kleo::OpenPGPMIMEFormat);
0271         eJob->setRecipients(recipients);
0272         eJob->setEncryptionKeys(keys);
0273         eJob->setGnupgHome(dir.path());
0274         QCOMPARE(eJob->exec(), false);
0275     }
0276 
0277     for (const auto &key : keys) {
0278         Test::populateKeyring(dir.path(), key);
0279     }
0280     auto eJob = new EncryptJob(&composer);
0281     QVERIFY(eJob);
0282 
0283     eJob->setContent(&content);
0284     eJob->setCryptoMessageFormat(Kleo::OpenPGPMIMEFormat);
0285     eJob->setRecipients(recipients);
0286     eJob->setEncryptionKeys(keys);
0287     eJob->setGnupgHome(dir.path());
0288     checkEncryption(eJob);
0289 }
0290 
0291 void EncryptJobTest::checkEncryption(EncryptJob *eJob)
0292 {
0293     VERIFYEXEC(eJob);
0294 
0295     KMime::Content *result = eJob->content();
0296     Q_ASSERT(result);
0297     result->assemble();
0298 
0299     ComposerTestUtil::verifyEncryption(result, QStringLiteral("one flew over the cuckoo's nest").toUtf8(), Kleo::OpenPGPMIMEFormat);
0300 
0301     delete result;
0302 }
0303 
0304 #include "moc_encryptjobtest.cpp"