summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2018-04-24 15:16:04 +0200
committerChristian Mollekopf <chrigi_1@fastmail.fm>2018-04-25 10:24:22 +0200
commit41f1c5c6b1403306535f308d2656a3ba94fb9a5c (patch)
tree125ed924281e37422e4c01d79a2b633b9ecbd9ae
parent14e46bdc5647c03e667a88676916ef414adf69f3 (diff)
downloadkube-41f1c5c6b1403306535f308d2656a3ba94fb9a5c.tar.gz
kube-41f1c5c6b1403306535f308d2656a3ba94fb9a5c.zip
Deal with rfc822 header parts
As inserted by autocrypt enabled clients.
-rw-r--r--framework/src/domain/mime/mimetreeparser/bodypartformatter_impl.cpp43
-rw-r--r--framework/src/domain/mime/mimetreeparser/messagepart.cpp10
-rw-r--r--framework/src/domain/mime/mimetreeparser/messagepart.h9
-rw-r--r--framework/src/domain/mime/mimetreeparser/tests/mimetreeparsertest.cpp15
-rw-r--r--framework/src/domain/mime/testdata/openpgp-multipart-embedded.mbox76
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;
94public: 94public:
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
99const MessageRfc822BodyPartFormatter *MessageRfc822BodyPartFormatter::self; 109const MessageRfc822BodyPartFormatter *MessageRfc822BodyPartFormatter::self;
100 110
101const MimeTreeParser::Interface::BodyPartFormatter *MessageRfc822BodyPartFormatter::create() 111class HeadersBodyPartFormatter
112 : public MimeTreeParser::Interface::BodyPartFormatter
102{ 113{
103 if (!self) { 114 static const HeadersBodyPartFormatter *self;
104 self = new MessageRfc822BodyPartFormatter(); 115public:
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
109MessagePart::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
115typedef TextPlainBodyPartFormatter ApplicationPgpBodyPartFormatter; 129const HeadersBodyPartFormatter *HeadersBodyPartFormatter::self = nullptr;
116 130
117} // anon namespace 131} // anon namespace
118 132
119void BodyPartFormatterBaseFactoryPrivate::messageviewer_create_builtin_bodypart_formatters() 133void 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
1164HeadersPart::HeadersPart(ObjectTreeParser *otp, KMime::Content *node)
1165 : MessagePart(otp, QString(), node)
1166{
1167}
1168
1169HeadersPart::~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
378class HeadersPart : public MessagePart
379{
380 Q_OBJECT
381public:
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
376QTEST_GUILESS_MAIN(InterfaceTest) 391QTEST_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 @@
1To: test@kolab.org
2From: test1 <test1@kolab.org>
3Openpgp: preference=signencrypt
4Autocrypt: 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==
28Message-ID: <9af7e819-eb6c-d243-cd2d-b04d23ba2c0d@kolab.org>
29Date: Mon, 23 Apr 2018 17:11:58 +0200
30User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101
31 Thunderbird/52.7.0
32MIME-Version: 1.0
33Subject: Encrypted Message
34Content-Type: multipart/encrypted;
35 protocol="application/pgp-encrypted";
36 boundary="EjqoZxTNU00i9s539J9SoOOl3OuK0xUCc"
37
38This is an OpenPGP/MIME encrypted message (RFC 4880 and 3156)
39--EjqoZxTNU00i9s539J9SoOOl3OuK0xUCc
40Content-Type: application/pgp-encrypted
41Content-Description: PGP/MIME version identification
42
43Version: 1
44
45--EjqoZxTNU00i9s539J9SoOOl3OuK0xUCc
46Content-Type: application/octet-stream; name="encrypted.asc"
47Content-Description: OpenPGP encrypted message
48Content-Disposition: inline; filename="encrypted.asc"
49
50-----BEGIN PGP MESSAGE-----
51
52hQEMAwzOQ1qnzNo7AQf/QznYpLuJ+BB9BBoYFjISqGek8blRD8UVO96E8yYSeAXL
53uILJUakYjykzwg+Yd+yjR1arye1BYEnrpftXVR//WdkitPsq2nzxkHynCJCiMsl8
54LIx2u8OoAXJa5L0ohERKt/MAJn6H+x2+WxVzIGtaOw7K7rBL+J800wB6KkxKdvlF
55rFkfmlfJOKueOPUVzvQHJBLJXcdKH5z8GikESKrRGWpTn5DdFIG2nmxuMhNndcrd
566oXZ11PMKr3QTrjG7huntvASQQ9Vd3Kxvi8kqaJIdspRckoZd65Xo+UdC+VWFYH8
57ynsWX3F3zqRxHhK7IZgaTLHRc55NzdXLmtQ5zVt6pIUBDAPKpRg2CPD7UAEIALbc
58/NnS49ghW+fN7RkIwHyXX/kcZk/+87ydT6Tvh3xdcgZY9Aczwcx64kvP4M5PXaaT
59xxsXK0vLtk19vGJEeMzHGHacp1QQzZwCRa4Pmi2cyiK+J5TpF8RapZflLwIQ+zWk
60WRSa6jpd5SzQvEQ8t8OQ9PYOEhNYZLHkZCRK3bwY7jW1RzqnWgHbHk8M70YzBZw4
61RMLwNuNfYw25TJFxnlhPUiN56z0ZsNOj16TTyINLI1pCLG8boKfEzCCMyIHZpU+U
624DGM9ziLA/gH1MYcONPogwi24pUXW2ssoT5bIfNFGhT8DAZYAwyHeJnrCbEdcfp5
63CepYtnkH1Gfz1KQ66oHSwNUBqvtjoE5wA+EYxoTopJ5/g5qtcfsYh9o6ksepFjZb
64+rzhzI8XtGs43+YE1QrOx9N7E/XiG1iXTqeqyKfq6vGgfE4tfgZlRcnI1sllwX2X
65/2Va7aWr7VRt2DJ444XKRtmwP2U47lqM0SEGb01SOI2WBfxB0lAsetNS7t83KoCb
66W/JHj9zEpLEiGr8lrI+8ydXlfFA4nTlugwJP2o42fU9EMDzieUFfaX7wzKKXQq8R
67ek04j5PcJSeRBr5/HyrAR3QUoB8qL/9KqOxmcW/aKLteshYWuDWRhDYaTIsLJV6p
68Or4+8qV5bonBZHuRXDOt3qxWd0++msUqj8Kkw0cZ5ID7EsQFdYBapxDz7ZKj5PM6
69AEmzYarsM9FKsVMx7KMxIpkOOEWXN6/jrhIO1rkk4WQvl79BW9gj+6DnBwpM4R/k
70bnuWedSvbL/4ee21XWf4p01aF+RHn1UbvOqkfwX69M00crE7PnNaeMbKy46bcELF
71OTNGkv7SYoUmctTINyV3zPWxJnsIkrSFurKXF/+6tSnaItU1ziM=
72=L0oI
73-----END PGP MESSAGE-----
74
75--EjqoZxTNU00i9s539J9SoOOl3OuK0xUCc--
76