Aleksander Machniak
2013-07-04 88e49b37f71f1a69e88952e8938cb5c6cb19630f
Fix parsing of square bracket characters in IMAP response strings (#1489223)

Conflicts:

program/lib/Roundcube/rcube_imap_generic.php
3 files modified
51 ■■■■ changed files
CHANGELOG 1 ●●●● patch | view | raw | blame | history
program/lib/Roundcube/rcube_imap_generic.php 27 ●●●●● patch | view | raw | blame | history
tests/Framework/ImapGeneric.php 23 ●●●●● patch | view | raw | blame | history
CHANGELOG
@@ -1,6 +1,7 @@
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)
program/lib/Roundcube/rcube_imap_generic.php
@@ -2130,14 +2130,18 @@
                    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;
                    }
                }
@@ -3477,25 +3481,24 @@
            // 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]));
                }
tests/Framework/ImapGeneric.php
@@ -35,4 +35,27 @@
        $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);
    }
}