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"