From 9cf5454ce4517426b6b612562caf118721fe5390 Mon Sep 17 00:00:00 2001 From: Michael J Rubinsky Date: Mon, 5 Sep 2016 16:44:59 -0400 Subject: [PATCH] Bug: 14456 Ensure address-type headers are MIME decoded. This got lost during the refactoring to the individual Horde_Mime_Header* objects. Fixes incorrect parsing of email address lists when source headers are MIME encoded. --- .../Mime/lib/Horde/Mime/Headers/Addresses.php | 18 ++++++++++ .../Mime/test/Horde/Mime/HeadersTest.php | 36 +++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/framework/Mime/lib/Horde/Mime/Headers/Addresses.php b/framework/Mime/lib/Horde/Mime/Headers/Addresses.php index 929c8683c1b..2cbf1842b5c 100644 --- a/framework/Mime/lib/Horde/Mime/Headers/Addresses.php +++ b/framework/Mime/lib/Horde/Mime/Headers/Addresses.php @@ -64,6 +64,14 @@ public function getAddressList($first = false) : array($this->_values); } + protected function _decodeMime($value) + { + if (is_object($value)) { + return $value; + } + return Horde_Mime::decode($value); + } + /** * * @throws Horde_Mime_Exception @@ -73,6 +81,16 @@ protected function _setValue($value) /* @todo Implement with traits */ $rfc822 = new Horde_Mail_Rfc822(); + // Ensure values are MIME decoded. + // @see Bug 14456 + if (is_array($value)) { + foreach ($value as &$adr) { + $adr = $this->_decodeMime($adr); + } + } else { + $value = $this->_decodeMime($value); + } + try { $addr_list = $rfc822->parseAddressList($value); } catch (Horde_Mail_Exception $e) { diff --git a/framework/Mime/test/Horde/Mime/HeadersTest.php b/framework/Mime/test/Horde/Mime/HeadersTest.php index 82b93b3b67d..77ae0a7e390 100644 --- a/framework/Mime/test/Horde/Mime/HeadersTest.php +++ b/framework/Mime/test/Horde/Mime/HeadersTest.php @@ -109,6 +109,42 @@ public function serializeProvider() ); } + /** + * @dataProvider mimeEncodedAddressProvider + */ + public function testBug14456($header, $value, $decoded) + { + $hdrs = new Horde_Mime_Headers(); + $hdrs->addHeader($header, $value); + $this->assertEquals($decoded, $hdrs->getValue($header)); + } + + public function mimeEncodedAddressProvider() + { + return array( + array( + 'To', + '=?utf-8?Q?"Mike,_H=C3=A5vard"?= ', + '"Mike, Håvard" ' + ), + array( + 'To', + '=?utf-8?Q?"Steve,_H=C3=A5vard"?= , =?utf-8?Q?"Bob,_H=C3=A5vard"?= ', + '"Steve, Håvard" , "Bob, Håvard" ' + ), + array( + 'To', + 'sheldon@example.com', + 'sheldon@example.com' + ), + array( + 'From', + '=?utf-8?Q?"Mike,_H=C3=A5vard"?= ', + '"Mike, Håvard" ' + ) + ); + } + /** * @dataProvider normalHeaderDecodeProvider */