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

0001 /*
0002    SPDX-FileCopyrightText: 2019-2024 Laurent Montel <montel@kde.org>
0003 
0004    Code based on ARHParser.jsm from dkim_verifier (Copyright (c) Philippe Lieser)
0005    (This software is licensed under the terms of the MIT License.)
0006 
0007    SPDX-License-Identifier: LGPL-2.0-or-later
0008 */
0009 
0010 #include "dkimauthenticationstatusinfoconverter.h"
0011 #include "dkimutil.h"
0012 #include "messageviewer_dkimcheckerdebug.h"
0013 using namespace MessageViewer;
0014 
0015 DKIMAuthenticationStatusInfoConverter::DKIMAuthenticationStatusInfoConverter() = default;
0016 
0017 DKIMAuthenticationStatusInfoConverter::~DKIMAuthenticationStatusInfoConverter() = default;
0018 
0019 MessageViewer::DKIMAuthenticationStatusInfo DKIMAuthenticationStatusInfoConverter::statusInfo() const
0020 {
0021     return mStatusInfo;
0022 }
0023 
0024 void DKIMAuthenticationStatusInfoConverter::setStatusInfo(const MessageViewer::DKIMAuthenticationStatusInfo &statusInfo)
0025 {
0026     mStatusInfo = statusInfo;
0027 }
0028 
0029 QList<DKIMCheckSignatureJob::DKIMCheckSignatureAuthenticationResult> DKIMAuthenticationStatusInfoConverter::convert() const
0030 {
0031     QList<DKIMCheckSignatureJob::DKIMCheckSignatureAuthenticationResult> lstResult;
0032     const QList<DKIMAuthenticationStatusInfo::AuthStatusInfo> lstInfo = mStatusInfo.listAuthStatusInfo();
0033     for (const DKIMAuthenticationStatusInfo::AuthStatusInfo &info : lstInfo) {
0034         DKIMCheckSignatureJob::DKIMCheckSignatureAuthenticationResult convertedResult;
0035         convertedResult.method = MessageViewer::DKIMUtil::convertAuthenticationMethodStringToEnum(info.method);
0036         const QString &infoResult = info.result;
0037         convertedResult.infoResult = infoResult;
0038         if (infoResult == QLatin1StringView("none")) {
0039             convertedResult.status = DKIMCheckSignatureJob::DKIMStatus::EmailNotSigned;
0040         } else if (infoResult == QLatin1StringView("pass")) {
0041             convertedResult.status = DKIMCheckSignatureJob::DKIMStatus::Valid;
0042             QString sdid;
0043             QString auid;
0044             for (const DKIMAuthenticationStatusInfo::AuthStatusInfo::Property &prop : info.header) {
0045                 if (prop.type == QLatin1Char('d')) {
0046                     sdid = prop.value;
0047                 } else if (prop.type == QLatin1Char('i')) {
0048                     auid = prop.value;
0049                 }
0050             }
0051             if (!auid.isEmpty() || !sdid.isEmpty()) {
0052                 if (sdid.isEmpty()) {
0053                     sdid = MessageViewer::DKIMUtil::emailDomain(auid);
0054                 } else if (auid.isEmpty()) {
0055                     auid = QLatin1Char('@') + sdid;
0056                 }
0057                 convertedResult.sdid = sdid;
0058                 convertedResult.auid = auid;
0059             }
0060         } else if (infoResult == QLatin1StringView("fail") || infoResult == QLatin1StringView("policy") || infoResult == QLatin1StringView("neutral")
0061                    || infoResult == QLatin1StringView("permerror")) {
0062             convertedResult.status = DKIMCheckSignatureJob::DKIMStatus::Invalid;
0063             if (!info.reason.isEmpty()) {
0064                 convertedResult.errorStr = info.reason;
0065             }
0066         } else if (infoResult == QLatin1StringView("temperror")) {
0067             convertedResult.status = DKIMCheckSignatureJob::DKIMStatus::Invalid;
0068             if (!info.reason.isEmpty()) {
0069                 convertedResult.errorStr = info.reason;
0070             }
0071         } else {
0072             qCWarning(MESSAGEVIEWER_DKIMCHECKER_LOG) << "Invalid result type " << infoResult;
0073             continue;
0074         }
0075         lstResult.append(convertedResult);
0076     }
0077 
0078     return lstResult;
0079 }