Verified Commit 7f3f6dee authored by Lee Rowlands's avatar Lee Rowlands
Browse files

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

Issue #2822334 by jungle, mbovan, longwave, Kristen Pol, quietone, catch: Unicode::mimeHeaderDecode() doesn't support lowercased encoding
parent c3e6adec
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -537,16 +537,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);
  }

  /**
+45 −7
Original line number Diff line number Diff line
@@ -23,15 +23,13 @@ public function testSetStatus() {
  }

  /**
   * 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));
  }

  /**
@@ -44,9 +42,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',
      ],
    ];
  }