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

0001 /*
0002    SPDX-FileCopyrightText: 2019-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #pragma once
0008 
0009 #include "messageviewer_export.h"
0010 
0011 #include <QByteArray>
0012 #include <QList>
0013 namespace MessageViewer
0014 {
0015 /**
0016  * @brief The DKIMHeaderParser class
0017  * @author Laurent Montel <montel@kde.org>
0018  */
0019 class MESSAGEVIEWER_EXPORT DKIMHeaderParser
0020 {
0021 private:
0022     struct Header {
0023         QString headerName;
0024         QString headerValue;
0025         QByteArray codec;
0026         [[nodiscard]] bool isValid() const
0027         {
0028             return !headerName.isEmpty();
0029         }
0030 
0031         [[nodiscard]] bool operator==(const Header &other) const
0032         {
0033             return other.headerName == headerName && other.headerValue == headerValue && other.codec == codec;
0034         }
0035     };
0036 
0037 public:
0038     DKIMHeaderParser();
0039     ~DKIMHeaderParser();
0040     void parse();
0041     void setHead(const QByteArray &head);
0042 
0043     [[nodiscard]] QByteArray head() const;
0044 
0045     [[nodiscard]] QString headerType(const QString &str);
0046     [[nodiscard]] bool wasAlreadyParsed() const;
0047     void setWasAlreadyParsed(bool wasAlreadyParsed);
0048 
0049     [[nodiscard]] bool operator==(const DKIMHeaderParser &other) const;
0050     [[nodiscard]] QList<DKIMHeaderParser::Header> listHeaders() const;
0051 
0052 private:
0053     [[nodiscard]] static int findHeaderLineEnd(const QByteArray &src, int &dataBegin, bool *folded);
0054     [[nodiscard]] MESSAGEVIEWER_NO_EXPORT MessageViewer::DKIMHeaderParser::Header
0055     extractHeader(const QByteArray &head, const int headerStart, int &endOfFieldBody);
0056     [[nodiscard]] static QByteArray unfoldHeader(const char *header, size_t headerSize);
0057     QByteArray mHead;
0058     QList<DKIMHeaderParser::Header> mListHeaders;
0059     bool mWasAlreadyParsed = false;
0060 };
0061 }