diff options
author | Christian Mollekopf <chrigi_1@fastmail.fm> | 2018-06-29 17:27:31 +0200 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2018-06-29 17:27:31 +0200 |
commit | d81eea635c2151c2c9c62a53c08e427c38ad0acd (patch) | |
tree | 3dc1eda9702f060eac17581b74c7b848dcc7301c /framework | |
parent | 4e338ae323fc6fcdfb641cf463f60946bcbbc60e (diff) | |
download | kube-d81eea635c2151c2c9c62a53c08e427c38ad0acd.tar.gz kube-d81eea635c2151c2c9c62a53c08e427c38ad0acd.zip |
Partial fix for multipart/mixed in alternative part
We only render the first part right now, which is not correct.
Diffstat (limited to 'framework')
5 files changed, 111 insertions, 39 deletions
diff --git a/framework/src/domain/mime/mimetreeparser/messagepart.cpp b/framework/src/domain/mime/mimetreeparser/messagepart.cpp index 1a1b2003..9c17aafc 100644 --- a/framework/src/domain/mime/mimetreeparser/messagepart.cpp +++ b/framework/src/domain/mime/mimetreeparser/messagepart.cpp | |||
@@ -587,30 +587,35 @@ AlternativeMessagePart::AlternativeMessagePart(ObjectTreeParser *otp, KMime::Con | |||
587 | // when displaying plain text. | 587 | // when displaying plain text. |
588 | if (!dataHtml) { | 588 | if (!dataHtml) { |
589 | dataHtml = findTypeInDirectChilds(mNode, "multipart/mixed"); | 589 | dataHtml = findTypeInDirectChilds(mNode, "multipart/mixed"); |
590 | if (dataHtml) { | ||
591 | const auto parts = dataHtml->contents(); | ||
592 | for (int i = 0; i < parts.size(); i++) { | ||
593 | const auto p = parts.at(i); | ||
594 | if (i == 0 ) { | ||
595 | // FIXME multipart/mixed should display all types serially, not just one | ||
596 | dataHtml = p; | ||
597 | } else if (KMime::isAttachment(p)) { | ||
598 | appendSubPart(MimeMessagePart::Ptr(new MimeMessagePart(otp, p, true))); | ||
599 | } | ||
600 | } | ||
601 | } | ||
590 | } | 602 | } |
591 | } | 603 | } |
592 | 604 | ||
593 | if (dataIcal) { | 605 | if (dataIcal) { |
594 | mChildNodes[Util::MultipartIcal] = dataIcal; | 606 | mChildParts[Util::MultipartIcal] = MimeMessagePart::Ptr(new MimeMessagePart(mOtp, dataIcal, true)); |
595 | } | 607 | } |
596 | 608 | ||
597 | if (dataText) { | 609 | if (dataText) { |
598 | mChildNodes[Util::MultipartPlain] = dataText; | 610 | mChildParts[Util::MultipartPlain] = MimeMessagePart::Ptr(new MimeMessagePart(mOtp, dataText, true)); |
599 | } | 611 | } |
600 | 612 | ||
601 | if (dataHtml) { | 613 | if (dataHtml) { |
602 | mChildNodes[Util::MultipartHtml] = dataHtml; | 614 | mChildParts[Util::MultipartHtml] = MimeMessagePart::Ptr(new MimeMessagePart(mOtp, dataHtml, true)); |
603 | } | 615 | } |
604 | 616 | ||
605 | if (mChildNodes.isEmpty()) { | 617 | if (mChildParts.isEmpty()) { |
606 | qCWarning(MIMETREEPARSER_LOG) << "no valid nodes"; | 618 | qCWarning(MIMETREEPARSER_LOG) << "no valid nodes"; |
607 | return; | ||
608 | } | ||
609 | |||
610 | QMapIterator<Util::HtmlMode, KMime::Content *> i(mChildNodes); | ||
611 | while (i.hasNext()) { | ||
612 | i.next(); | ||
613 | mChildParts[i.key()] = MimeMessagePart::Ptr(new MimeMessagePart(mOtp, i.value(), true)); | ||
614 | } | 619 | } |
615 | } | 620 | } |
616 | 621 | ||
diff --git a/framework/src/domain/mime/mimetreeparser/messagepart.h b/framework/src/domain/mime/mimetreeparser/messagepart.h index c576699e..9add81d2 100644 --- a/framework/src/domain/mime/mimetreeparser/messagepart.h +++ b/framework/src/domain/mime/mimetreeparser/messagepart.h | |||
@@ -245,7 +245,6 @@ public: | |||
245 | 245 | ||
246 | QList<Util::HtmlMode> availableModes(); | 246 | QList<Util::HtmlMode> availableModes(); |
247 | private: | 247 | private: |
248 | QMap<Util::HtmlMode, KMime::Content *> mChildNodes; | ||
249 | QMap<Util::HtmlMode, MimeMessagePart::Ptr> mChildParts; | 248 | QMap<Util::HtmlMode, MimeMessagePart::Ptr> mChildParts; |
250 | 249 | ||
251 | friend class DefaultRendererPrivate; | 250 | friend class DefaultRendererPrivate; |
diff --git a/framework/src/domain/mime/mimetreeparser/multipartalternative.cpp b/framework/src/domain/mime/mimetreeparser/multipartalternative.cpp index d0657edb..b1500136 100644 --- a/framework/src/domain/mime/mimetreeparser/multipartalternative.cpp +++ b/framework/src/domain/mime/mimetreeparser/multipartalternative.cpp | |||
@@ -47,35 +47,9 @@ MessagePart::Ptr MultiPartAlternativeBodyPartFormatter::process(Interface::BodyP | |||
47 | return MessagePart::Ptr(); | 47 | return MessagePart::Ptr(); |
48 | } | 48 | } |
49 | 49 | ||
50 | //Hardcoded after removing the source | ||
51 | auto preferredMode = MimeTreeParser::Util::Html; | ||
52 | AlternativeMessagePart::Ptr mp(new AlternativeMessagePart(part.objectTreeParser(), node)); | 50 | AlternativeMessagePart::Ptr mp(new AlternativeMessagePart(part.objectTreeParser(), node)); |
53 | if (mp->mChildNodes.isEmpty()) { | 51 | if (mp->mChildParts.isEmpty()) { |
54 | return MimeMessagePart::Ptr(new MimeMessagePart(part.objectTreeParser(), node->contents().at(0))); | 52 | return MimeMessagePart::Ptr(new MimeMessagePart(part.objectTreeParser(), node->contents().at(0))); |
55 | } | 53 | } |
56 | |||
57 | KMime::Content *dataIcal = mp->mChildNodes.contains(Util::MultipartIcal) ? mp->mChildNodes[Util::MultipartIcal] : nullptr; | ||
58 | KMime::Content *dataHtml = mp->mChildNodes.contains(Util::MultipartHtml) ? mp->mChildNodes[Util::MultipartHtml] : nullptr; | ||
59 | KMime::Content *dataPlain = mp->mChildNodes.contains(Util::MultipartPlain) ? mp->mChildNodes[Util::MultipartPlain] : nullptr; | ||
60 | |||
61 | // Make sure that in default ical is prefered over html and plain text | ||
62 | if (dataIcal && ((preferredMode != Util::MultipartHtml && preferredMode != Util::MultipartPlain))) { | ||
63 | if (dataHtml) { | ||
64 | part.nodeHelper()->setNodeProcessed(dataHtml, false); | ||
65 | } | ||
66 | if (dataPlain) { | ||
67 | part.nodeHelper()->setNodeProcessed(dataPlain, false); | ||
68 | } | ||
69 | preferredMode = Util::MultipartIcal; | ||
70 | } else if ((dataHtml && (preferredMode == Util::MultipartHtml || preferredMode == Util::Html)) || | ||
71 | (dataHtml && dataPlain && dataPlain->body().isEmpty())) { | ||
72 | if (dataPlain) { | ||
73 | part.nodeHelper()->setNodeProcessed(dataPlain, false); | ||
74 | } | ||
75 | preferredMode = Util::MultipartHtml; | ||
76 | } else if (!(preferredMode == Util::MultipartHtml) && dataPlain) { | ||
77 | part.nodeHelper()->setNodeProcessed(dataHtml, false); | ||
78 | preferredMode = Util::MultipartPlain; | ||
79 | } | ||
80 | return mp; | 54 | return mp; |
81 | } | 55 | } |
diff --git a/framework/src/domain/mime/mimetreeparser/tests/mimetreeparsertest.cpp b/framework/src/domain/mime/mimetreeparser/tests/mimetreeparsertest.cpp index 6b4280a9..7fa651bc 100644 --- a/framework/src/domain/mime/mimetreeparser/tests/mimetreeparsertest.cpp +++ b/framework/src/domain/mime/mimetreeparser/tests/mimetreeparsertest.cpp | |||
@@ -418,6 +418,26 @@ private slots: | |||
418 | auto attachments = otp.collectAttachmentParts(); | 418 | auto attachments = otp.collectAttachmentParts(); |
419 | QCOMPARE(attachments.size(), 1); | 419 | QCOMPARE(attachments.size(), 1); |
420 | } | 420 | } |
421 | |||
422 | void testAppleHtmlWithAttachmentsMixed() | ||
423 | { | ||
424 | MimeTreeParser::ObjectTreeParser otp; | ||
425 | otp.parseObjectTree(readMailFromFile("applehtmlwithattachmentsmixed.mbox")); | ||
426 | otp.decryptParts(); | ||
427 | otp.print(); | ||
428 | auto partList = otp.collectContentParts(); | ||
429 | QCOMPARE(partList.size(), 1); | ||
430 | auto part = partList[0].dynamicCast<MimeTreeParser::MessagePart>(); | ||
431 | QCOMPARE(part->encryptions().size(), 0); | ||
432 | QCOMPARE(part->signatures().size(), 0); | ||
433 | qWarning() << otp.plainTextContent(); | ||
434 | qWarning() << otp.htmlContent(); | ||
435 | QCOMPARE(otp.plainTextContent(), QString::fromUtf8("Hello\n\n\n\nRegards\n\nFsdfsdf")); | ||
436 | QCOMPARE(otp.htmlContent(), QString::fromUtf8("<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=us-ascii\"></head><body style=\"word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;\" class=\"\"><strike class=\"\">Hello</strike><div class=\"\"><br class=\"\"></div><div class=\"\"></div></body></html><html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=us-ascii\"></head><body style=\"word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;\" class=\"\"><div class=\"\"></div><div class=\"\"><br class=\"\"></div><div class=\"\"><b class=\"\">Regards</b></div><div class=\"\"><b class=\"\"><br class=\"\"></b></div><div class=\"\">Fsdfsdf</div></body></html>")); | ||
437 | |||
438 | auto attachments = otp.collectAttachmentParts(); | ||
439 | QCOMPARE(attachments.size(), 1); | ||
440 | } | ||
421 | }; | 441 | }; |
422 | 442 | ||
423 | QTEST_GUILESS_MAIN(InterfaceTest) | 443 | QTEST_GUILESS_MAIN(InterfaceTest) |
diff --git a/framework/src/domain/mime/testdata/applehtmlwithattachmentsmixed.mbox b/framework/src/domain/mime/testdata/applehtmlwithattachmentsmixed.mbox new file mode 100644 index 00000000..4c8d3bfd --- /dev/null +++ b/framework/src/domain/mime/testdata/applehtmlwithattachmentsmixed.mbox | |||
@@ -0,0 +1,74 @@ | |||
1 | Return-Path: <test1@kolab.org> | ||
2 | Received: from imapb020.mykolab.com ([unix socket]) | ||
3 | by imapb020.mykolab.com (Cyrus 2.5.11-41-gd53406f3f-Kolab-2.5.11-15.1.el7.kolab_16) with LMTPA; | ||
4 | Fri, 29 Jun 2018 17:10:33 +0200 | ||
5 | X-Sieve: CMU Sieve 2.4 | ||
6 | Received: from int-mx003.mykolab.com (unknown [10.9.13.3]) | ||
7 | by imapb020.mykolab.com (Postfix) with ESMTPS id DCFFB184 | ||
8 | for <test1@kolab.org>; Fri, 29 Jun 2018 17:10:33 +0200 (CEST) | ||
9 | Received: from ext-subm002.mykolab.com (unknown [10.9.6.2]) | ||
10 | by int-mx003.mykolab.com (Postfix) with ESMTPS id C5438A48 | ||
11 | for <test1@kolab.org>; Fri, 29 Jun 2018 17:10:33 +0200 (CEST) | ||
12 | From: Kolab <test1@kolab.org> | ||
13 | Content-Type: multipart/alternative; | ||
14 | boundary="Apple-Mail=_9D1C74B7-3E22-4635-805F-B86CE5F663C3" | ||
15 | Mime-Version: 1.0 (Mac OS X Mail 11.2 \(3445.5.20\)) | ||
16 | Subject: Apple attachment + signature | ||
17 | Message-Id: <0EDA7426-FD89-4C6D-8B28-9ACA7544FA6C@kolab.org> | ||
18 | Date: Fri, 29 Jun 2018 08:10:32 -0700 | ||
19 | To: John Doe <test1@kolab.org> | ||
20 | |||
21 | |||
22 | --Apple-Mail=_9D1C74B7-3E22-4635-805F-B86CE5F663C3 | ||
23 | Content-Transfer-Encoding: 7bit | ||
24 | Content-Type: text/plain; | ||
25 | charset=us-ascii | ||
26 | |||
27 | Hello | ||
28 | |||
29 | |||
30 | |||
31 | Regards | ||
32 | |||
33 | Fsdfsdf | ||
34 | --Apple-Mail=_9D1C74B7-3E22-4635-805F-B86CE5F663C3 | ||
35 | Content-Type: multipart/mixed; | ||
36 | boundary="Apple-Mail=_FA5BEB3B-6B22-4219-964C-85261C367D87" | ||
37 | |||
38 | |||
39 | --Apple-Mail=_FA5BEB3B-6B22-4219-964C-85261C367D87 | ||
40 | Content-Transfer-Encoding: 7bit | ||
41 | Content-Type: text/html; | ||
42 | charset=us-ascii | ||
43 | |||
44 | <html><head><meta http-equiv="Content-Type" content="text/html; charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><strike class="">Hello</strike><div class=""><br class=""></div><div class=""></div></body></html> | ||
45 | --Apple-Mail=_FA5BEB3B-6B22-4219-964C-85261C367D87 | ||
46 | Content-Disposition: attachment; | ||
47 | filename=rebuildkube.sh | ||
48 | Content-Type: application/octet-stream; | ||
49 | x-unix-mode=0755; | ||
50 | name="rebuildkube.sh" | ||
51 | Content-Transfer-Encoding: 7bit | ||
52 | |||
53 | set -e | ||
54 | |||
55 | export CMAKE_LIBRARY_PATH=/usr/local/Cellar/gettext/0.19.8.1/lib:/usr/local/Cellar/readline/7.0.3_1/lib | ||
56 | export CMAKE_INCLUDE_PATH=/usr/local/Cellar/gettext/0.19.8.1/include:/usr/local/Cellar/readline/7.0.3_1/include | ||
57 | export PATH=/usr/local/Cellar/gettext/0.19.8.1/bin:$PATH | ||
58 | export MACOSX_DEPLOYMENT_TARGET=10.9.0 #Minimum version to find the required type_traits header | ||
59 | export SDKROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/ | ||
60 | |||
61 | . craft/craftenv.sh | ||
62 | |||
63 | craft --install-deps --fetch --unpack --compile --install extragear/sink | ||
64 | craft --install-deps --fetch --unpack --compile --install --package extragear/kube | ||
65 | |||
66 | --Apple-Mail=_FA5BEB3B-6B22-4219-964C-85261C367D87 | ||
67 | Content-Transfer-Encoding: 7bit | ||
68 | Content-Type: text/html; | ||
69 | charset=us-ascii | ||
70 | |||
71 | <html><head><meta http-equiv="Content-Type" content="text/html; charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div class=""></div><div class=""><br class=""></div><div class=""><b class="">Regards</b></div><div class=""><b class=""><br class=""></b></div><div class="">Fsdfsdf</div></body></html> | ||
72 | --Apple-Mail=_FA5BEB3B-6B22-4219-964C-85261C367D87-- | ||
73 | |||
74 | --Apple-Mail=_9D1C74B7-3E22-4635-805F-B86CE5F663C3-- | ||