diff --git a/framework/Imap_Client/lib/Horde/Imap/Client/Tokenize.php b/framework/Imap_Client/lib/Horde/Imap/Client/Tokenize.php index f83267ed369..d7454bfdb42 100644 --- a/framework/Imap_Client/lib/Horde/Imap/Client/Tokenize.php +++ b/framework/Imap_Client/lib/Horde/Imap/Client/Tokenize.php @@ -247,7 +247,7 @@ public function next() do { $check_len = true; - $in_quote = $text = false; + $in_quote = $text = $binary = false; while (($c = fgetc($stream)) !== false) { switch ($c) { @@ -291,10 +291,16 @@ public function next() case '~': // Ignore binary string identifier. PHP strings are - // binary-safe. - break; + // binary-safe. But keep it is not used as string + // identifier. + $binary = true; + $text .= $c; + continue; case '{': + if ($binary) { + $text = substr($text, 0, -1); + } $literal_len = intval($this->_stream->getToChar('}')); $pos = $this->_stream->pos(); if (isset($this->_literals[$pos])) { @@ -330,6 +336,7 @@ public function next() } break; } + $binary = false; } if ($check_len) { diff --git a/framework/Imap_Client/package.xml b/framework/Imap_Client/package.xml index 7a1efe158d9..b542d48311e 100644 --- a/framework/Imap_Client/package.xml +++ b/framework/Imap_Client/package.xml @@ -21,7 +21,7 @@ LGPL-2.1 -* +* [jan] Fix parsing IMAP responses with tilde characters. @@ -2958,7 +2958,7 @@ 2015-09-07 LGPL-2.1 -* +* [jan] Fix parsing IMAP responses with tilde characters. diff --git a/framework/Imap_Client/test/Horde/Imap/Client/TokenizeTest.php b/framework/Imap_Client/test/Horde/Imap/Client/TokenizeTest.php index 6ba9be31207..0289b1bbb64 100644 --- a/framework/Imap_Client/test/Horde/Imap/Client/TokenizeTest.php +++ b/framework/Imap_Client/test/Horde/Imap/Client/TokenizeTest.php @@ -464,6 +464,30 @@ public function testLiteralLength() 100, $len['length'] ); + + // Test non-binary-marker tilde. + $test = '* LIST () "" ~foo'; + $token = new Horde_Imap_Client_Tokenize($test); + $token->rewind(); + + $this->assertEquals( + '*', + $token->next() + ); + $this->assertEquals( + 'LIST', + $token->next() + ); + $this->assertTrue($token->next()); + $this->assertFalse($token->next()); + $this->assertEquals( + '', + $token->next() + ); + $this->assertEquals( + '~foo', + $token->next() + ); } public function testLiteralStream()