From 393ba7186f10faece2d77d7a2e1d0802c60c3e39 Mon Sep 17 00:00:00 2001 From: alecpl Date: Tue, 5 Oct 2010 19:14:57 +0000 Subject: [PATCH] - Fix handling of backslash as IMAP delimiter --- CHANGELOG | 1 + program/include/rcube_imap_generic.php | 76 ++++++++++++-------------- 2 files changed, 35 insertions(+), 42 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 632e78c59..be129c655 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -21,6 +21,7 @@ CHANGELOG Roundcube Webmail - 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 ------------- diff --git a/program/include/rcube_imap_generic.php b/program/include/rcube_imap_generic.php index f2a09ad66..2c8f4f0bf 100644 --- a/program/include/rcube_imap_generic.php +++ b/program/include/rcube_imap_generic.php @@ -423,23 +423,7 @@ class rcube_imap_generic 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 @@ class rcube_imap_generic } 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,23 +484,10 @@ class rcube_imap_generic // 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]; if (!is_array($user_space_data)) { @@ -539,6 +506,31 @@ class rcube_imap_generic 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) { // set options @@ -1657,9 +1649,9 @@ class rcube_imap_generic // 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 @@ class rcube_imap_generic $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 @@ class rcube_imap_generic } else if ($c == '\\') { $i++; if ($in_quotes) { - $data[$elem] .= $c.$str[$i]; + $data[$elem] .= $str[$i]; } } else if ($c == '"') { $in_quotes = !$in_quotes;