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 }