Unverified Commit 31ff211c authored by catch's avatar catch Committed by larowlan

Issue #2822334 by jungle, mbovan, longwave, Kristen Pol, quietone:...

Issue #2822334 by jungle, mbovan, longwave, Kristen Pol, quietone: Unicode::mimeHeaderDecode() doesn't support lowercased encoding

(cherry picked from commit 1c7065df)
parent 69ea8564
......@@ -426,16 +426,16 @@ public static function mimeHeaderEncode($string, $shorten = FALSE) {
*/
public static function mimeHeaderDecode($header) {
$callback = function ($matches) {
$data = ($matches[2] == 'B') ? base64_decode($matches[3]) : str_replace('_', ' ', quoted_printable_decode($matches[3]));
$data = (strtolower($matches[2]) == 'b') ? base64_decode($matches[3]) : str_replace('_', ' ', quoted_printable_decode($matches[3]));
if (strtolower($matches[1]) != 'utf-8') {
$data = static::convertToUtf8($data, $matches[1]);
}
return $data;
};
// First step: encoded chunks followed by other encoded chunks (need to collapse whitespace)
$header = preg_replace_callback('/=\?([^?]+)\?(Q|B)\?([^?]+|\?(?!=))\?=\s+(?==\?)/', $callback, $header);
$header = preg_replace_callback('/=\?([^?]+)\?([Qq]|[Bb])\?([^?]+|\?(?!=))\?=\s+(?==\?)/', $callback, $header);
// Second step: remaining chunks (do not collapse whitespace)
return preg_replace_callback('/=\?([^?]+)\?(Q|B)\?([^?]+|\?(?!=))\?=/', $callback, $header);
return preg_replace_callback('/=\?([^?]+)\?([Qq]|[Bb])\?([^?]+|\?(?!=))\?=/', $callback, $header);
}
/**
......
......@@ -15,15 +15,13 @@
class UnicodeTest extends TestCase {
/**
* Tests multibyte encoding and decoding.
* Tests multibyte encoding.
*
* @dataProvider providerTestMimeHeader
* @covers ::mimeHeaderEncode
* @covers ::mimeHeaderDecode
*/
public function testMimeHeader($value, $encoded) {
public function testMimeHeaderEncode($value, $encoded) {
$this->assertEquals($encoded, Unicode::mimeHeaderEncode($value));
$this->assertEquals($value, Unicode::mimeHeaderDecode($encoded));
}
/**
......@@ -36,9 +34,49 @@ public function testMimeHeader($value, $encoded) {
*/
public function providerTestMimeHeader() {
return [
['tést.txt', '=?UTF-8?B?dMOpc3QudHh0?='],
// Simple ASCII characters.
['ASCII', 'ASCII'],
"Base64 encoding" => ['tést.txt', '=?UTF-8?B?dMOpc3QudHh0?='],
"ASCII characters only" => ['test.txt', 'test.txt'],
];
}
/**
* Tests multibyte decoding.
*
* @dataProvider providerTestMimeHeaderDecode
* @covers ::mimeHeaderDecode
*/
public function testMimeHeaderDecode($value, $encoded) {
$this->assertEquals($value, Unicode::mimeHeaderDecode($encoded));
}
/**
* Data provider for testMimeHeaderDecode().
*
* @return array
* An array containing a string and its encoded value.
*/
public function providerTestMimeHeaderDecode() {
return [
'Uppercase base64 encoding' => [
'tést.txt',
'=?utf-8?B?dMOpc3QudHh0?=',
],
'Uppercase quoted-printable encoding' => [
'tést.txt',
'=?UTF-8?Q?t=C3=A9st.txt?=',
],
'Lowercase base64 encoding' => [
'tést.txt',
'=?utf-8?b?dMOpc3QudHh0?=',
],
'Lowercase quoted-printable encoding' => [
'tést.txt',
'=?UTF-8?q?t=C3=A9st.txt?=',
],
'ASCII characters only' => [
'test.txt',
'test.txt',
],
];
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment