diff options
5 files changed, 139 insertions, 14 deletions
diff --git a/framework/src/domain/mime/mimetreeparser/bodypartformatter_impl.cpp b/framework/src/domain/mime/mimetreeparser/bodypartformatter_impl.cpp index 532a906e..a6713fef 100644 --- a/framework/src/domain/mime/mimetreeparser/bodypartformatter_impl.cpp +++ b/framework/src/domain/mime/mimetreeparser/bodypartformatter_impl.cpp | |||
@@ -92,34 +92,48 @@ class MessageRfc822BodyPartFormatter | |||
92 | { | 92 | { |
93 | static const MessageRfc822BodyPartFormatter *self; | 93 | static const MessageRfc822BodyPartFormatter *self; |
94 | public: | 94 | public: |
95 | MessagePart::Ptr process(Interface::BodyPart &) const Q_DECL_OVERRIDE; | 95 | MessagePart::Ptr process(Interface::BodyPart &part) const Q_DECL_OVERRIDE |
96 | static const MimeTreeParser::Interface::BodyPartFormatter *create(); | 96 | { |
97 | return MessagePart::Ptr(new EncapsulatedRfc822MessagePart(part.objectTreeParser(), part.content(), part.content()->bodyAsMessage())); | ||
98 | } | ||
99 | |||
100 | static const MimeTreeParser::Interface::BodyPartFormatter *create() | ||
101 | { | ||
102 | if (!self) { | ||
103 | self = new MessageRfc822BodyPartFormatter(); | ||
104 | } | ||
105 | return self; | ||
106 | } | ||
97 | }; | 107 | }; |
98 | 108 | ||
99 | const MessageRfc822BodyPartFormatter *MessageRfc822BodyPartFormatter::self; | 109 | const MessageRfc822BodyPartFormatter *MessageRfc822BodyPartFormatter::self; |
100 | 110 | ||
101 | const MimeTreeParser::Interface::BodyPartFormatter *MessageRfc822BodyPartFormatter::create() | 111 | class HeadersBodyPartFormatter |
112 | : public MimeTreeParser::Interface::BodyPartFormatter | ||
102 | { | 113 | { |
103 | if (!self) { | 114 | static const HeadersBodyPartFormatter *self; |
104 | self = new MessageRfc822BodyPartFormatter(); | 115 | public: |
116 | MessagePart::Ptr process(Interface::BodyPart &part) const Q_DECL_OVERRIDE | ||
117 | { | ||
118 | return MessagePart::Ptr(new HeadersPart(part.objectTreeParser(), part.content())); | ||
105 | } | 119 | } |
106 | return self; | ||
107 | } | ||
108 | 120 | ||
109 | MessagePart::Ptr MessageRfc822BodyPartFormatter::process(Interface::BodyPart &part) const | 121 | static const MimeTreeParser::Interface::BodyPartFormatter *create() { |
110 | { | 122 | if (!self) { |
111 | const KMime::Message::Ptr message = part.content()->bodyAsMessage(); | 123 | self = new HeadersBodyPartFormatter(); |
112 | return MessagePart::Ptr(new EncapsulatedRfc822MessagePart(part.objectTreeParser(), part.content(), message)); | 124 | } |
113 | } | 125 | return self; |
126 | } | ||
127 | }; | ||
114 | 128 | ||
115 | typedef TextPlainBodyPartFormatter ApplicationPgpBodyPartFormatter; | 129 | const HeadersBodyPartFormatter *HeadersBodyPartFormatter::self = nullptr; |
116 | 130 | ||
117 | } // anon namespace | 131 | } // anon namespace |
118 | 132 | ||
119 | void BodyPartFormatterBaseFactoryPrivate::messageviewer_create_builtin_bodypart_formatters() | 133 | void BodyPartFormatterBaseFactoryPrivate::messageviewer_create_builtin_bodypart_formatters() |
120 | { | 134 | { |
121 | insert("application", "octet-stream", AnyTypeBodyPartFormatter::create()); | 135 | insert("application", "octet-stream", AnyTypeBodyPartFormatter::create()); |
122 | insert("application", "pgp", ApplicationPgpBodyPartFormatter::create()); | 136 | insert("application", "pgp", TextPlainBodyPartFormatter::create()); |
123 | insert("application", "pkcs7-mime", ApplicationPkcs7MimeBodyPartFormatter::create()); | 137 | insert("application", "pkcs7-mime", ApplicationPkcs7MimeBodyPartFormatter::create()); |
124 | insert("application", "x-pkcs7-mime", ApplicationPkcs7MimeBodyPartFormatter::create()); | 138 | insert("application", "x-pkcs7-mime", ApplicationPkcs7MimeBodyPartFormatter::create()); |
125 | insert("application", "pgp-encrypted", ApplicationPGPEncryptedBodyPartFormatter::create()); | 139 | insert("application", "pgp-encrypted", ApplicationPGPEncryptedBodyPartFormatter::create()); |
@@ -129,6 +143,7 @@ void BodyPartFormatterBaseFactoryPrivate::messageviewer_create_builtin_bodypart_ | |||
129 | insert("text", "rtf", AnyTypeBodyPartFormatter::create()); | 143 | insert("text", "rtf", AnyTypeBodyPartFormatter::create()); |
130 | insert("text", "plain", MailmanBodyPartFormatter::create()); | 144 | insert("text", "plain", MailmanBodyPartFormatter::create()); |
131 | insert("text", "plain", TextPlainBodyPartFormatter::create()); | 145 | insert("text", "plain", TextPlainBodyPartFormatter::create()); |
146 | insert("text", "rfc822-headers", HeadersBodyPartFormatter::create()); | ||
132 | insert("text", "*", MailmanBodyPartFormatter::create()); | 147 | insert("text", "*", MailmanBodyPartFormatter::create()); |
133 | insert("text", "*", TextPlainBodyPartFormatter::create()); | 148 | insert("text", "*", TextPlainBodyPartFormatter::create()); |
134 | 149 | ||
diff --git a/framework/src/domain/mime/mimetreeparser/messagepart.cpp b/framework/src/domain/mime/mimetreeparser/messagepart.cpp index 541efd7f..17719ff8 100644 --- a/framework/src/domain/mime/mimetreeparser/messagepart.cpp +++ b/framework/src/domain/mime/mimetreeparser/messagepart.cpp | |||
@@ -1160,3 +1160,13 @@ QDateTime EncapsulatedRfc822MessagePart::date() const | |||
1160 | } | 1160 | } |
1161 | return {}; | 1161 | return {}; |
1162 | } | 1162 | } |
1163 | |||
1164 | HeadersPart::HeadersPart(ObjectTreeParser *otp, KMime::Content *node) | ||
1165 | : MessagePart(otp, QString(), node) | ||
1166 | { | ||
1167 | } | ||
1168 | |||
1169 | HeadersPart::~HeadersPart() | ||
1170 | { | ||
1171 | |||
1172 | } | ||
diff --git a/framework/src/domain/mime/mimetreeparser/messagepart.h b/framework/src/domain/mime/mimetreeparser/messagepart.h index 1d416e8f..c039637a 100644 --- a/framework/src/domain/mime/mimetreeparser/messagepart.h +++ b/framework/src/domain/mime/mimetreeparser/messagepart.h | |||
@@ -375,6 +375,15 @@ protected: | |||
375 | friend class ::PartPrivate; | 375 | friend class ::PartPrivate; |
376 | }; | 376 | }; |
377 | 377 | ||
378 | class HeadersPart : public MessagePart | ||
379 | { | ||
380 | Q_OBJECT | ||
381 | public: | ||
382 | typedef QSharedPointer<HeadersPart> Ptr; | ||
383 | HeadersPart(ObjectTreeParser *otp, KMime::Content *node); | ||
384 | virtual ~HeadersPart(); | ||
385 | }; | ||
386 | |||
378 | } | 387 | } |
379 | 388 | ||
380 | #endif //__MIMETREEPARSER_MESSAGEPART_H__ | 389 | #endif //__MIMETREEPARSER_MESSAGEPART_H__ |
diff --git a/framework/src/domain/mime/mimetreeparser/tests/mimetreeparsertest.cpp b/framework/src/domain/mime/mimetreeparser/tests/mimetreeparsertest.cpp index 961dbf9a..90a07a7c 100644 --- a/framework/src/domain/mime/mimetreeparser/tests/mimetreeparsertest.cpp +++ b/framework/src/domain/mime/mimetreeparser/tests/mimetreeparsertest.cpp | |||
@@ -371,6 +371,21 @@ private slots: | |||
371 | QCOMPARE(part->signatureState(), MimeTreeParser::KMMsgFullySigned); | 371 | QCOMPARE(part->signatureState(), MimeTreeParser::KMMsgFullySigned); |
372 | QVERIFY(otp.plainTextContent().contains(QString::fromUtf8("encrypted message text"))); | 372 | QVERIFY(otp.plainTextContent().contains(QString::fromUtf8("encrypted message text"))); |
373 | } | 373 | } |
374 | |||
375 | void testOpenpgpMultipartEmbedded() | ||
376 | { | ||
377 | MimeTreeParser::ObjectTreeParser otp; | ||
378 | otp.parseObjectTree(readMailFromFile("openpgp-multipart-embedded.mbox")); | ||
379 | otp.print(); | ||
380 | otp.decryptParts(); | ||
381 | otp.print(); | ||
382 | auto partList = otp.collectContentParts(); | ||
383 | QCOMPARE(partList.size(), 1); | ||
384 | auto part = partList[0].dynamicCast<MimeTreeParser::MessagePart>(); | ||
385 | QCOMPARE(part->encryptions().size(), 1); | ||
386 | QCOMPARE(part->encryptionState(), MimeTreeParser::KMMsgFullyEncrypted); | ||
387 | QCOMPARE(otp.plainTextContent(), QString::fromUtf8("sdflskjsdf\n\n-- \nThis is a HTML signature.\n")); | ||
388 | } | ||
374 | }; | 389 | }; |
375 | 390 | ||
376 | QTEST_GUILESS_MAIN(InterfaceTest) | 391 | QTEST_GUILESS_MAIN(InterfaceTest) |
diff --git a/framework/src/domain/mime/testdata/openpgp-multipart-embedded.mbox b/framework/src/domain/mime/testdata/openpgp-multipart-embedded.mbox new file mode 100644 index 00000000..d5fc4ca2 --- /dev/null +++ b/framework/src/domain/mime/testdata/openpgp-multipart-embedded.mbox | |||
@@ -0,0 +1,76 @@ | |||
1 | To: test@kolab.org | ||
2 | From: test1 <test1@kolab.org> | ||
3 | Openpgp: preference=signencrypt | ||
4 | Autocrypt: addr=test1@kolab.org; prefer-encrypt=mutual; keydata= | ||
5 | xsBNBFrd3FcBCADAGsU4BTBJ7nXGZ2IV6ZpSDcuZeCteDdrp9YNGYdax49Z9rn2RIfMur07i | ||
6 | A3zkLuQSI63QpWr/sp8Kkcs+OMRfeNAHSyQcdOwE/SU/PF45LHYcgvdgL7bvNRiyrn++eXar | ||
7 | woCH/QNZFgsy4PQCBW4DXor4jeDgeKisdk+ArpSY+Dd5l+Gdna8GQyUHWOL15gKUEDBq9dta | ||
8 | fswI18LxTSIbofsSxnQ0BgHNgn4bFXRLWiFJMyjvXXwZAXmChpxchESeIyu3Bvu38kA+jNDh | ||
9 | QmJL359mbXtu6JtvUjL0T9xhydHhGQ8iHCUpUkAh50KDJUUFQAUD+wSeMbsr7dk/osBdABEB | ||
10 | AAHNHVRlc3QxIEtvbGFiIDx0ZXN0MUBrb2xhYi5vcmc+wsCOBBMBCAA4FiEEy9EWSF25Vgyj | ||
11 | zZHgLjt3h7G3WSAFAlrd3FcCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQLjt3h7G3 | ||
12 | WSBwjAf6A9D/BOo6ixWfrTAfunk06TIt309P33/aIrhmICUoJ3KxatnMfcFr9GDnVtGv7RZl | ||
13 | VG43dWLMz8ghjGVjWOQUzlYl19HS/7KfHFE3jQHawcidYHcsVBbD/Ml9lCRnE4CcO/7MqObh | ||
14 | FHVIO+M0XJK82Qqu1kZ2ySNOMG+DJ3JGMEWMwrf8HjdwfANCn9uW4G9+q3dyN7TWUaYVLf74 | ||
15 | Ekz2KpCxi0Y/b/01+8UR6iSRbn+5R2CIPhgdrrfYlHaB1HHeeJlue8JK3zxYcRTfD4B2c8Jj | ||
16 | UAMO0Y8A7PMTj9SpnBt+t4XUyrTwwqLwulRBAQBHSPI7jQ6JVM2yTOe7Yy1dbc7ATQRa3dxX | ||
17 | AQgAy/RH8KEQHk2SJ60G0YJkOSioGNU+sAMP6rKIH8AXljZEwriiWqxcunoHlrOHOfuyBBL2 | ||
18 | TTiien0247g7q2i7aPBZhll7/cp4DZKcsLZ9QIkB4sHY1SaVT865dIfhoxcKwi8NzbemDsUQ | ||
19 | QB6f9P3CSZqFW2EohzKf3vfYnLVLTRvzlndAzThYXso1iWeX9v1JtzOi4w7JP5RvTMx+FXCy | ||
20 | ibfkLGJL2ZG6rapK7jtn8SfJGiQeH441OmEDjtfqrADKDY/pKJdPeEzakuZuxhrh8FtFjtZX | ||
21 | WU9dbzE46uXUA/ChLW0H/zuyxseVCHyAbF5pFyibGfk1hmYFVwjQotHojwARAQABwsB2BBgB | ||
22 | CAAgFiEEy9EWSF25VgyjzZHgLjt3h7G3WSAFAlrd3FcCGwwACgkQLjt3h7G3WSDJrAgApMbl | ||
23 | U4PAoe04jVSIMApU8Q22NNysZGS3l6KLpOqS/1DXd2U0S6EbFcCmUUwu3tk6nz6qCBKu7SEe | ||
24 | E1bjJUSB5880IA3C8HC1VDHCdVMJGJKvpqnj/4Jf8STQROL7UeQXZvby5CRZGMV7lBDAquG6 | ||
25 | vk3Eo3CeAfKel+XtHA/qruayTVHn1PV3/22ThcnXkwB3Mpdflz/tmPwHZqwOPavpJMckE03K | ||
26 | HNzSulXDNXdGqd4kKu43UIYnfm/3jnfK/LOrOK8zl40mk26Vm19MMRgc2TP6a70J5r6H1RLU | ||
27 | BTEkoVskD4m6I1G4FEIPq1g8jv7e0zcukh3vdpdKKxR+69M/2w== | ||
28 | Message-ID: <9af7e819-eb6c-d243-cd2d-b04d23ba2c0d@kolab.org> | ||
29 | Date: Mon, 23 Apr 2018 17:11:58 +0200 | ||
30 | User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 | ||
31 | Thunderbird/52.7.0 | ||
32 | MIME-Version: 1.0 | ||
33 | Subject: Encrypted Message | ||
34 | Content-Type: multipart/encrypted; | ||
35 | protocol="application/pgp-encrypted"; | ||
36 | boundary="EjqoZxTNU00i9s539J9SoOOl3OuK0xUCc" | ||
37 | |||
38 | This is an OpenPGP/MIME encrypted message (RFC 4880 and 3156) | ||
39 | --EjqoZxTNU00i9s539J9SoOOl3OuK0xUCc | ||
40 | Content-Type: application/pgp-encrypted | ||
41 | Content-Description: PGP/MIME version identification | ||
42 | |||
43 | Version: 1 | ||
44 | |||
45 | --EjqoZxTNU00i9s539J9SoOOl3OuK0xUCc | ||
46 | Content-Type: application/octet-stream; name="encrypted.asc" | ||
47 | Content-Description: OpenPGP encrypted message | ||
48 | Content-Disposition: inline; filename="encrypted.asc" | ||
49 | |||
50 | -----BEGIN PGP MESSAGE----- | ||
51 | |||
52 | hQEMAwzOQ1qnzNo7AQf/QznYpLuJ+BB9BBoYFjISqGek8blRD8UVO96E8yYSeAXL | ||
53 | uILJUakYjykzwg+Yd+yjR1arye1BYEnrpftXVR//WdkitPsq2nzxkHynCJCiMsl8 | ||
54 | LIx2u8OoAXJa5L0ohERKt/MAJn6H+x2+WxVzIGtaOw7K7rBL+J800wB6KkxKdvlF | ||
55 | rFkfmlfJOKueOPUVzvQHJBLJXcdKH5z8GikESKrRGWpTn5DdFIG2nmxuMhNndcrd | ||
56 | 6oXZ11PMKr3QTrjG7huntvASQQ9Vd3Kxvi8kqaJIdspRckoZd65Xo+UdC+VWFYH8 | ||
57 | ynsWX3F3zqRxHhK7IZgaTLHRc55NzdXLmtQ5zVt6pIUBDAPKpRg2CPD7UAEIALbc | ||
58 | /NnS49ghW+fN7RkIwHyXX/kcZk/+87ydT6Tvh3xdcgZY9Aczwcx64kvP4M5PXaaT | ||
59 | xxsXK0vLtk19vGJEeMzHGHacp1QQzZwCRa4Pmi2cyiK+J5TpF8RapZflLwIQ+zWk | ||
60 | WRSa6jpd5SzQvEQ8t8OQ9PYOEhNYZLHkZCRK3bwY7jW1RzqnWgHbHk8M70YzBZw4 | ||
61 | RMLwNuNfYw25TJFxnlhPUiN56z0ZsNOj16TTyINLI1pCLG8boKfEzCCMyIHZpU+U | ||
62 | 4DGM9ziLA/gH1MYcONPogwi24pUXW2ssoT5bIfNFGhT8DAZYAwyHeJnrCbEdcfp5 | ||
63 | CepYtnkH1Gfz1KQ66oHSwNUBqvtjoE5wA+EYxoTopJ5/g5qtcfsYh9o6ksepFjZb | ||
64 | +rzhzI8XtGs43+YE1QrOx9N7E/XiG1iXTqeqyKfq6vGgfE4tfgZlRcnI1sllwX2X | ||
65 | /2Va7aWr7VRt2DJ444XKRtmwP2U47lqM0SEGb01SOI2WBfxB0lAsetNS7t83KoCb | ||
66 | W/JHj9zEpLEiGr8lrI+8ydXlfFA4nTlugwJP2o42fU9EMDzieUFfaX7wzKKXQq8R | ||
67 | ek04j5PcJSeRBr5/HyrAR3QUoB8qL/9KqOxmcW/aKLteshYWuDWRhDYaTIsLJV6p | ||
68 | Or4+8qV5bonBZHuRXDOt3qxWd0++msUqj8Kkw0cZ5ID7EsQFdYBapxDz7ZKj5PM6 | ||
69 | AEmzYarsM9FKsVMx7KMxIpkOOEWXN6/jrhIO1rkk4WQvl79BW9gj+6DnBwpM4R/k | ||
70 | bnuWedSvbL/4ee21XWf4p01aF+RHn1UbvOqkfwX69M00crE7PnNaeMbKy46bcELF | ||
71 | OTNGkv7SYoUmctTINyV3zPWxJnsIkrSFurKXF/+6tSnaItU1ziM= | ||
72 | =L0oI | ||
73 | -----END PGP MESSAGE----- | ||
74 | |||
75 | --EjqoZxTNU00i9s539J9SoOOl3OuK0xUCc-- | ||
76 | |||