summaryrefslogtreecommitdiff
path: root/program
diff options
context:
space:
mode:
authoralecpl <alec@alec.pl>2010-10-05 19:14:57 +0000
committeralecpl <alec@alec.pl>2010-10-05 19:14:57 +0000
commit393ba7186f10faece2d77d7a2e1d0802c60c3e39 (patch)
tree0bb6e1a58219c38d3ea6bc7f221f7eea6039e350 /program
parent8f94b1aad656ec19c92b7ec7aa7f9e4cd4ac60a0 (diff)
- Fix handling of backslash as IMAP delimiter
Diffstat (limited to 'program')
-rw-r--r--program/include/rcube_imap_generic.php76
1 files changed, 34 insertions, 42 deletions
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;