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()