diff --git a/messageviewer/src/dkim-verify/autotests/dkimauthenticationstatusinfotest.cpp b/messageviewer/src/dkim-verify/autotests/dkimauthenticationstatusinfotest.cpp index 0a033be1..6041825a 100644 --- a/messageviewer/src/dkim-verify/autotests/dkimauthenticationstatusinfotest.cpp +++ b/messageviewer/src/dkim-verify/autotests/dkimauthenticationstatusinfotest.cpp @@ -1,57 +1,80 @@ /* Copyright (C) 2018-2019 Laurent Montel This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "dkimauthenticationstatusinfotest.h" #include "dkim-verify/dkimauthenticationstatusinfo.h" #include QTEST_GUILESS_MAIN(DKIMAuthenticationStatusInfoTest) DKIMAuthenticationStatusInfoTest::DKIMAuthenticationStatusInfoTest(QObject *parent) : QObject(parent) { } void DKIMAuthenticationStatusInfoTest::shouldHaveDefaultValue() { MessageViewer::DKIMAuthenticationStatusInfo info; QVERIFY(info.authservId().isEmpty()); - QVERIFY(info.authVersion().isEmpty()); + QCOMPARE(info.authVersion(), -1); QVERIFY(info.reasonSpec().isEmpty()); + QVERIFY(info.listAuthStatusInfo().isEmpty()); } void DKIMAuthenticationStatusInfoTest::shouldParseKey() { QFETCH(QString, key); - QFETCH(QString, result); + QFETCH(MessageViewer::DKIMAuthenticationStatusInfo, result); QFETCH(bool, success); MessageViewer::DKIMAuthenticationStatusInfo info; const bool val = info.parseAuthenticationStatus(key); QCOMPARE(val, success); - //TODO test result. + const bool compareResult = result == info; + if (!compareResult) { + qDebug() << "parse info " << info; + qDebug() << "expected " << result; + } + QVERIFY(compareResult); } void DKIMAuthenticationStatusInfoTest::shouldParseKey_data() { QTest::addColumn("key"); - QTest::addColumn("result"); + QTest::addColumn("result"); QTest::addColumn("success"); - QTest::addRow("empty") << QString() << QString() << true; + QTest::addRow("empty") << QString() << MessageViewer::DKIMAuthenticationStatusInfo() << false; + { + MessageViewer::DKIMAuthenticationStatusInfo info; + info.setAuthVersion(1); + info.setAuthservId(QStringLiteral("in68.mail.ovh.net")); + QTest::addRow("test1") << QStringLiteral("in68.mail.ovh.net; dkim=pass (2048-bit key; unprotected) header.d=kde.org header.i=@kde.org header.b=\"GMG2ucPx\"; dkim=pass (2048-bit key; unprotected) header.d=kde.org header.i=@kde.org header.b=\"I3t3p7Up\"; dkim-atps=neutral") + << info + << true; + } + { + MessageViewer::DKIMAuthenticationStatusInfo info; + info.setAuthVersion(1); + info.setAuthservId(QStringLiteral("example.org")); + + QTest::addRow("none") << QStringLiteral("example.org 1; none") + << info + << false; + } } diff --git a/messageviewer/src/dkim-verify/dkimauthenticationstatusinfo.cpp b/messageviewer/src/dkim-verify/dkimauthenticationstatusinfo.cpp index 8d4568b5..79c3fbaf 100644 --- a/messageviewer/src/dkim-verify/dkimauthenticationstatusinfo.cpp +++ b/messageviewer/src/dkim-verify/dkimauthenticationstatusinfo.cpp @@ -1,86 +1,146 @@ /* Copyright (C) 2018-2019 Laurent Montel This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "dkimauthenticationstatusinfo.h" #include "dkimauthenticationstatusinfoutil.h" #include "messageviewer_dkimcheckerdebug.h" #include using namespace MessageViewer; //see https://tools.ietf.org/html/rfc7601 DKIMAuthenticationStatusInfo::DKIMAuthenticationStatusInfo() { } bool DKIMAuthenticationStatusInfo::parseAuthenticationStatus(const QString &key) { QString valueKey = key; // https://tools.ietf.org/html/rfc7601#section-2.2 // authres-header = "Authentication-Results:" [CFWS] authserv-id // [ CFWS authres-version ] // ( no-result / 1*resinfo ) [CFWS] CRLF // 1) extract AuthservId and AuthVersion QRegularExpressionMatch match; - const int index = valueKey.indexOf(QRegularExpression(DKIMAuthenticationStatusInfoUtil::value_cp() + QLatin1String("(?:") + DKIMAuthenticationStatusInfoUtil::cfws_p() + QLatin1String("([0-9]+)") + DKIMAuthenticationStatusInfoUtil::cfws_op() + QLatin1String(" )?")), 0, &match); + const QString regStr = DKIMAuthenticationStatusInfoUtil::value_cp() + QLatin1String("(?:") + DKIMAuthenticationStatusInfoUtil::cfws_p() + QLatin1String("([0-9]+)") + DKIMAuthenticationStatusInfoUtil::cfws_op() + QLatin1String(" )?"); + //qDebug() << " regStr" << regStr; + int index = valueKey.indexOf(QRegularExpression(regStr), 0, &match); if (index != -1) { - //TODO remove value from valueKey + mAuthservId = match.captured(1); + if (!match.captured(2).isEmpty()) { + mAuthVersion = match.captured(2).toInt(); + } else { + mAuthVersion = 1; + } + valueKey = valueKey.right(valueKey.length() - (index + match.captured(0).length())); + qDebug() << " match.captured(0)"< DKIMAuthenticationStatusInfo::listAuthStatusInfo() const +{ + return mListAuthStatusInfo; +} + +void DKIMAuthenticationStatusInfo::setListAuthStatusInfo(const QList &listAuthStatusInfo) +{ + mListAuthStatusInfo = listAuthStatusInfo; +} + QString DKIMAuthenticationStatusInfo::authservId() const { return mAuthservId; } void DKIMAuthenticationStatusInfo::setAuthservId(const QString &authservId) { mAuthservId = authservId; } + +QDebug operator <<(QDebug d, const DKIMAuthenticationStatusInfo &t) +{ + d << "mAuthservId: " << t.authservId(); + d << "mReasonSpec: " << t.reasonSpec(); + d << "mAuthVersion: " << t.authVersion(); + for (const DKIMAuthenticationStatusInfo::AuthStatusInfo & info : t.listAuthStatusInfo()) { + d << "mListAuthStatusInfo: " << info.method << " : " << info.result; + } + return d; +} + +bool DKIMAuthenticationStatusInfo::AuthStatusInfo::operator==(const DKIMAuthenticationStatusInfo::AuthStatusInfo &other) const +{ + return other.method == method + && other.result == result; +} diff --git a/messageviewer/src/dkim-verify/dkimauthenticationstatusinfo.h b/messageviewer/src/dkim-verify/dkimauthenticationstatusinfo.h index 57a34f2d..fcccc72b 100644 --- a/messageviewer/src/dkim-verify/dkimauthenticationstatusinfo.h +++ b/messageviewer/src/dkim-verify/dkimauthenticationstatusinfo.h @@ -1,50 +1,67 @@ /* Copyright (C) 2018-2019 Laurent Montel This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef DKIMAUTHENTICATIONSTATUSINFO_H #define DKIMAUTHENTICATIONSTATUSINFO_H #include "messageviewer_private_export.h" #include - +#include namespace MessageViewer { class MESSAGEVIEWER_TESTS_EXPORT DKIMAuthenticationStatusInfo { public: DKIMAuthenticationStatusInfo(); + struct AuthStatusInfo { + QString method; + QString result; + //TODO add more + bool operator==(const AuthStatusInfo &other) const; + }; + Q_REQUIRED_RESULT QString authservId() const; void setAuthservId(const QString &authservId); Q_REQUIRED_RESULT bool parseAuthenticationStatus(const QString &key); - Q_REQUIRED_RESULT QString authVersion() const; - void setAuthVersion(const QString &authVersion); + Q_REQUIRED_RESULT int authVersion() const; + void setAuthVersion(int authVersion); Q_REQUIRED_RESULT QString reasonSpec() const; void setReasonSpec(const QString &reasonSpec); + Q_REQUIRED_RESULT bool operator==(const DKIMAuthenticationStatusInfo &other) const; + + Q_REQUIRED_RESULT QList listAuthStatusInfo() const; + void setListAuthStatusInfo(const QList &listAuthStatusInfo); + private: + AuthStatusInfo parseAuthResultInfo(QString &valueKey); + QList mListAuthStatusInfo; QString mAuthservId; - QString mAuthVersion; QString mReasonSpec; + int mAuthVersion = -1; }; } +Q_DECLARE_METATYPE(MessageViewer::DKIMAuthenticationStatusInfo) +MESSAGEVIEWER_EXPORT QDebug operator <<(QDebug d, const MessageViewer::DKIMAuthenticationStatusInfo &t); + #endif // DKIMAUTHENTICATIONSTATUSINFO_H