summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2018-06-29 17:27:31 +0200
committerChristian Mollekopf <chrigi_1@fastmail.fm>2018-06-29 17:27:31 +0200
commitd81eea635c2151c2c9c62a53c08e427c38ad0acd (patch)
tree3dc1eda9702f060eac17581b74c7b848dcc7301c
parent4e338ae323fc6fcdfb641cf463f60946bcbbc60e (diff)
downloadkube-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.
-rw-r--r--framework/src/domain/mime/mimetreeparser/messagepart.cpp27
-rw-r--r--framework/src/domain/mime/mimetreeparser/messagepart.h1
-rw-r--r--framework/src/domain/mime/mimetreeparser/multipartalternative.cpp28
-rw-r--r--framework/src/domain/mime/mimetreeparser/tests/mimetreeparsertest.cpp20
-rw-r--r--framework/src/domain/mime/testdata/applehtmlwithattachmentsmixed.mbox74
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();
247private: 247private:
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
423QTEST_GUILESS_MAIN(InterfaceTest) 443QTEST_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 @@
1Return-Path: <test1@kolab.org>
2Received: 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
5X-Sieve: CMU Sieve 2.4
6Received: 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)
9Received: 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)
12From: Kolab <test1@kolab.org>
13Content-Type: multipart/alternative;
14 boundary="Apple-Mail=_9D1C74B7-3E22-4635-805F-B86CE5F663C3"
15Mime-Version: 1.0 (Mac OS X Mail 11.2 \(3445.5.20\))
16Subject: Apple attachment + signature
17Message-Id: <0EDA7426-FD89-4C6D-8B28-9ACA7544FA6C@kolab.org>
18Date: Fri, 29 Jun 2018 08:10:32 -0700
19To: John Doe <test1@kolab.org>
20
21
22--Apple-Mail=_9D1C74B7-3E22-4635-805F-B86CE5F663C3
23Content-Transfer-Encoding: 7bit
24Content-Type: text/plain;
25 charset=us-ascii
26
27Hello
28
29
30
31Regards
32
33Fsdfsdf
34--Apple-Mail=_9D1C74B7-3E22-4635-805F-B86CE5F663C3
35Content-Type: multipart/mixed;
36 boundary="Apple-Mail=_FA5BEB3B-6B22-4219-964C-85261C367D87"
37
38
39--Apple-Mail=_FA5BEB3B-6B22-4219-964C-85261C367D87
40Content-Transfer-Encoding: 7bit
41Content-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
46Content-Disposition: attachment;
47 filename=rebuildkube.sh
48Content-Type: application/octet-stream;
49 x-unix-mode=0755;
50 name="rebuildkube.sh"
51Content-Transfer-Encoding: 7bit
52
53set -e
54
55export CMAKE_LIBRARY_PATH=/usr/local/Cellar/gettext/0.19.8.1/lib:/usr/local/Cellar/readline/7.0.3_1/lib
56export CMAKE_INCLUDE_PATH=/usr/local/Cellar/gettext/0.19.8.1/include:/usr/local/Cellar/readline/7.0.3_1/include
57export PATH=/usr/local/Cellar/gettext/0.19.8.1/bin:$PATH
58export MACOSX_DEPLOYMENT_TARGET=10.9.0 #Minimum version to find the required type_traits header
59export SDKROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/
60
61. craft/craftenv.sh
62
63craft --install-deps --fetch --unpack --compile --install extragear/sink
64craft --install-deps --fetch --unpack --compile --install --package extragear/kube
65
66--Apple-Mail=_FA5BEB3B-6B22-4219-964C-85261C367D87
67Content-Transfer-Encoding: 7bit
68Content-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--