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

0001 /*
0002    SPDX-FileCopyrightText: 2018-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "dkiminfotest.h"
0008 #include "dkim-verify/dkiminfo.h"
0009 #include <QDebug>
0010 #include <QTest>
0011 
0012 QTEST_GUILESS_MAIN(DKIMInfoTest)
0013 
0014 DKIMInfoTest::DKIMInfoTest(QObject *parent)
0015     : QObject(parent)
0016 {
0017 }
0018 
0019 void DKIMInfoTest::shouldHaveDefaultValue()
0020 {
0021     MessageViewer::DKIMInfo info;
0022     QCOMPARE(info.version(), -1);
0023 
0024     QCOMPARE(info.hashingAlgorithm(), MessageViewer::DKIMInfo::HashingAlgorithmType::Any);
0025     QVERIFY(info.signingAlgorithm().isEmpty());
0026     QVERIFY(info.domain().isEmpty());
0027     QVERIFY(info.selector().isEmpty());
0028     QVERIFY(info.bodyHash().isEmpty());
0029     QVERIFY(info.listSignedHeader().isEmpty());
0030     QVERIFY(info.query().isEmpty());
0031     QCOMPARE(info.signatureTimeStamp(), -1);
0032     QCOMPARE(info.expireTime(), -1);
0033     QVERIFY(info.signature().isEmpty());
0034     QVERIFY(info.agentOrUserIdentifier().isEmpty());
0035     QCOMPARE(info.bodyLengthCount(), -1);
0036     QCOMPARE(info.headerCanonization(), MessageViewer::DKIMInfo::Unknown);
0037     QCOMPARE(info.bodyCanonization(), MessageViewer::DKIMInfo::Unknown);
0038     QVERIFY(info.copiedHeaderField().isEmpty());
0039     QVERIFY(info.iDomain().isEmpty());
0040 }
0041 
0042 void DKIMInfoTest::shouldTestExtractDkimInfo_data()
0043 {
0044     QTest::addColumn<QString>("dkimstr");
0045     QTest::addColumn<MessageViewer::DKIMInfo>("dkiminforesult");
0046     QTest::addColumn<bool>("isValid");
0047     QTest::addRow("empty") << QString() << MessageViewer::DKIMInfo() << false;
0048     QString val = QStringLiteral(
0049         "a=rsa-sha1; q=dns; d=example.com; i=user@eng.example.com; s=jun2005.eng; c=relaxed/simple; t=1117574938; x=1118006938; h=from:to:subject:date; "
0050         "b=dzdVyOfAKCdLXdJOc9G2q8LoXSlEniSbav+yuU4zGeeruD00lszZVoG4ZHRNiYzR");
0051     MessageViewer::DKIMInfo info1;
0052     info1.setVersion(1);
0053     info1.setQuery(QStringLiteral("dns"));
0054     info1.setDomain(QStringLiteral("example.com"));
0055     info1.setSigningAlgorithm(QStringLiteral("rsa"));
0056     info1.setHashingAlgorithm(MessageViewer::DKIMInfo::HashingAlgorithmType::Sha1);
0057     info1.setBodyCanonization(MessageViewer::DKIMInfo::Simple);
0058     info1.setHeaderCanonization(MessageViewer::DKIMInfo::Relaxed);
0059     info1.setSignatureTimeStamp(1117574938);
0060     info1.setExpireTime(1118006938);
0061     info1.setSelector(QStringLiteral("jun2005.eng"));
0062     info1.setAgentOrUserIdentifier(QStringLiteral("user@eng.example.com"));
0063     info1.setIDomain(QStringLiteral("eng.example.com"));
0064     info1.setSignature(QStringLiteral("dzdVyOfAKCdLXdJOc9G2q8LoXSlEniSbav+yuU4zGeeruD00lszZVoG4ZHRNiYzR"));
0065     info1.setListSignedHeader(QStringList({QStringLiteral("from"), QStringLiteral("to"), QStringLiteral("subject"), QStringLiteral("date")}));
0066     QTest::addRow("test1") << val << info1 << true;
0067 
0068     val = QStringLiteral(
0069         "v=1; a=rsa-sha256; c=relaxed/relaxed; d=example.com; "
0070         "h=message-id:content-type:content-type:user-agent:content-disposition:content-transfer-encoding:mime-version:reply-to:references:in-reply-to:subject:"
0071         "subject"
0072         ":list-unsubscribe:list-id:from:from:date:date; s=dkim; t=1569945303; x=1570809304; bh=/TC3U+LlxLH3YGxhC7qIHK8PzGl6Zx/8P6OGhDWrcWs=; "
0073         "b=w4GIjJb/+yEZvzvlw9yIPiuk/eKxAGSKL4WNmgC4D3V9fNyuVOV"
0074         "IH06PzqCuU/NwLas3SdAvd3VbTCObAb38KXeXkO7meeyCoR+kDsFzHpSAUg7+IRkeDR+RmarFjXwZAtoX3OMsB8euEprhS9fgGupxCWxwu6VGKJgt3Yu3/cI=");
0075     MessageViewer::DKIMInfo info2;
0076     info2.setVersion(1);
0077     info2.setQuery(QStringLiteral("dns/txt"));
0078     info2.setDomain(QStringLiteral("example.com"));
0079     info2.setIDomain(QStringLiteral("example.com"));
0080     info2.setAgentOrUserIdentifier(QStringLiteral("@example.com"));
0081     info2.setSigningAlgorithm(QStringLiteral("rsa"));
0082     info2.setHashingAlgorithm(MessageViewer::DKIMInfo::HashingAlgorithmType::Sha256);
0083     info2.setBodyCanonization(MessageViewer::DKIMInfo::Relaxed);
0084     info2.setHeaderCanonization(MessageViewer::DKIMInfo::Relaxed);
0085     info2.setSignatureTimeStamp(1569945303);
0086     info2.setExpireTime(1570809304);
0087     info2.setSelector(QStringLiteral("dkim"));
0088     info2.setSignature(
0089         QStringLiteral("w4GIjJb/+yEZvzvlw9yIPiuk/eKxAGSKL4WNmgC4D3V9fNyuVOVIH06PzqCuU/"
0090                        "NwLas3SdAvd3VbTCObAb38KXeXkO7meeyCoR+kDsFzHpSAUg7+IRkeDR+RmarFjXwZAtoX3OMsB8euEprhS9fgGupxCWxwu6VGKJgt3Yu3/cI="));
0091     info2.setBodyHash(QStringLiteral("/TC3U+LlxLH3YGxhC7qIHK8PzGl6Zx/8P6OGhDWrcWs="));
0092     info2.setListSignedHeader(QStringList({QStringLiteral("message-id"),
0093                                            QStringLiteral("content-type"),
0094                                            QStringLiteral("content-type"),
0095                                            QStringLiteral("user-agent"),
0096                                            QStringLiteral("content-disposition"),
0097                                            QStringLiteral("content-transfer-encoding"),
0098                                            QStringLiteral("mime-version"),
0099                                            QStringLiteral("reply-to"),
0100                                            QStringLiteral("references"),
0101                                            QStringLiteral("in-reply-to"),
0102                                            QStringLiteral("subject"),
0103                                            QStringLiteral("subject"),
0104                                            QStringLiteral("list-unsubscribe"),
0105                                            QStringLiteral("list-id"),
0106                                            QStringLiteral("from"),
0107                                            QStringLiteral("from"),
0108                                            QStringLiteral("date"),
0109                                            QStringLiteral("date")}));
0110     QTest::addRow("test2") << val << info2 << true;
0111 
0112     val = QStringLiteral(
0113         "v=1; a=rsa-sha1; c=relaxed; d=abonnement.radins.com; "
0114         "h=message-id:list-unsubscribe:from:to:reply-to:content-type:subject:content-transfer-encoding:mime-version:date; s=selector1; "
0115         "bh=vyAg5eFfq019WlDt9csu4bJMC54=; "
0116         "b=ABKgPqPe/MOGdgR2TJuiVNTLugsL8q/+ky/JxOxwZxnsPbtFnyJ+Y7Gk8bfcBL9myKPNqe7bU6Uy4IiNptn+v34rhVApm6ccoc44UXe/2A5D+6CPJHjFyf/ggjgF/"
0117         "BtQGYoMeQwj2+F4+QRxHSPldAcWqLCwlcRN25nPgiSAvWg=");
0118     MessageViewer::DKIMInfo info3;
0119     info3.setVersion(1);
0120     info3.setQuery(QStringLiteral("dns/txt"));
0121     info3.setDomain(QStringLiteral("abonnement.radins.com"));
0122     info3.setIDomain(QStringLiteral("abonnement.radins.com"));
0123     info3.setAgentOrUserIdentifier(QStringLiteral("@abonnement.radins.com"));
0124     info3.setSigningAlgorithm(QStringLiteral("rsa"));
0125     info3.setHashingAlgorithm(MessageViewer::DKIMInfo::HashingAlgorithmType::Sha1);
0126     info3.setBodyCanonization(MessageViewer::DKIMInfo::Simple);
0127     info3.setHeaderCanonization(MessageViewer::DKIMInfo::Relaxed);
0128     info3.setSelector(QStringLiteral("selector1"));
0129     info3.setSignature(
0130         QStringLiteral("ABKgPqPe/MOGdgR2TJuiVNTLugsL8q/+ky/JxOxwZxnsPbtFnyJ+Y7Gk8bfcBL9myKPNqe7bU6Uy4IiNptn+v34rhVApm6ccoc44UXe/2A5D+6CPJHjFyf/ggjgF/"
0131                        "BtQGYoMeQwj2+F4+QRxHSPldAcWqLCwlcRN25nPgiSAvWg="));
0132     info3.setBodyHash(QStringLiteral("vyAg5eFfq019WlDt9csu4bJMC54="));
0133     info3.setListSignedHeader(QStringList({QStringLiteral("message-id"),
0134                                            QStringLiteral("list-unsubscribe"),
0135                                            QStringLiteral("from"),
0136                                            QStringLiteral("to"),
0137                                            QStringLiteral("reply-to"),
0138                                            QStringLiteral("content-type"),
0139                                            QStringLiteral("subject"),
0140                                            QStringLiteral("content-transfer-encoding"),
0141                                            QStringLiteral("mime-version"),
0142                                            QStringLiteral("date")}));
0143     QTest::addRow("test3") << val << info3 << true;
0144 }
0145 
0146 void DKIMInfoTest::shouldTestExtractDkimInfo()
0147 {
0148     QFETCH(QString, dkimstr);
0149     QFETCH(MessageViewer::DKIMInfo, dkiminforesult);
0150     QFETCH(bool, isValid);
0151     MessageViewer::DKIMInfo info;
0152     QCOMPARE(info.parseDKIM(dkimstr), isValid);
0153     if (isValid) {
0154         const bool isEqual = (info == dkiminforesult);
0155         if (!isEqual) {
0156             qDebug() << " info" << info;
0157             qDebug() << " dkiminforesult" << dkiminforesult;
0158         }
0159         QVERIFY(isEqual);
0160     }
0161 }
0162 
0163 #include "moc_dkiminfotest.cpp"