summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDamien Caliste <dcaliste@free.fr>2018-09-10 09:03:17 +0200
committerPekka Vuorela <pvuorela@iki.fi>2018-09-11 09:11:00 +0000
commit100331a6b73b97337ae59f40694162eed9201572 (patch)
tree36586e4770d83ec47e085b6a4a65ea757ba13c32
parentd676bc1e0e90d69d4c843460be5ad352e60d8a28 (diff)
Add recursion when looking for attachments
Some attachments are stored like that on disk for instance: $ ll 1454950441.21419.3MYc5-parts total 204 -rw-r--r-- 1 nemo 197093 Feb 8 17:54 2.1 -rw-r--r-- 1 nemo 936 Feb 8 17:54 1.2 -rw-r--r-- 1 nemo 936 Feb 8 17:54 1.1 The file 2.1 being a PDF. This kind of attachments are not listed, coming from the fact that in src/libraries/qmfclient/qmailmessage.cpp:1199, the inMultipartMixed() method is not recursive. It is listing only the first level of attachments (i.e. parts that are named [0-9]+ on disk). Making the attachment finder recursive have the drawback that some calendar invitations are now visible as attachment. This patch is taking care of this too. Structure of a failing email: Content-Type: multipart/mixed; boundary=--boundary_1233_7a77cb73-30a7-446e-ac29-52a7fda0bb71 MIME-Version: 1.0 ----boundary_1233_7a77cb73-30a7-446e-ac29-52a7fda0bb71 Content-Type: multipart/alternative; boundary=--boundary_1232_a7997778-4b33-4b26-a978-c17ad93d215e ----boundary_1232_a7997778-4b33-4b26-a978-c17ad93d215e Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 ----boundary_1232_a7997778-4b33-4b26-a978-c17ad93d215e Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: base64 ----boundary_1232_a7997778-4b33-4b26-a978-c17ad93d215e-- ----boundary_1233_7a77cb73-30a7-446e-ac29-52a7fda0bb71 Content-Type: multipart/mixed; boundary=--boundary_1234_3ec882e1-3b08-47d3-965b-1380c61b8e8e ----boundary_1234_3ec882e1-3b08-47d3-965b-1380c61b8e8e Content-Type: application/octet-stream; name="air china c.a. - itinerary receipt.pdf" Content-Transfer-Encoding: base64 Content-Disposition: attachment ----boundary_1234_3ec882e1-3b08-47d3-965b-1380c61b8e8e-- ----boundary_1233_7a77cb73-30a7-446e-ac29-52a7fda0bb71-- Change-Id: I00e6d0b1755fbfb6ecbd347b812c0db983d221f6 Reviewed-by: Michael Nosov <Michael.Nosov@harman.com> Reviewed-by: Pekka Vuorela <pvuorela@iki.fi>
-rw-r--r--src/libraries/qmfclient/qmailmessage.cpp12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/libraries/qmfclient/qmailmessage.cpp b/src/libraries/qmfclient/qmailmessage.cpp
index da8b74b7..867d0aa2 100644
--- a/src/libraries/qmfclient/qmailmessage.cpp
+++ b/src/libraries/qmfclient/qmailmessage.cpp
@@ -1149,6 +1149,9 @@ namespace findAttachments
if (container.multipartType() == QMailMessagePart::MultipartMixed) {
inMultipartMixed(container, found, hasAttachments);
}
+ if (container.multipartType() == QMailMessagePart::MultipartAlternative) {
+ inMultipartMixed(container, found, hasAttachments);
+ }
if (container.multipartType() == QMailMessagePart::MultipartSigned) {
inMultipartSigned(container, found, hasAttachments);
}
@@ -1166,6 +1169,9 @@ namespace findAttachments
bool isText = (contentType.type().toLower() == "text") &&
((contentType.subType().toLower() == "plain") || (contentType.subType().toLower() == "html"));
+ bool isCalendar = (contentType.type().toLower() == "text") &&
+ (contentType.subType().toLower() == "calendar");
+
bool isInLine = (!part.contentDisposition().isNull()) &&
(part.contentDisposition().type() == QMailMessageContentDisposition::Inline);
@@ -1177,7 +1183,7 @@ namespace findAttachments
// Attached messages are considered as attachments even if content disposition
// is inline instead of attachment, but only if they aren't text/plain nor text/html
- if (isRFC822 || isAttachment || (isInLine && !isText)) {
+ if (isRFC822 || isAttachment || (isInLine && !isText && !isCalendar)) {
if (found) {
*found << part.location();
}
@@ -1197,6 +1203,10 @@ namespace findAttachments
case QMailMessagePart::MultipartNone:
inMultipartNone(part, found, hasAttachments);
break;
+ case QMailMessagePart::MultipartMixed:
+ case QMailMessagePart::MultipartAlternative:
+ inMultipartMixed(part, found, hasAttachments);
+ break;
default:
break;
}