diff --git a/mimetreeparser/src/messagepart.h b/mimetreeparser/src/messagepart.h --- a/mimetreeparser/src/messagepart.h +++ b/mimetreeparser/src/messagepart.h @@ -234,6 +234,7 @@ ~HtmlMessagePart() override; QString text() const override; + QString plaintextContent() const override; void fix() const override; bool isHtml() const override; diff --git a/mimetreeparser/src/messagepart.cpp b/mimetreeparser/src/messagepart.cpp --- a/mimetreeparser/src/messagepart.cpp +++ b/mimetreeparser/src/messagepart.cpp @@ -482,6 +482,11 @@ return mBodyHTML; } +QString MimeTreeParser::HtmlMessagePart::plaintextContent() const +{ + return QString(); +} + bool HtmlMessagePart::isHtml() const { return true; diff --git a/templateparser/autotests/data/404698-gpg-html.mbox b/templateparser/autotests/data/404698-gpg-html.mbox new file mode 100644 --- /dev/null +++ b/templateparser/autotests/data/404698-gpg-html.mbox @@ -0,0 +1,131 @@ +Subject: Testcase 'reply-mix-crlf' (PGP/MIME HTML) +To: brucewayne45@web.de +From: brucewayne45@web.de +MIME-Version: 1.0 +Content-Type: multipart/mixed; boundary="BOUNDARY" + +--BOUNDARY +Content-Type: text/plain + +Please reply to this message +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. + +--BOUNDARY +Content-Type: multipart/encrypted; protocol="application/pgp-encrypted"; boundary="DELIMITER" + +--DELIMITER +Content-Type: application/pgp-encrypted + +Version: 1 + +--DELIMITER +Content-Type: application/octet-stream; name="encrypted.asc" +Content-Disposition: inline; filename="encrypted.asc" + +-----BEGIN PGP MESSAGE----- + +hQELAwzOQ1qnzNo7AQf3Zp/i09urv4DVCcbCu75LQqVtkanqYIaVF+CgUX2aeReD +VIf6Q58I5lX0+ZighYMjoqFyLoIg8KfazaiCZ7prwTOjTUxgVIaEUt46E/zaIU64 +y0M09xrD0ZXvdCb2DPbzBI2YGCUOg+WRN0Bjv90DXgqXLDzdHqJ4w/iFTF3sXTW0 +nxAeOqNWwr4vSOG2AfTbIHpAspl2woqnoKds0dxA8DgGD9ffGx1/VL9aoNPuhdGf +GWko1NfHnwgTaLEBr5Yr5uaDfPvtMfIdtw6HVc5xZfmlPfES9NeL0aHmHe9htuFf +fyEHzFHJDxqny5/PqULxcxBpKJH2jQuGWtzswOj/0sD4ASnTPJ/AmGqI2pWT1KIS +m1mSw7VBTK/f47EeQhdWIbIVt6+oqfjum+aAkwEEOGcUHNcNwclKYlHT1hUesNr5 +mj0XpKVUz1WBRI0O5Vedt7xNJOUIhBSOeiDrZ3dhn8kD12aJvP0NUx88jeR87U3k +F5UvDfsWyjqN4GMzjVV3vLsGShR+8C7I2+DPebyoLUfkqeEUUJOwYg4YL+gjAVHR +VKNvQIQWC5PFMm5LasDF0UdfTtKI+kWYgGTWVKQawr3nBJmly2b2By9biUh2Z4Ly +pUHqKpHEKW5O+VLd0dgzYV9x5Wq7zkKKX44B55W050bh3u9iztfZvghd16Cy7OYB +9h20ZMKFffkZCorrhiN6mHr1YkPXI30ZwC1xkQ6YuUlwIpE5gJr4D14+/zFcJsU0 +grdLbDzFApcwrGrxjiFGMb8tbS6XYyB0uVh0NEX7YGUHYtZnE6JLR0XVYjvSUFGs +plvgdpXbohA3J9T8Grd1M5O7D+SmrXHrZGj8oJW2DST6QmbphlkVBf0LrNK+sqSU +nKxX/pzNqA4Sh/lLJOQ7eON4or2u9JpiP5Zr++Wl99xWBel5iZC9s/8= +=mtFc +-----END PGP MESSAGE----- + + +--DELIMITER-- + +--BOUNDARY + +--BOUNDARY +Content-Type: multipart/encrypted; protocol="application/pgp-encrypted"; boundary="DELIMITER" + +--DELIMITER +Content-Type: application/pgp-encrypted + +Version: 1 + +--DELIMITER +Content-Type: application/octet-stream; name="encrypted.asc" +Content-Disposition: inline; filename="encrypted.asc" + +-----BEGIN PGP MESSAGE----- + +hQEMAwzOQ1qnzNo7AQf9EgAO1PAwK3tquVubNpsRpK6kfvjAVSDXNiUtuMN5G7KG +aqnVl5PmfdLdEbGLjcHyFMsZ8k2alSyG0lFWdXQUqfYE5TSo3en5Zqyc+kK/5pDI +GZ6V5E5I0JPVIeY5lSFIVvSBXCBncK7jdRAtN3WfDL50UQYJX8fAOGc6iiMKDEb8 +jKwJbS0qwjHDwaKKwseE/yuYO3YFUWsijsnxwUXhU0iq3Yv7JIhXKldHFPe+jCOy +v2OQ2064I9mCNi6LjQPcqyXVTESB5/6Sdl1L9/ETjep5Gzlhp8WJTZNIzWJhqmPe +6hebCCJowQ6CxiqVInh46fPfSGw/YuFGRlyWZCSVa9LA+wGb+KaR0oDwHjBsUkhh +VhdNS7kRtx3kec9KaJQHCDFt0aUaMgnFdnNDS3AEQ+5PbplyKYT5PjA1TkhHGXmb +VQ07Xyab3zGPE5DUsUYt/c+bfN3EmaOc8JAZBOJzYw0nL9fSt5E1feo3Ntwse5S1 +yMMK7ALfv6W4/ItWf1KTDCo/A2QiAzZO9Gy8kFOx3nXYeh5BN2Efe5tmdtxgypQP ++b3TJbl98elyS6jiV4xB+gooVTrK3DIJbZi8xcHnBqtg3bSVML5pDJBM1MCcS3cP +eVgJ5JkE1qqiHuk4NFm0KIKMWyjgXUp8XJ7pOpHtu5COEyz3TwpOjmcYUMjQnyQs +/c9DD/oTZZq4y7VTFab9W0iBS0aadHzSR3TQdneIap7MOay79+fZQEqK8zel4qkN +ngaxDyBYA9wy3gsigbb5lBEqX9M8o7VLpz6Hn3CXqxpgaPvE+GFN+r5Os1/bcuSK +EfJTTtPuqx3MjVH9y+wW3fThb5xSoDNgb3Z93HVMGZzcKh9Kt47ZBhxMfb/4N7lE +Hh3qvh6KIJNnVlhm+JqqlVbAUEAg6bFH+CI1RtsCPnrmHjT6ysqeNKciAvVB +=VRca +-----END PGP MESSAGE----- + +--DELIMITER-- diff --git a/templateparser/autotests/data/404698-gpg-html.mbox.html.reply b/templateparser/autotests/data/404698-gpg-html.mbox.html.reply new file mode 100644 --- /dev/null +++ b/templateparser/autotests/data/404698-gpg-html.mbox.html.reply @@ -0,0 +1 @@ +Please reply to this message
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
diff --git a/templateparser/autotests/data/404698-gpg-html.mbox.plain.reply b/templateparser/autotests/data/404698-gpg-html.mbox.plain.reply new file mode 100644 --- /dev/null +++ b/templateparser/autotests/data/404698-gpg-html.mbox.plain.reply @@ -0,0 +1,51 @@ +Please reply to this message +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. diff --git a/templateparser/autotests/data/404698-gpg-inline.mbox b/templateparser/autotests/data/404698-gpg-inline.mbox new file mode 100644 --- /dev/null +++ b/templateparser/autotests/data/404698-gpg-inline.mbox @@ -0,0 +1,51 @@ +Subject: Testcase 'reply-decrytion-oracle' (PGP INLINE) +To: brucewayne45@web.de +From: brucewayne45@web.de +MIME-Version: 1.0 +Content-Type: text/plain + +Please reply to this message +. +. +. + +-----BEGIN PGP MESSAGE----- + +hQEMAwzOQ1qnzNo7AQf7BxmM0vO8nG37hKqoqOHb35JqprJM+sqF7JFmrsuWe6V2 +PAyyE2wdtq+AhvXjVnggxYLwU+DEFpBTmWr1rsanyV8hWXRbecfN/9gN/4/N9y7Z +XSx2OeE/uA5z8Kz5vrv/ywMqcVHjB5MQPTcLC2Zlg8MVltpriy6mdAkON4I3t7kl +j9uwQRY7HeKvsib63HWnYAOV/fYPXXor/lioeYIll08uuCiTh3Z9fEhXQI/az5Ft +e/xa70xGqviux+OvhoNUSZspzl7vK7e/NTBlC+LF1zVXUXT8prrd+ZFNwKvtn0Hl +W4KfNqTM9TJB8vpE5FWnH6+B365ZvxZopZ5F/9szp9JGAUCNdX5WujBreg7nTLui +UrnDNwOvjvsE/gsoO3n3jARK+Tu8PfUl8V1bHiCeGJz/mkA9uGJ/IApcT4rYsoHB +nVQjW1NJ6A== +=zrF/ +-----END PGP MESSAGE----- + +-----BEGIN PGP MESSAGE----- + +hQEMAwzOQ1qnzNo7AQf+MCqjMjAB80hAMAHfa7bdk/6L4DJQBQn+zHRv6oYzzYFC +8l79DDIE2uorQNFj1ZBw5+pi7+/2QmAANnG2ug5W0HRphg2WPXTUswy5H+mg08PM +MXRsP9lX5pAXEbLZVp61tvOQHnO/ltBhHHBwRaIq2tiirUUhy5erqLwlkSyN8xHM +Bh0u/dIJw7ewMk0l3BtF/GuP7l6PtUxT7P0Vwit4h1FV1bc9mSFmBNN16dvixJ4l +jK0mYEqT97SNZpg0MPOxx8E3xuJptzea4qmACv5zx4gYHlZRM0ZlKNqffmRauWOe +pDCjZv2F1IUJOg28NzZhKCBVhmhBmP1VmLNYFKGAsNJHAV+3uN2YYWzbhoOJAE0N +UxLI0EQN4y7OkAnGiRH45HygLxAjTk6dPiP5OD9OhUnSqofAjajlmqzfAAVMxY1a +epnRKPsnCZU= +=dqBN +-----END PGP MESSAGE----- + +-----BEGIN PGP MESSAGE----- + +hQEMAwzOQ1qnzNo7AQf+MNDSEBVsF78knI+uirDbLSLrHicrXExTocmXr2DZOggI +zMYCAHyg7ohINA40/8ZuR0bC9h6qCZjjhR+VFe2edRFshXlbuzykjpXNYcSv61Sm +9TAVpgAExzS5VhAxYIJ6+zWJR8+hgv63oREZPWlJ23utBDAMkEeY7cga3wn1HZMZ +g4XQZ94a8s9s/I+s3dLOdHGdxw+hmSnxjMhI6TMcZV/Kvr1MkkW10N0h0+hiuq2O +4owEztpm4See8fCkRfhr0TO+a8ElCtIXjVwqeB0tQh0fU3QaaNiDXYawoFMQXG8N +nwCP92glfOeAvJn9KuLwO3ee+WKwcrJhsFRMmjziDdJGAUvptVDNrk2P/0fzo/Xl +ypmw8zhir6ch+4C2+5yFCtVSmC+3Y7+NQ4YE4AR/z5rGvA1lxclulU1DSGkhFTbJ +XEVyg8o23A== +=Bs3d +-----END PGP MESSAGE----- + +whoo three encrypted parts inside. diff --git a/templateparser/autotests/data/404698-gpg-inline.mbox.html.reply b/templateparser/autotests/data/404698-gpg-inline.mbox.html.reply new file mode 100644 --- /dev/null +++ b/templateparser/autotests/data/404698-gpg-inline.mbox.html.reply @@ -0,0 +1 @@ +Please reply to this message
.
.
.

diff --git a/templateparser/autotests/data/404698-gpg-inline.mbox.plain.reply b/templateparser/autotests/data/404698-gpg-inline.mbox.plain.reply new file mode 100644 --- /dev/null +++ b/templateparser/autotests/data/404698-gpg-inline.mbox.plain.reply @@ -0,0 +1,5 @@ +Please reply to this message +. +. +. + diff --git a/templateparser/autotests/data/404698-gpg.mbox b/templateparser/autotests/data/404698-gpg.mbox new file mode 100644 --- /dev/null +++ b/templateparser/autotests/data/404698-gpg.mbox @@ -0,0 +1,120 @@ +Subject: Testcase 'reply-mix-crlf' (PGP/MIME) +To: brucewayne45@web.de +From: brucewayne45@web.de +MIME-Version: 1.0 +Content-Type: multipart/mixed; boundary="BOUNDARY" + +--BOUNDARY +Content-Type: text/plain + +Please reply to this message +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. + +--BOUNDARY +Content-Type: multipart/encrypted; protocol="application/pgp-encrypted"; boundary="DELIMITER" + +--DELIMITER +Content-Type: application/pgp-encrypted + +Version: 1 + +--DELIMITER +Content-Type: application/octet-stream; name="encrypted.asc" +Content-Disposition: inline; filename="encrypted.asc" + +-----BEGIN PGP MESSAGE----- +Version: GnuPG v1 + +hIwDGJlthTT7oq0BA/9NtLLXbiIJVS6pOynwEeSznrQK7kYVla8RM43//JECCkGJ +azEaSBznabBv6epaFmQtVHLMXlCbZnMmW9loyqPBfMoAms6kKKBdG/jqhus89iXE ++seXngC233Va/gZMb2DxOqIokVNfj9tpR7xQ8wS/jHTDiLNc1GOQC7ku42z2bNLA +IQFRD/qbBFz89hU4wP4cYoAysOnEDojFrsrnCidTHJOJrndM6PPUtH/jQCyfr/EG +2tSpJwYKvmT6ly3yqaGLBtRPIxiv+dMe+7yw0t40qbjvvaTGavErEBJEKX5eWbTN +/sjajHpUHqs6SIiMheH9dr+WfzFONtVbPEgGRmOERhlgTl/nLo86AZpjJroIGKJJ +tTHCcoQGAWG+N7wrCE1RxR0kkMs4nRozj0TLu6ZyXMs+H063MewTPNxNAiQT1Nbi +udKWmfLBlxn06p+JDzUKxj8PFwObdbxTvACzbAvBY1aHMQ== +=mLl3 +-----END PGP MESSAGE----- + + +--DELIMITER-- + +--BOUNDARY + +--BOUNDARY +Content-Type: multipart/encrypted; protocol="application/pgp-encrypted"; boundary="DELIMITER" + +--DELIMITER +Content-Type: application/pgp-encrypted + +Version: 1 + +--DELIMITER +Content-Type: application/octet-stream; name="encrypted.asc" +Content-Disposition: inline; filename="encrypted.asc" + +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2.0.15 (GNU/Linux) + +hQEMAwzOQ1qnzNo7AQgAtWfDWWI2JUGuptpackiIxpWViEEpGAeruETubiIPwxNb +DNmXrMDhbm/zIbPntIGWJDgUMfABZCUgmlJLWhsceDTt+tXnWGha2VYrN2/WsF6/ +Pqs/TavTvMIJQHDaIH5yDDCaMoq/mGSbcu7go2H8Sw7aBEYlM8jGlqc1HziXnZ1q +3vDiA+4qWfvbNoSRo1kb9Pcq997yg6WqZXH2hJ7cp+hIQ4uTP1/+qgYHMvfPlzQk +XcDguGbIer88ELhuR5622unGBAB4dqp+5w6n9c6rrCH81qhV4W0nqSEvj1tBj78S +ZTi6VBAo5eS0e3iOJqMpwUZz6hQUpJw2wnNRGvLgI9KZAag0HkgPdMeANowg7vpE +L4nU7B0ybhswA2Y7QT/wwCDZu9N1JGeBmy0dgy4sA38Ki27rn2/lIaP0j14JycwM +RTJ1uwI+ZuQiwXlyYtdFZJWe8nraWARch0oKqhaR7aSsxGWo63eiGEQhkQCBFBb3 +Vg0nNCZRBauEqIESEW5EV2zrJqdfNYcz+f9IP125dnQEKgLZ6FxTt3+v +=mhNl +-----END PGP MESSAGE----- + +--DELIMITER-- diff --git a/templateparser/autotests/data/404698-gpg.mbox.html.reply b/templateparser/autotests/data/404698-gpg.mbox.html.reply new file mode 100644 --- /dev/null +++ b/templateparser/autotests/data/404698-gpg.mbox.html.reply @@ -0,0 +1 @@ +Please reply to this message
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
diff --git a/templateparser/autotests/data/404698-gpg.mbox.plain.reply b/templateparser/autotests/data/404698-gpg.mbox.plain.reply new file mode 100644 --- /dev/null +++ b/templateparser/autotests/data/404698-gpg.mbox.plain.reply @@ -0,0 +1,51 @@ +Please reply to this message +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. diff --git a/templateparser/autotests/data/404698-smime.mbox b/templateparser/autotests/data/404698-smime.mbox new file mode 100644 --- /dev/null +++ b/templateparser/autotests/data/404698-smime.mbox @@ -0,0 +1,88 @@ +Subject: Testcase 'reply-mix-crlf' (S/MIME) +To: brucewayne45@web.de +From: brucewayne45@web.de +MIME-Version: 1.0 +Content-Type: multipart/mixed; boundary="BOUNDARY" + +--BOUNDARY +Content-Type: text/plain + +Please reply to this message +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. + +--BOUNDARY +Content-Type: application/pkcs7-mime; name="smime.p7m"; smime-type=enveloped-data +Content-Transfer-Encoding: base64 + +MIAGCSqGSIb3DQEHA6CAMIACAQAxgfwwgfkCAQAwYjBVMQswCQYDVQQGEwJVUzENMAsGA1UECgwE +S0RBQjEWMBQGA1UEAwwNdW5pdHRlc3QgY2VydDEfMB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxl +LmNvbQIJANNFIDoYY4XJMA0GCSqGSIb3DQEBAQUABIGAJwmmaOeidXUHSQGOf2OBIsPYafVqdORe +y54pEXbXiAfSVUWgI4a9CsiWwcDX8vlaX9ZLLr+L2VmOfr6Yc5214yxzausZVvnUFjy6LUXotuEX +tSar4EW7XI9DjaZc1l985naMsTx9JUa5GyQ9J6PGqhosAKpKMGgKkFAHaOwE1/IwgAYJKoZIhvcN +AQcBMBQGCCqGSIb3DQMHBAieDfmz3WGbN6CABHgEpsLrNn0PAZTDUfNomDypvSCl5bQH+9cKm80m +upMV2r8RBiXS7OaP4SpCxq18afDTTPatvboHIoEX92taTbq8soiAgEs6raSGtEYZNvFL0IYqm7MA +o5HCOmjiEcInyPf14lL3HnPk10FaP3hh58qTHUh4LPYtL7UECOZELYnUfUVhAAAAAAAAAAAAAA== + +--BOUNDARY +Content-Type: application/pkcs7-mime; name="smime.p7m"; smime-type=enveloped-data +Content-Transfer-Encoding: base64 + +MIAGCSqGSIb3DQEHA6CAMIACAQAxgfwwgfkCAQAwYjBVMQswCQYDVQQGEwJVUzENMAsGA1UECgwE +S0RBQjEWMBQGA1UEAwwNdW5pdHRlc3QgY2VydDEfMB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxl +LmNvbQIJANNFIDoYY4XJMA0GCSqGSIb3DQEBAQUABIGAJwmmaOeidXUHSQGOf2OBIsPYafVqdORe +y54pEXbXiAfSVUWgI4a9CsiWwcDX8vlaX9ZLLr+L2VmOfr6Yc5214yxzausZVvnUFjy6LUXotuEX +tSar4EW7XI9DjaZc1l985naMsTx9JUa5GyQ9J6PGqhosAKpKMGgKkFAHaOwE1/IwgAYJKoZIhvcN +AQcBMBQGCCqGSIb3DQMHBAieDfmz3WGbN6CABHgEpsLrNn0PAZTDUfNomDypvSCl5bQH+9cKm80m +upMV2r8RBiXS7OaP4SpCxq18afDTTPatvboHIoEX92taTbq8soiAgEs6raSGtEYZNvFL0IYqm7MA +o5HCOmjiEcInyPf14lL3HnPk10FaP3hh58qTHUh4LPYtL7UECOZELYnUfUVhAAAAAAAAAAAAAA== + +--BOUNDARY-- diff --git a/templateparser/autotests/data/404698-smime.mbox.html.reply b/templateparser/autotests/data/404698-smime.mbox.html.reply new file mode 100644 --- /dev/null +++ b/templateparser/autotests/data/404698-smime.mbox.html.reply @@ -0,0 +1 @@ +Please reply to this message
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
diff --git a/templateparser/autotests/data/404698-smime.mbox.plain.reply b/templateparser/autotests/data/404698-smime.mbox.plain.reply new file mode 100644 --- /dev/null +++ b/templateparser/autotests/data/404698-smime.mbox.plain.reply @@ -0,0 +1,51 @@ +Please reply to this message +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. diff --git a/templateparser/autotests/data/html-attachment1.mbox.html.reply b/templateparser/autotests/data/html-attachment1.mbox.html.reply new file mode 100644 --- /dev/null +++ b/templateparser/autotests/data/html-attachment1.mbox.html.reply @@ -0,0 +1 @@ +

A Body Text

diff --git a/templateparser/autotests/data/html-attachment2.mbox.html.reply b/templateparser/autotests/data/html-attachment2.mbox.html.reply new file mode 100644 --- /dev/null +++ b/templateparser/autotests/data/html-attachment2.mbox.html.reply @@ -0,0 +1 @@ +HTML Text diff --git a/templateparser/autotests/data/openpgp-encrypted.mbox b/templateparser/autotests/data/openpgp-encrypted.mbox new file mode 100644 --- /dev/null +++ b/templateparser/autotests/data/openpgp-encrypted.mbox @@ -0,0 +1,35 @@ +From test@kolab.org Wed, 08 Sep 2010 17:02:52 +0200 +From: OpenPGP Test +To: test@kolab.org +Subject: OpenPGP encrypted +Date: Wed, 08 Sep 2010 17:02:52 +0200 +User-Agent: KMail/4.6 pre (Linux/2.6.34-rc2-2-default; KDE/4.5.60; x86_64; ; ) +MIME-Version: 1.0 +Content-Type: multipart/encrypted; boundary="nextPart1357031.ppLHckZtsp"; protocol="application/pgp-encrypted" +Content-Transfer-Encoding: 7Bit + + +--nextPart1357031.ppLHckZtsp +Content-Type: application/pgp-encrypted +Content-Disposition: attachment + +Version: 1 +--nextPart1357031.ppLHckZtsp +Content-Type: application/octet-stream +Content-Disposition: inline; filename="msg.asc" + +-----BEGIN PGP MESSAGE----- + +hQEMAwzOQ1qnzNo7AQf/dJ5Pn6aE02/ImggNDDJBfvRU7vWF3OeKaGNrZd9sWp3Q +x8Tas0r+Yfaoo5cNqEJ7LXaRA9UGJ3BtDEtzLl/xrY++QyewrRtLlfSLXFSifZOA +9eBYmL4cj4Fbp4HR8iUBC2p64FzARQBe4hCyEoIIQPK7+3XqgsFdCIqmnEt1+Nys +mKXN4VSukAcTzjR8JasPKZ+Qayx9+DBu7wJJNzjlhnrIv4AMYOTetLwL7f5/c2j+ +zX/2/9ptWwcBDxMl6WKTpPF4Zf57MgeV3TI4O5FHXfhjldUh6JiSt3i+t4ev9F8A +s1pYZ15qDRwNwshZ7fujJvd1lk7ZDZdAQyKXgHNo0NKOATJ6IN0S5yvFi9FhyHM6 +sGzHXVqBgJspKqOuuoSPuX0RBvAskNPa4yERla0725n/F9AHsbiw4olQvIbKD70+ +gPd1k+MR6OfsGb+m5IIMBSjaKDLtgO9H0JLIq2U7Qf3YU+VsvvPH+PhTnUuz5/Ea +0W1dTWWU0MRh0Z8uKM9KJHjMjkNzBvO4T8uTfRwBPA== +=G9lS +-----END PGP MESSAGE----- + +--nextPart1357031.ppLHckZtsp-- diff --git a/templateparser/autotests/data/openpgp-encrypted.mbox.html.reply b/templateparser/autotests/data/openpgp-encrypted.mbox.html.reply new file mode 100644 --- /dev/null +++ b/templateparser/autotests/data/openpgp-encrypted.mbox.html.reply @@ -0,0 +1 @@ +encrypted text
diff --git a/templateparser/autotests/data/openpgp-encrypted.mbox.plain.reply b/templateparser/autotests/data/openpgp-encrypted.mbox.plain.reply new file mode 100644 --- /dev/null +++ b/templateparser/autotests/data/openpgp-encrypted.mbox.plain.reply @@ -0,0 +1 @@ +encrypted text diff --git a/templateparser/autotests/data/openpgp-inline-space.mbox b/templateparser/autotests/data/openpgp-inline-space.mbox new file mode 100644 --- /dev/null +++ b/templateparser/autotests/data/openpgp-inline-space.mbox @@ -0,0 +1,31 @@ +Subject: Testcase 'reply-decrytion-oracle' (PGP INLINE) +To: brucewayne45@web.de +From: brucewayne45@web.de +MIME-Version: 1.0 +Content-Type: text/plain + + + + + + + + + + + + +-----BEGIN PGP MESSAGE----- + +hQEMAwzOQ1qnzNo7AQf7BxmM0vO8nG37hKqoqOHb35JqprJM+sqF7JFmrsuWe6V2 +PAyyE2wdtq+AhvXjVnggxYLwU+DEFpBTmWr1rsanyV8hWXRbecfN/9gN/4/N9y7Z +XSx2OeE/uA5z8Kz5vrv/ywMqcVHjB5MQPTcLC2Zlg8MVltpriy6mdAkON4I3t7kl +j9uwQRY7HeKvsib63HWnYAOV/fYPXXor/lioeYIll08uuCiTh3Z9fEhXQI/az5Ft +e/xa70xGqviux+OvhoNUSZspzl7vK7e/NTBlC+LF1zVXUXT8prrd+ZFNwKvtn0Hl +W4KfNqTM9TJB8vpE5FWnH6+B365ZvxZopZ5F/9szp9JGAUCNdX5WujBreg7nTLui +UrnDNwOvjvsE/gsoO3n3jARK+Tu8PfUl8V1bHiCeGJz/mkA9uGJ/IApcT4rYsoHB +nVQjW1NJ6A== +=zrF/ +-----END PGP MESSAGE----- + +whoo three encrypted parts inside. diff --git a/templateparser/autotests/data/openpgp-inline-space.mbox.html.reply b/templateparser/autotests/data/openpgp-inline-space.mbox.html.reply new file mode 100644 --- /dev/null +++ b/templateparser/autotests/data/openpgp-inline-space.mbox.html.reply @@ -0,0 +1 @@ +first part
diff --git a/templateparser/autotests/data/openpgp-inline-space.mbox.plain.reply b/templateparser/autotests/data/openpgp-inline-space.mbox.plain.reply new file mode 100644 --- /dev/null +++ b/templateparser/autotests/data/openpgp-inline-space.mbox.plain.reply @@ -0,0 +1 @@ +first part diff --git a/templateparser/autotests/templateparserjobtest.h b/templateparser/autotests/templateparserjobtest.h --- a/templateparser/autotests/templateparserjobtest.h +++ b/templateparser/autotests/templateparserjobtest.h @@ -36,6 +36,9 @@ void test_convertedHtml(); void test_convertedHtml_data(); + void test_replyHtml(); + void test_replyHtml_data(); + void test_replyPlain(); void test_replyPlain_data(); diff --git a/templateparser/autotests/templateparserjobtest.cpp b/templateparser/autotests/templateparserjobtest.cpp --- a/templateparser/autotests/templateparserjobtest.cpp +++ b/templateparser/autotests/templateparserjobtest.cpp @@ -103,6 +103,66 @@ QCOMPARE(convertedHtmlContent, referenceData); } +void TemplateParserJobTest::test_replyHtml_data() +{ + QTest::addColumn("mailFileName"); + QTest::addColumn("referenceFileName"); + + QDir dir(QStringLiteral(MAIL_DATA_DIR)); + const auto l = dir.entryList(QStringList(QStringLiteral("*.mbox")), QDir::Files | QDir::Readable | QDir::NoSymLinks); + foreach (const QString &file, l) { + const QString expectedFile = dir.path() + QLatin1Char('/') + file + QStringLiteral(".html.reply"); + if (!QFile::exists(expectedFile)) { + continue; + } + QTest::newRow(file.toLatin1().constData()) << QString(dir.path() + QLatin1Char('/') + file) << expectedFile; + } +} + +void TemplateParserJobTest::test_replyHtml() +{ + QFETCH(QString, mailFileName); + QFETCH(QString, referenceFileName); + + // load input mail + QFile mailFile(mailFileName); + QVERIFY(mailFile.open(QIODevice::ReadOnly)); + const QByteArray mailData = KMime::CRLFtoLF(mailFile.readAll()); + QVERIFY(!mailData.isEmpty()); + KMime::Message::Ptr msg(new KMime::Message); + KMime::Message::Ptr origMsg(new KMime::Message); + origMsg->setContent(mailData); + origMsg->parse(); + + // load expected result + QFile referenceFile(referenceFileName); + QVERIFY(referenceFile.open(QIODevice::ReadOnly)); + const QByteArray referenceRawData = KMime::CRLFtoLF(referenceFile.readAll()); + const QString referenceData = QString::fromLatin1(referenceRawData); + QVERIFY(!referenceData.isEmpty()); + + TemplateParser::TemplateParserJob *parser = new TemplateParser::TemplateParserJob(msg, TemplateParser::TemplateParserJob::NewMessage); + KIdentityManagement::IdentityManager *identMan = new KIdentityManagement::IdentityManager; + parser->setIdentityManager(identMan); + + parser->d->mOrigMsg = origMsg; + + QSignalSpy spy(parser, &TemplateParser::TemplateParserJob::parsingDone); + parser->processWithTemplate(QString()); + QVERIFY(spy.wait()); + + QString convertedHtmlContent = parser->htmlMessageText(false, TemplateParser::TemplateParserJob::NoSelectionAllowed); + QVERIFY(!convertedHtmlContent.isEmpty()); + + // referenceData is read from a file and most text editors add a \n at the end of the last line + if (!convertedHtmlContent.endsWith(QStringLiteral("\n"))) { + convertedHtmlContent += QStringLiteral("\n"); + } + + QCOMPARE(convertedHtmlContent, referenceData); +} + + void TemplateParserJobTest::test_replyPlain_data() { QTest::addColumn("mailFileName"); @@ -148,9 +208,9 @@ parser->processWithTemplate(QString()); QVERIFY(spy.wait()); - const QString convertedHtmlContent = parser->plainMessageText(false, TemplateParser::TemplateParserJob::NoSelectionAllowed); + const QString convertedPlainTextContent = parser->plainMessageText(false, TemplateParser::TemplateParserJob::NoSelectionAllowed); - QCOMPARE(convertedHtmlContent, referenceData); + QCOMPARE(convertedPlainTextContent, referenceData); } void TemplateParserJobTest::test_processWithTemplatesForBody_data() diff --git a/templateparser/src/templateparserjob.cpp b/templateparser/src/templateparserjob.cpp --- a/templateparser/src/templateparserjob.cpp +++ b/templateparser/src/templateparserjob.cpp @@ -29,6 +29,7 @@ #include #include +#include #include #include @@ -296,29 +297,59 @@ process(aorig_msg, afolder); } +MimeTreeParser::MessagePart::Ptr toplevelTextNode(MimeTreeParser::MessagePart::Ptr messageTree) +{ + foreach (const auto &mp, messageTree->subParts()) { + auto text = mp.dynamicCast(); + const auto attach = mp.dynamicCast(); + if (text && !attach) { + // TextMessagePart can have several subparts cause of PGP inline, we search for the first part with content + foreach (const auto &sub, mp->subParts()) { + if (!sub->text().trimmed().isEmpty()) { + return sub; + } + } + return text; + } else if (const auto html = mp.dynamicCast()) { + return html; + } else if (const auto alternative = mp.dynamicCast()) { + return alternative; + } else { + auto ret = toplevelTextNode(mp); + if (ret) { + return ret; + } + } + } + return MimeTreeParser::MessagePart::Ptr(); +} + void TemplateParserJob::processWithTemplate(const QString &tmpl) { d->mOtp->parseObjectTree(d->mOrigMsg.data()); - TemplateParserExtractHtmlInfo *job = new TemplateParserExtractHtmlInfo(this); - connect(job, &TemplateParserExtractHtmlInfo::finished, this, &TemplateParserJob::slotExtractInfoDone); + const auto mp = toplevelTextNode(d->mOtp->parsedPart()); - QString plainText = d->mOtp->plainTextContent(); - if (plainText.isEmpty()) { //HTML-only mails - plainText = d->mOtp->htmlContent(); - } + QString plainText = mp->plaintextContent(); + QString htmlElement; - job->setHtmlForExtractingTextPlain(plainText); - job->setTemplate(tmpl); - - QString htmlElement = d->mOtp->htmlContent(); - - if (htmlElement.isEmpty()) { //plain mails only - QString htmlReplace = d->mOtp->plainTextContent().toHtmlEscaped(); + if (mp->isHtml()) { + htmlElement = d->mOtp->htmlContent(); + if (plainText.isEmpty()) { //HTML-only mails + plainText = htmlElement; + } + } else { //plain mails only + QString htmlReplace = plainText.toHtmlEscaped(); htmlReplace = htmlReplace.replace(QLatin1Char('\n'), QStringLiteral("
")); htmlElement = QStringLiteral("%1\n").arg(htmlReplace); } + TemplateParserExtractHtmlInfo *job = new TemplateParserExtractHtmlInfo(this); + connect(job, &TemplateParserExtractHtmlInfo::finished, this, &TemplateParserJob::slotExtractInfoDone); + + job->setHtmlForExtractingTextPlain(plainText); + job->setTemplate(tmpl); + job->setHtmlForExtractionHeaderAndBody(htmlElement); job->start(); } @@ -1483,7 +1514,8 @@ if (!d->mOrigMsg) { return QString(); } - QString result = d->mOtp->plainTextContent(); + const auto mp = toplevelTextNode(d->mOtp->parsedPart()); + QString result = mp->plaintextContent(); if (result.isEmpty()) { result = d->mExtractHtmlInfoResult.mPlainText; }