Fix parsing of square bracket characters in IMAP response strings (#1489223)
Conflicts:
program/lib/Roundcube/rcube_imap_generic.php
| | |
| | | CHANGELOG Roundcube Webmail |
| | | =========================== |
| | | |
| | | - Fix parsing of square bracket characters in IMAP response strings (#1489223) |
| | | - Don't clear References and in-Reply-To when a message is "edited as new" (#1489216) |
| | | - Fix messages list sorting with THREAD=REFS |
| | | - Remove deprecated (in PHP 5.5) PREG /e modifier usage (#1489174) |
| | |
| | | else if ($name == 'RFC822') { |
| | | $result[$id]->body = $value; |
| | | } |
| | | else if ($name == 'BODY') { |
| | | $body = $this->tokenizeResponse($line, 1); |
| | | if ($value[0] == 'HEADER.FIELDS') |
| | | $headers = $body; |
| | | else if (!empty($value)) |
| | | $result[$id]->bodypart[$value[0]] = $body; |
| | | else if (stripos($name, 'BODY[') === 0) { |
| | | $name = str_replace(']', '', substr($name, 5)); |
| | | |
| | | if ($name == 'HEADER.FIELDS') { |
| | | // skip ']' after headers list |
| | | $this->tokenizeResponse($line, 1); |
| | | $headers = $this->tokenizeResponse($line, 1); |
| | | } |
| | | else if (strlen($name)) |
| | | $result[$id]->bodypart[$name] = $value; |
| | | else |
| | | $result[$id]->body = $body; |
| | | $result[$id]->body = $value; |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | // Parenthesized list |
| | | case '(': |
| | | case '[': |
| | | $str = substr($str, 1); |
| | | $result[] = self::tokenizeResponse($str); |
| | | break; |
| | | case ')': |
| | | case ']': |
| | | $str = substr($str, 1); |
| | | return $result; |
| | | break; |
| | | |
| | | // String atom, number, NIL, *, % |
| | | // String atom, number, astring, NIL, *, % |
| | | default: |
| | | // empty string |
| | | if ($str === '' || $str === null) { |
| | | break 2; |
| | | } |
| | | |
| | | // excluded chars: SP, CTL, ), [, ] |
| | | if (preg_match('/^([^\x00-\x20\x29\x5B\x5D\x7F]+)/', $str, $m)) { |
| | | // excluded chars: SP, CTL, ), DEL |
| | | // we do not exclude [ and ] (#1489223) |
| | | if (preg_match('/^([^\x00-\x20\x29\x7F]+)/', $str, $m)) { |
| | | $result[] = $m[1] == 'NIL' ? NULL : $m[1]; |
| | | $str = substr($str, strlen($m[1])); |
| | | } |
| | |
| | | $this->assertSame(array(1, 2, 3), $result); |
| | | $this->assertCount(3, $result); |
| | | } |
| | | |
| | | /** |
| | | * Test for tokenizeResponse |
| | | */ |
| | | function test_tokenizeResponse() |
| | | { |
| | | $response = "test brack[et] {1}\r\na {0}\r\n (item1 item2)"; |
| | | |
| | | $result = rcube_imap_generic::tokenizeResponse($response, 1); |
| | | $this->assertSame("test", $result); |
| | | |
| | | $result = rcube_imap_generic::tokenizeResponse($response, 1); |
| | | $this->assertSame("brack[et]", $result); |
| | | |
| | | $result = rcube_imap_generic::tokenizeResponse($response, 1); |
| | | $this->assertSame("a", $result); |
| | | |
| | | $result = rcube_imap_generic::tokenizeResponse($response, 1); |
| | | $this->assertSame("", $result); |
| | | |
| | | $result = rcube_imap_generic::tokenizeResponse($response, 1); |
| | | $this->assertSame(array('item1', 'item2'), $result); |
| | | } |
| | | } |