summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoralecpl <alec@alec.pl>2011-12-02 07:51:07 +0000
committeralecpl <alec@alec.pl>2011-12-02 07:51:07 +0000
commit4f8be46f38223c4e45ad966e977197e40e2eeb9a (patch)
treea9bcdd80129ed07049d5854f7a5439f080dbf3fb
parenta505dd2ebfa30174d9f02b5c8eef5e1f2339f229 (diff)
- Improved handling of some malformed values encoded with quoted-printable (#1488232)
-rw-r--r--CHANGELOG1
-rw-r--r--program/include/rcube_imap.php2
-rw-r--r--tests/maildecode.php46
3 files changed, 48 insertions, 1 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 78ac477c8..f476e94b8 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
CHANGELOG Roundcube Webmail
===========================
+- Improved handling of some malformed values encoded with quoted-printable (#1488232)
- Add possibility to do LDAP bind before searching for bind DN
- Fix handling of empty <U> tags in HTML messages (#1488225)
- Add content filter for embedded attachments to protect from XSS on IE (#1487895)
diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php
index 50656f28c..c4175cbed 100644
--- a/program/include/rcube_imap.php
+++ b/program/include/rcube_imap.php
@@ -4164,7 +4164,7 @@ class rcube_imap
$input = preg_replace("/\?=\s+=\?/", '?==?', $input);
// encoded-word regexp
- $re = '/=\?([^?]+)\?([BbQq])\?([^?\n]*)\?=/';
+ $re = '/=\?([^?]+)\?([BbQq])\?([^\n]*?)\?=/';
// Find all RFC2047's encoded words
if (preg_match_all($re, $input, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) {
diff --git a/tests/maildecode.php b/tests/maildecode.php
index 7d67352c3..664161cce 100644
--- a/tests/maildecode.php
+++ b/tests/maildecode.php
@@ -84,4 +84,50 @@ class rcube_test_maildecode extends UnitTestCase
}
}
+ /**
+ * Test decoding of header values
+ * Uses rcube_imap::decode_mime_string()
+ */
+ function test_header_decode_qp()
+ {
+ $test = array(
+ // #1488232: invalid character "?"
+ 'quoted-printable (1)' => array(
+ 'in' => '=?utf-8?Q?Certifica=C3=A7=C3=A3??=',
+ 'out' => 'Certifica=C3=A7=C3=A3?',
+ ),
+ 'quoted-printable (2)' => array(
+ 'in' => '=?utf-8?Q?Certifica=?= =?utf-8?Q?C3=A7=C3=A3?=',
+ 'out' => 'Certifica=C3=A7=C3=A3',
+ ),
+ 'quoted-printable (3)' => array(
+ 'in' => '=?utf-8?Q??= =?utf-8?Q??=',
+ 'out' => '',
+ ),
+ 'quoted-printable (4)' => array(
+ 'in' => '=?utf-8?Q??= a =?utf-8?Q??=',
+ 'out' => ' a ',
+ ),
+ 'quoted-printable (5)' => array(
+ 'in' => '=?utf-8?Q?a?= =?utf-8?Q?b?=',
+ 'out' => 'ab',
+ ),
+ 'quoted-printable (6)' => array(
+ 'in' => '=?utf-8?Q? ?= =?utf-8?Q?a?=',
+ 'out' => ' a',
+ ),
+ 'quoted-printable (7)' => array(
+ 'in' => '=?utf-8?Q?___?= =?utf-8?Q?a?=',
+ 'out' => ' a',
+ ),
+ );
+
+ foreach ($test as $idx => $item) {
+ $res = $this->app->imap->decode_mime_string($item['in'], 'UTF-8');
+ $res = quoted_printable_encode($res);
+
+ $this->assertEqual($item['out'], $res, "Header decoding for: " . $idx);
+ }
+
+ }
}