alecpl
2010-10-05 393ba7186f10faece2d77d7a2e1d0802c60c3e39
- Fix handling of backslash as IMAP delimiter


2 files modified
77 ■■■■ changed files
CHANGELOG 1 ●●●● patch | view | raw | blame | history
program/include/rcube_imap_generic.php 76 ●●●●● patch | view | raw | blame | history
CHANGELOG
@@ -21,6 +21,7 @@
- Add Mail-Followup-To/Mail-Reply-To support (#1485547)
- Fix confirmation message isn't displayed after sending mail on Chrome (#1486177)
- Fix keyboard doesn't work with autocomplete list with Chrome (#1487029)
- Fix handling of backslash as IMAP delimiter
RELEASE 0.4.1
-------------
program/include/rcube_imap_generic.php
@@ -423,23 +423,7 @@
            return true;
        }
        if (!$this->getCapability('NAMESPACE')) {
            return false;
        }
        if (!$this->putLine("ns1 NAMESPACE")) {
            return false;
        }
        do {
            $line = $this->readLine(1024);
            if (preg_match('/^\* NAMESPACE/', $line)) {
                $i    = 0;
                $line = $this->unEscape($line);
                $data = $this->parseNamespace(substr($line,11), $i, 0, 0);
            }
        } while (!$this->startsWith($line, 'ns1', true, true));
        if (!is_array($data)) {
        if (!is_array($data = $this->_namespace())) {
            return false;
        }
@@ -488,13 +472,9 @@
        }
        do {
            $line = $this->readLine(500);
            if ($line[0] == '*') {
                $line = rtrim($line);
                $a = rcube_explode_quoted_string(' ', $this->unEscape($line));
                if ($a[0] == '*') {
                    $delimiter = str_replace('"', '', $a[count($a)-2]);
                }
            $line = $this->readLine(1024);
            if (preg_match('/^\* LIST \([^\)]*\) "*([^"]+)"* ""/', $line, $m)) {
                $delimiter = $this->unEscape($m[1]);
            }
        } while (!$this->startsWith($line, 'ghd', true, true));
@@ -504,22 +484,9 @@
        // if that fails, try namespace extension
        // try to fetch namespace data
        if (!$this->putLine("ns1 NAMESPACE")) {
        if (!is_array($data = $this->_namespace())) {
            return false;
        }
        do {
            $line = $this->readLine(1024);
            if (preg_match('/^\* NAMESPACE/', $line)) {
                $i = 0;
                $line = $this->unEscape($line);
                $data = $this->parseNamespace(substr($line,11), $i, 0, 0);
            }
        } while (!$this->startsWith($line, 'ns1', true, true));
        if (!is_array($data)) {
            return false;
        }
        // extract user space data (opposed to global/shared space)
        $user_space_data = $data[0];
@@ -537,6 +504,31 @@
        $delimiter = $first_userspace[1];
        return $delimiter;
    }
    function _namespace()
    {
        if (!$this->getCapability('NAMESPACE')) {
            return false;
        }
        if (!$this->putLine("ns1 NAMESPACE")) {
            return false;
        }
        do {
            $line = $this->readLine(1024);
            if (preg_match('/^\* NAMESPACE/', $line)) {
                $i = 0;
                $data = $this->parseNamespace(substr($line,11), $i, 0, 0);
            }
        } while (!$this->startsWith($line, 'ns1', true, true));
        if (!is_array($data)) {
            return false;
        }
        return $data;
    }
    function connect($host, $user, $password, $options=null)
@@ -1657,9 +1649,9 @@
                // folder name
                   $folders[] = preg_replace(array('/^"/', '/"$/'), '', $this->unEscape($m[3]));
                // attributes
//                $attrib = explode(' ', $m[1]);
//                $attrib = explode(' ', $this->unEscape($m[1]));
                // delimiter
//                $delim = $m[2];
//                $delim = $this->unEscape($m[2]);
            }
        } while (!$this->startsWith($line, $key, true));
@@ -2170,7 +2162,7 @@
        $in_quotes = false;
        $elem      = 0;
        for ($i;$i<$len;$i++) {
        for ($i; $i<$len; $i++) {
            $c = (string)$str[$i];
            if ($c == '(' && !$in_quotes) {
                $i++;
@@ -2181,7 +2173,7 @@
            } else if ($c == '\\') {
                $i++;
                if ($in_quotes) {
                    $data[$elem] .= $c.$str[$i];
                    $data[$elem] .= $str[$i];
                }
            } else if ($c == '"') {
                $in_quotes = !$in_quotes;