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"