diff --git a/mimetreeparser/autotests/nodehelpertest.h b/mimetreeparser/autotests/nodehelpertest.h --- a/mimetreeparser/autotests/nodehelpertest.h +++ b/mimetreeparser/autotests/nodehelpertest.h @@ -38,6 +38,7 @@ void testLocalFiles(); void testHREF(); void testCreateTempDir(); + void testFromAsString(); }; } diff --git a/mimetreeparser/autotests/nodehelpertest.cpp b/mimetreeparser/autotests/nodehelpertest.cpp --- a/mimetreeparser/autotests/nodehelpertest.cpp +++ b/mimetreeparser/autotests/nodehelpertest.cpp @@ -222,5 +222,54 @@ QVERIFY(!QDir(path).exists()); } +void NodeHelperTest::testFromAsString() +{ + const QString tlSender = QStringLiteral("Foo "); + const QString encSender = QStringLiteral("Bar "); + + NodeHelper helper; + + // msg (KMime::Message) + // |- subNode + // |- encNode (KMime::Message) + // |- encSubNode + // + // subNode + // |- subExtra + // + // encSubNode + // |- encSubExtra + + KMime::Message msg; + msg.from(true)->fromUnicodeString(tlSender, "UTF-8"); + auto node = msg.topLevel(); + auto subNode = new KMime::Content(); + auto subExtra = new KMime::Content(); + + // Encapsulated message + KMime::Message *encMsg = new KMime::Message; + encMsg->from(true)->fromUnicodeString(encSender, "UTF-8"); + auto encNode = encMsg->topLevel(); + auto encSubNode = new KMime::Content(); + auto encSubExtra = new KMime::Content(); + + node->addContent(subNode); + node->addContent(encMsg); + encNode->addContent(encSubNode); + + helper.attachExtraContent(subNode, subExtra); + helper.attachExtraContent(encSubNode, encSubExtra); + + QCOMPARE(helper.fromAsString(node), tlSender); + QCOMPARE(helper.fromAsString(subNode), tlSender); + QCOMPARE(helper.fromAsString(subExtra), tlSender); + QEXPECT_FAIL("", "Returning sender of encapsulated message is not yet implemented", Continue); + QCOMPARE(helper.fromAsString(encNode), encSender); + QEXPECT_FAIL("", "Returning sender of encapsulated message is not yet implemented", Continue); + QCOMPARE(helper.fromAsString(encSubNode), encSender); + QEXPECT_FAIL("", "Returning sender of encapsulated message is not yet implemented", Continue); + QCOMPARE(helper.fromAsString(encSubExtra), encSender); +} + QTEST_GUILESS_MAIN(NodeHelperTest) diff --git a/mimetreeparser/src/bodyformatter/applicationpgpencrypted.cpp b/mimetreeparser/src/bodyformatter/applicationpgpencrypted.cpp --- a/mimetreeparser/src/bodyformatter/applicationpgpencrypted.cpp +++ b/mimetreeparser/src/bodyformatter/applicationpgpencrypted.cpp @@ -76,7 +76,7 @@ EncryptedMessagePart::Ptr mp(new EncryptedMessagePart(part.objectTreeParser(), data->decodedText(), QGpgME::openpgp(), - NodeHelper::fromAsString(data), node)); + part.nodeHelper()->fromAsString(data), node)); mp->setIsEncrypted(true); mp->setDecryptMessage(part.source()->decryptMessage()); PartMetaData *messagePart(mp->partMetaData()); diff --git a/mimetreeparser/src/bodyformatter/applicationpkcs7mime.cpp b/mimetreeparser/src/bodyformatter/applicationpkcs7mime.cpp --- a/mimetreeparser/src/bodyformatter/applicationpkcs7mime.cpp +++ b/mimetreeparser/src/bodyformatter/applicationpkcs7mime.cpp @@ -99,7 +99,7 @@ auto _mp = EncryptedMessagePart::Ptr(new EncryptedMessagePart(part.objectTreeParser(), node->decodedText(), smimeCrypto, - NodeHelper::fromAsString(node), node)); + part.nodeHelper()->fromAsString(node), node)); mp = _mp; _mp->setIsEncrypted(true); _mp->setDecryptMessage(part.source()->decryptMessage()); @@ -150,7 +150,7 @@ const QByteArray signaturetext = signTestNode->decodedContent(); auto _mp = SignedMessagePart::Ptr(new SignedMessagePart(part.objectTreeParser(), aCodec->toUnicode(signaturetext), smimeCrypto, - NodeHelper::fromAsString(node), signTestNode)); + part.nodeHelper()->fromAsString(node), signTestNode)); mp = _mp; //mp->setDecryptMessage(part.source()->decryptMessage()); PartMetaData *messagePart(mp->partMetaData()); diff --git a/mimetreeparser/src/bodyformatter/multipartencrypted.cpp b/mimetreeparser/src/bodyformatter/multipartencrypted.cpp --- a/mimetreeparser/src/bodyformatter/multipartencrypted.cpp +++ b/mimetreeparser/src/bodyformatter/multipartencrypted.cpp @@ -89,7 +89,7 @@ EncryptedMessagePart::Ptr mp(new EncryptedMessagePart(part.objectTreeParser(), data->decodedText(), useThisCryptProto, - NodeHelper::fromAsString(data), node)); + part.nodeHelper()->fromAsString(data), node)); mp->setIsEncrypted(true); mp->setDecryptMessage(part.source()->decryptMessage()); PartMetaData *messagePart(mp->partMetaData()); diff --git a/mimetreeparser/src/bodyformatter/multipartsigned.cpp b/mimetreeparser/src/bodyformatter/multipartsigned.cpp --- a/mimetreeparser/src/bodyformatter/multipartsigned.cpp +++ b/mimetreeparser/src/bodyformatter/multipartsigned.cpp @@ -101,7 +101,7 @@ SignedMessagePart::Ptr mp(new SignedMessagePart(part.objectTreeParser(), aCodec->toUnicode(cleartext), protocol, - NodeHelper::fromAsString(node), signature)); + part.nodeHelper()->fromAsString(node), signature)); PartMetaData *messagePart(mp->partMetaData()); if (protocol) { diff --git a/mimetreeparser/src/viewer/messagepart.cpp b/mimetreeparser/src/viewer/messagepart.cpp --- a/mimetreeparser/src/viewer/messagepart.cpp +++ b/mimetreeparser/src/viewer/messagepart.cpp @@ -245,7 +245,7 @@ void TextMessagePart::parseContent() { const auto aCodec = mOtp->codecFor(mNode); - const QString &fromAddress = NodeHelper::fromAsString(mNode); + const QString &fromAddress = mOtp->nodeHelper()->fromAsString(mNode); mSignatureState = KMMsgNotSigned; mEncryptionState = KMMsgNotEncrypted; const auto blocks = prepareMessageForDecryption(mNode->decodedContent()); diff --git a/mimetreeparser/src/viewer/nodehelper.h b/mimetreeparser/src/viewer/nodehelper.h --- a/mimetreeparser/src/viewer/nodehelper.h +++ b/mimetreeparser/src/viewer/nodehelper.h @@ -210,7 +210,7 @@ */ static QStringList supportedEncodings(bool usAscii); //TODO(Andras) move to a utility class? - static QString fromAsString(KMime::Content *node); + QString fromAsString(KMime::Content *node) const; KMime::Content *decryptedNodeForContent(KMime::Content *content) const; diff --git a/mimetreeparser/src/viewer/nodehelper.cpp b/mimetreeparser/src/viewer/nodehelper.cpp --- a/mimetreeparser/src/viewer/nodehelper.cpp +++ b/mimetreeparser/src/viewer/nodehelper.cpp @@ -793,12 +793,20 @@ return encodings; } -QString NodeHelper::fromAsString(KMime::Content *node) +QString NodeHelper::fromAsString(KMime::Content *node) const { - KMime::Message *topLevel = dynamic_cast(node->topLevel()); - if (topLevel) { + if (auto topLevel = dynamic_cast(node->topLevel())) { return topLevel->from()->asUnicodeString(); + } else { + auto realNode = std::find_if(mExtraContents.cbegin(), mExtraContents.cend(), + [node](const QList &nodes) { + return nodes.contains(node); + }); + if (realNode != mExtraContents.cend()) { + return fromAsString(realNode.key()); + } } + return QString(); }