File indexing completed on 2024-06-23 05:19:20

0001 /*
0002    SPDX-FileCopyrightText: 2016 Sandro Knauß <sknauss@kde.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "multipartencrypted.h"
0008 
0009 #include "utils.h"
0010 
0011 #include "messagepart.h"
0012 #include "objecttreeparser.h"
0013 
0014 #include <KMime/Content>
0015 
0016 #include <QGpgME/Protocol>
0017 
0018 #include "mimetreeparser_debug.h"
0019 
0020 using namespace MimeTreeParser;
0021 
0022 const MultiPartEncryptedBodyPartFormatter *MultiPartEncryptedBodyPartFormatter::self;
0023 
0024 const Interface::BodyPartFormatter *MultiPartEncryptedBodyPartFormatter::create()
0025 {
0026     if (!self) {
0027         self = new MultiPartEncryptedBodyPartFormatter();
0028     }
0029     return self;
0030 }
0031 
0032 MessagePart::Ptr MultiPartEncryptedBodyPartFormatter::process(Interface::BodyPart &part) const
0033 {
0034     KMime::Content *node = part.content();
0035 
0036     if (node->contents().isEmpty()) {
0037         Q_ASSERT(false);
0038         return {};
0039     }
0040 
0041     const QGpgME::Protocol *useThisCryptProto = nullptr;
0042 
0043     /*
0044     ATTENTION: This code is to be replaced by the new 'auto-detect' feature. --------------------------------------
0045     */
0046     KMime::Content *data = findTypeInDirectChilds(node, "application/octet-stream");
0047     if (data) {
0048         useThisCryptProto = QGpgME::openpgp();
0049     }
0050     if (!data) {
0051         data = findTypeInDirectChilds(node, "application/pkcs7-mime");
0052         if (data) {
0053             useThisCryptProto = QGpgME::smime();
0054         }
0055     }
0056     /*
0057     ---------------------------------------------------------------------------------------------------------------
0058     */
0059 
0060     if (!data) {
0061         return MessagePart::Ptr(new MimeMessagePart(part.objectTreeParser(), node->contents().at(0), false));
0062     }
0063 
0064     part.nodeHelper()->setEncryptionState(node, KMMsgFullyEncrypted);
0065 
0066     EncryptedMessagePart::Ptr mp(
0067         new EncryptedMessagePart(part.objectTreeParser(), data->decodedText(), useThisCryptProto, part.nodeHelper()->fromAsString(data), node));
0068     mp->setIsEncrypted(true);
0069     mp->setDecryptMessage(part.source()->decryptMessage());
0070     PartMetaData *messagePart(mp->partMetaData());
0071 
0072     if (!part.source()->decryptMessage()) {
0073         part.nodeHelper()->setNodeProcessed(data, false); // Set the data node to done to prevent it from being processed
0074     } else if (KMime::Content *newNode = part.nodeHelper()->decryptedNodeForContent(data)) {
0075         part.nodeHelper()->registerOverrideHeader(data->parent(), mp);
0076 
0077         // if we already have a decrypted node for part.objectTreeParser() encrypted node, don't do the decryption again
0078         return MessagePart::Ptr(new MimeMessagePart(part.objectTreeParser(), newNode, true));
0079     } else {
0080         mp->startDecryption(data);
0081         qCDebug(MIMETREEPARSER_LOG) << "decrypted, signed?:" << messagePart->isSigned;
0082 
0083         if (!messagePart->inProgress) {
0084             part.nodeHelper()->registerOverrideHeader(data->parent(), mp);
0085             part.nodeHelper()->setNodeProcessed(data, false); // Set the data node to done to prevent it from being processed
0086         }
0087     }
0088     return mp;
0089 }