From 31ff211cdce0541eb230eb0e5a2472bb4185269a Mon Sep 17 00:00:00 2001 From: catch Date: Tue, 1 Sep 2020 20:24:53 +0100 Subject: [PATCH] Issue #2822334 by jungle, mbovan, longwave, Kristen Pol, quietone: Unicode::mimeHeaderDecode() doesn't support lowercased encoding (cherry picked from commit 1c7065df88e49b8b9ae5f3baf974dde0776e659d) --- core/lib/Drupal/Component/Utility/Unicode.php | 6 +-- .../Tests/Component/Utility/UnicodeTest.php | 52 ++++++++++++++++--- 2 files changed, 48 insertions(+), 10 deletions(-) diff --git a/core/lib/Drupal/Component/Utility/Unicode.php b/core/lib/Drupal/Component/Utility/Unicode.php index 3729c7d9ee..a33250f935 100644 --- a/core/lib/Drupal/Component/Utility/Unicode.php +++ b/core/lib/Drupal/Component/Utility/Unicode.php @@ -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); } /** diff --git a/core/tests/Drupal/Tests/Component/Utility/UnicodeTest.php b/core/tests/Drupal/Tests/Component/Utility/UnicodeTest.php index 8951ebf56f..ba29fc4df7 100644 --- a/core/tests/Drupal/Tests/Component/Utility/UnicodeTest.php +++ b/core/tests/Drupal/Tests/Component/Utility/UnicodeTest.php @@ -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', + ], ]; } -- GitLab