diff --git a/messageviewer/src/dkim-verify/autotests/dkimauthenticationstatusinfotest.cpp b/messageviewer/src/dkim-verify/autotests/dkimauthenticationstatusinfotest.cpp index 849d034b..6041825a 100644 --- a/messageviewer/src/dkim-verify/autotests/dkimauthenticationstatusinfotest.cpp +++ b/messageviewer/src/dkim-verify/autotests/dkimauthenticationstatusinfotest.cpp @@ -1,79 +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()); QCOMPARE(info.authVersion(), -1); QVERIFY(info.reasonSpec().isEmpty()); + QVERIFY(info.listAuthStatusInfo().isEmpty()); } void DKIMAuthenticationStatusInfoTest::shouldParseKey() { QFETCH(QString, key); QFETCH(MessageViewer::DKIMAuthenticationStatusInfo, result); QFETCH(bool, success); MessageViewer::DKIMAuthenticationStatusInfo info; const bool val = info.parseAuthenticationStatus(key); QCOMPARE(val, success); 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("success"); 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 2123d8d1..afc7dc1b 100644 --- a/messageviewer/src/dkim-verify/dkimauthenticationstatusinfo.cpp +++ b/messageviewer/src/dkim-verify/dkimauthenticationstatusinfo.cpp @@ -1,117 +1,139 @@ /* 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 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) { 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 b7d85970..781bb755 100644 --- a/messageviewer/src/dkim-verify/dkimauthenticationstatusinfo.h +++ b/messageviewer/src/dkim-verify/dkimauthenticationstatusinfo.h @@ -1,62 +1,66 @@ /* 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 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: QList mListAuthStatusInfo; QString mAuthservId; QString mReasonSpec; int mAuthVersion = -1; }; } Q_DECLARE_METATYPE(MessageViewer::DKIMAuthenticationStatusInfo) MESSAGEVIEWER_EXPORT QDebug operator <<(QDebug d, const MessageViewer::DKIMAuthenticationStatusInfo &t); #endif // DKIMAUTHENTICATIONSTATUSINFO_H