File indexing completed on 2025-02-16 04:57:36
0001 /* 0002 SPDX-FileCopyrightText: 2021 Sandro Knauß <sknauss@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "protectedheaderstest.h" 0008 #include "setupenv.h" 0009 #include "util.h" 0010 0011 #include <MimeTreeParser/MessagePart> 0012 #include <MimeTreeParser/NodeHelper> 0013 #include <MimeTreeParser/ObjectTreeParser> 0014 #include <MimeTreeParser/SimpleObjectTreeSource> 0015 0016 #include <QTest> 0017 0018 using namespace MimeTreeParser; 0019 0020 QTEST_MAIN(ProtectedHeadersTest) 0021 0022 void ProtectedHeadersTest::initTestCase() 0023 { 0024 Test::setupEnv(); 0025 qputenv("TZ", "GMT"); 0026 } 0027 0028 void ProtectedHeadersTest::testMailHeaderAsBase_data() 0029 { 0030 QTest::addColumn<QString>("mailFileName"); 0031 0032 QTest::newRow("encrypted") << QStringLiteral("openpgp-encrypted-protected-headers.mbox"); 0033 QTest::newRow("signed") << QStringLiteral("openpgp-signed-protected-headers.mbox"); 0034 QTest::newRow("encrypted+signed") << QStringLiteral("openpgp-encrypted+signed-protected-headers.mbox"); 0035 } 0036 0037 void ProtectedHeadersTest::testMailHeaderAsBase() 0038 { 0039 QFETCH(QString, mailFileName); 0040 auto originalMessage = readAndParseMail(mailFileName); 0041 NodeHelper nodeHelper; 0042 SimpleObjectTreeSource testSource; 0043 ObjectTreeParser otp(&testSource, &nodeHelper); 0044 testSource.setDecryptMessage(true); 0045 otp.parseObjectTree(originalMessage.data()); 0046 0047 // test overwrite 0048 QCOMPARE(nodeHelper.mailHeaderAsBase("from", originalMessage.data())->asUnicodeString(), QStringLiteral("you@example.com")); 0049 QCOMPARE(nodeHelper.mailHeaderAsBase("to", originalMessage.data())->asUnicodeString(), QStringLiteral("me@example.com")); 0050 QCOMPARE(nodeHelper.mailHeaderAsBase("subject", originalMessage.data())->asUnicodeString(), QStringLiteral("hidden subject")); 0051 QCOMPARE(nodeHelper.mailHeaderAsBase("cc", originalMessage.data())->asUnicodeString(), QStringLiteral("cc@example.com")); 0052 QCOMPARE(nodeHelper.dateHeader(originalMessage.data()), QDateTime(QDate(2018, 1, 2), QTime(3, 4, 5))); 0053 0054 // test protected only headers 0055 QCOMPARE(nodeHelper.mailHeaderAsBase("message-id", originalMessage.data())->asUnicodeString(), QStringLiteral("<myhiddenreference@me>")); 0056 QCOMPARE(nodeHelper.mailHeaderAsBase("references", originalMessage.data())->asUnicodeString(), QStringLiteral("<hiddenreference@hidden>")); 0057 QCOMPARE(nodeHelper.mailHeaderAsBase("in-reply-to", originalMessage.data())->asUnicodeString(), QStringLiteral("<hiddenreference@hidden>")); 0058 0059 // test non-existing headers 0060 QCOMPARE(nodeHelper.mailHeaderAsBase("invalid", originalMessage.data()), nullptr); 0061 0062 // test envelope headers 0063 QCOMPARE(nodeHelper.mailHeaderAsBase("user-agent", originalMessage.data())->asUnicodeString(), 0064 QStringLiteral("KMail/4.6 pre (Linux/2.6.34-rc2-2-default; KDE/4.5.60; x86_64; ; )")); 0065 } 0066 0067 void ProtectedHeadersTest::testHeaders_data() 0068 { 0069 QTest::addColumn<QString>("mailFileName"); 0070 0071 QTest::newRow("encrypted") << QStringLiteral("openpgp-encrypted-protected-headers.mbox"); 0072 QTest::newRow("signed") << QStringLiteral("openpgp-signed-protected-headers.mbox"); 0073 QTest::newRow("encrypted+signed") << QStringLiteral("openpgp-encrypted+signed-protected-headers.mbox"); 0074 } 0075 0076 void ProtectedHeadersTest::testHeaders() 0077 { 0078 QFETCH(QString, mailFileName); 0079 auto originalMessage = readAndParseMail(mailFileName); 0080 NodeHelper nodeHelper; 0081 SimpleObjectTreeSource testSource; 0082 ObjectTreeParser otp(&testSource, &nodeHelper); 0083 testSource.setDecryptMessage(true); 0084 otp.parseObjectTree(originalMessage.data()); 0085 0086 // test overwrite 0087 QCOMPARE(nodeHelper.headers("from", originalMessage.data()).size(), 1); 0088 QCOMPARE(nodeHelper.headers("from", originalMessage.data())[0]->asUnicodeString(), QStringLiteral("you@example.com")); 0089 QCOMPARE(nodeHelper.headers("to", originalMessage.data()).size(), 1); 0090 QCOMPARE(nodeHelper.headers("to", originalMessage.data())[0]->asUnicodeString(), QStringLiteral("me@example.com")); 0091 QCOMPARE(nodeHelper.headers("subject", originalMessage.data()).size(), 1); 0092 QCOMPARE(nodeHelper.headers("subject", originalMessage.data())[0]->asUnicodeString(), QStringLiteral("hidden subject")); 0093 QCOMPARE(nodeHelper.headers("cc", originalMessage.data()).size(), 1); 0094 QCOMPARE(nodeHelper.headers("cc", originalMessage.data())[0]->asUnicodeString(), QStringLiteral("cc@example.com")); 0095 QCOMPARE(nodeHelper.headers("date", originalMessage.data()).size(), 1); 0096 QCOMPARE(nodeHelper.dateHeader(originalMessage.data()), QDateTime(QDate(2018, 1, 2), QTime(3, 4, 5))); 0097 0098 // test protected only headers 0099 QCOMPARE(nodeHelper.headers("message-id", originalMessage.data()).size(), 1); 0100 QCOMPARE(nodeHelper.headers("message-id", originalMessage.data())[0]->asUnicodeString(), QStringLiteral("<myhiddenreference@me>")); 0101 QCOMPARE(nodeHelper.headers("references", originalMessage.data()).size(), 1); 0102 QCOMPARE(nodeHelper.headers("references", originalMessage.data())[0]->asUnicodeString(), QStringLiteral("<hiddenreference@hidden>")); 0103 QCOMPARE(nodeHelper.headers("in-reply-to", originalMessage.data()).size(), 1); 0104 QCOMPARE(nodeHelper.headers("in-reply-to", originalMessage.data())[0]->asUnicodeString(), QStringLiteral("<hiddenreference@hidden>")); 0105 0106 // test non-existing headers 0107 QCOMPARE(nodeHelper.headers("invalid", originalMessage.data()).isEmpty(), true); 0108 0109 // test envelope headers 0110 QCOMPARE(nodeHelper.headers("user-agent", originalMessage.data()).size(), 1); 0111 QCOMPARE(nodeHelper.headers("user-agent", originalMessage.data())[0]->asUnicodeString(), 0112 QStringLiteral("KMail/4.6 pre (Linux/2.6.34-rc2-2-default; KDE/4.5.60; x86_64; ; )")); 0113 } 0114 0115 void ProtectedHeadersTest::testMailHeaderAsAddresslist_data() 0116 { 0117 QTest::addColumn<QString>("mailFileName"); 0118 0119 QTest::newRow("encrypted") << QStringLiteral("openpgp-encrypted-protected-headers.mbox"); 0120 QTest::newRow("signed") << QStringLiteral("openpgp-signed-protected-headers.mbox"); 0121 QTest::newRow("encrypted+signed") << QStringLiteral("openpgp-encrypted+signed-protected-headers.mbox"); 0122 } 0123 0124 void ProtectedHeadersTest::testMailHeaderAsAddresslist() 0125 { 0126 QFETCH(QString, mailFileName); 0127 auto originalMessage = readAndParseMail(mailFileName); 0128 NodeHelper nodeHelper; 0129 SimpleObjectTreeSource testSource; 0130 ObjectTreeParser otp(&testSource, &nodeHelper); 0131 testSource.setDecryptMessage(true); 0132 otp.parseObjectTree(originalMessage.data()); 0133 0134 // test overwrite 0135 QCOMPARE(nodeHelper.mailHeaderAsAddressList("from", originalMessage.data())->displayNames(), QStringList() << QStringLiteral("you@example.com")); 0136 QVERIFY(nodeHelper.mailHeaderAsAddressList("subject", originalMessage.data())); 0137 0138 // test protected only headers 0139 QCOMPARE(nodeHelper.mailHeaderAsAddressList("message-id", originalMessage.data())->displayNames(), QStringList() << QStringLiteral("myhiddenreference@me")); 0140 0141 // test non-existing headers 0142 QCOMPARE(nodeHelper.mailHeaderAsAddressList("invalid", originalMessage.data()), nullptr); 0143 0144 // test envelope headers 0145 QVERIFY(nodeHelper.mailHeaderAsAddressList("user-agent", originalMessage.data())); 0146 } 0147 0148 void ProtectedHeadersTest::testhasMailHeader_data() 0149 { 0150 QTest::addColumn<QString>("mailFileName"); 0151 0152 QTest::newRow("encrypted") << QStringLiteral("openpgp-encrypted-protected-headers.mbox"); 0153 QTest::newRow("signed") << QStringLiteral("openpgp-signed-protected-headers.mbox"); 0154 QTest::newRow("encrypted+signed") << QStringLiteral("openpgp-encrypted+signed-protected-headers.mbox"); 0155 } 0156 0157 void ProtectedHeadersTest::testhasMailHeader() 0158 { 0159 QFETCH(QString, mailFileName); 0160 auto originalMessage = readAndParseMail(mailFileName); 0161 NodeHelper nodeHelper; 0162 SimpleObjectTreeSource testSource; 0163 ObjectTreeParser otp(&testSource, &nodeHelper); 0164 testSource.setDecryptMessage(true); 0165 otp.parseObjectTree(originalMessage.data()); 0166 0167 // test overwrite 0168 QCOMPARE(nodeHelper.hasMailHeader("from", originalMessage.data()), true); 0169 0170 // test protected only headers 0171 QCOMPARE(nodeHelper.hasMailHeader("message-id", originalMessage.data()), true); 0172 0173 // test non-existing headers 0174 QCOMPARE(nodeHelper.hasMailHeader("invalid", originalMessage.data()), false); 0175 0176 // test envelope headers 0177 QCOMPARE(nodeHelper.hasMailHeader("user-agent", originalMessage.data()), true); 0178 } 0179 0180 void ProtectedHeadersTest::testMessagePartsOfMailHeader_data() 0181 { 0182 QTest::addColumn<QString>("mailFileName"); 0183 QTest::addColumn<QStringList>("messagePartVector"); 0184 0185 QStringList encryptedPart; 0186 QStringList signedPart; 0187 encryptedPart << QStringLiteral("MimeTreeParser::EncryptedMessagePart"); 0188 signedPart << QStringLiteral("MimeTreeParser::SignedMessagePart"); 0189 0190 QTest::newRow("encrypted") << QStringLiteral("openpgp-encrypted-protected-headers.mbox") << encryptedPart; 0191 QTest::newRow("signed") << QStringLiteral("openpgp-signed-protected-headers.mbox") << signedPart; 0192 QTest::newRow("encrypted+signed") << QStringLiteral("openpgp-encrypted+signed-protected-headers.mbox") << encryptedPart; 0193 } 0194 0195 void ProtectedHeadersTest::testMessagePartsOfMailHeader() 0196 { 0197 QFETCH(QString, mailFileName); 0198 QFETCH(QStringList, messagePartVector); 0199 0200 auto originalMessage = readAndParseMail(mailFileName); 0201 NodeHelper nodeHelper; 0202 SimpleObjectTreeSource testSource; 0203 ObjectTreeParser otp(&testSource, &nodeHelper); 0204 testSource.setDecryptMessage(true); 0205 otp.parseObjectTree(originalMessage.data()); 0206 0207 // test overwrite 0208 { 0209 QStringList actual; 0210 for (const auto &mp : nodeHelper.messagePartsOfMailHeader("from", originalMessage.data())) { 0211 actual << QString::fromLatin1(mp->metaObject()->className()); 0212 } 0213 QCOMPARE(actual, messagePartVector); 0214 } 0215 0216 // test protected only headers 0217 { 0218 QStringList actual; 0219 for (const auto &mp : nodeHelper.messagePartsOfMailHeader("message-id", originalMessage.data())) { 0220 actual << QString::fromLatin1(mp->metaObject()->className()); 0221 } 0222 QCOMPARE(actual, messagePartVector); 0223 } 0224 0225 // test non-existing headers 0226 { 0227 QStringList actual; 0228 for (const auto &mp : nodeHelper.messagePartsOfMailHeader("invalid", originalMessage.data())) { 0229 actual << QString::fromLatin1(mp->metaObject()->className()); 0230 } 0231 QCOMPARE(actual, QStringList()); 0232 } 0233 0234 // test envelope headers 0235 { 0236 QStringList actual; 0237 for (const auto &mp : nodeHelper.messagePartsOfMailHeader("user-agent", originalMessage.data())) { 0238 actual << QString::fromLatin1(mp->metaObject()->className()); 0239 } 0240 QCOMPARE(actual, QStringList()); 0241 } 0242 } 0243 0244 #include "moc_protectedheaderstest.cpp"