diff --git a/core/lib/Drupal/Component/Utility/Unicode.php b/core/lib/Drupal/Component/Utility/Unicode.php index 3729c7d9ee948e8240081493346ab33db5d4a40c..a33250f9351495e298f755d38ee3c2a3d65d67af 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 8951ebf56f67f1fe8cde94a5a1afb75aa74f7ca4..ba29fc4df75e2f872bd5e1683cd786bf6702d89f 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', + ], ]; }