summaryrefslogtreecommitdiff
path: root/roundcubemail/program/include
diff options
context:
space:
mode:
authoralec <alec@208e9e7b-5314-0410-a742-e7e81cd9613c>2010-12-22 18:11:29 +0000
committeralec <alec@208e9e7b-5314-0410-a742-e7e81cd9613c>2010-12-22 18:11:29 +0000
commitf03e951d64529af8d68d71e417c771f47738da17 (patch)
tree721c54314f04af5f5d51384e2ce8eb193e072697 /roundcubemail/program/include
parentafc6c4c990a59cb6e1e20c8f19212c09813723dc (diff)
- Fix handling (skipping) of unilateral untagged server responses (in THREAD/SORT/SEARCH commands)
git-svn-id: https://svn.roundcube.net/trunk@4360 208e9e7b-5314-0410-a742-e7e81cd9613c
Diffstat (limited to 'roundcubemail/program/include')
-rw-r--r--roundcubemail/program/include/rcube_imap_generic.php33
1 files changed, 23 insertions, 10 deletions
diff --git a/roundcubemail/program/include/rcube_imap_generic.php b/roundcubemail/program/include/rcube_imap_generic.php
index e5e06c440..512e7e44e 100644
--- a/roundcubemail/program/include/rcube_imap_generic.php
+++ b/roundcubemail/program/include/rcube_imap_generic.php
@@ -1150,9 +1150,12 @@ class rcube_imap_generic
array("($field)", $encoding, 'ALL' . (!empty($add) ? ' '.$add : '')));
if ($code == self::ERROR_OK) {
- // remove prefix and \r\n from raw response
- $response = str_replace("\r\n", '', substr($response, 7));
- return preg_split('/\s+/', $response, -1, PREG_SPLIT_NO_EMPTY);
+ // remove prefix and unilateral untagged server responses
+ $response = substr($response, stripos($response, '* SORT') + 7);
+ if ($pos = strpos($response, '*')) {
+ $response = substr($response, 0, $pos);
+ }
+ return preg_split('/[\s\r\n]+/', $response, -1, PREG_SPLIT_NO_EMPTY);
}
return false;
@@ -1889,9 +1892,15 @@ class rcube_imap_generic
list($code, $response) = $this->execute('THREAD', array(
$algorithm, $encoding, $criteria));
- if ($code == self::ERROR_OK && preg_match('/^\* THREAD /i', $response)) {
- // remove prefix and \r\n from raw response
- $response = str_replace("\r\n", '', substr($response, 9));
+ if ($code == self::ERROR_OK) {
+ // remove prefix...
+ $response = substr($response, stripos($response, '* THREAD') + 9);
+ // ...unilateral untagged server responses
+ if ($pos = strpos($response, '*')) {
+ $response = substr($response, 0, $pos);
+ }
+
+ $response = str_replace("\r\n", '', $response);
$depthmap = array();
$haschildren = array();
@@ -1949,9 +1958,13 @@ class rcube_imap_generic
array($params));
if ($code == self::ERROR_OK) {
- // remove prefix and \r\n from raw response
- $response = substr($response, $esearch ? 10 : 9);
- $response = str_replace("\r\n", '', $response);
+ // remove prefix...
+ $response = substr($response, stripos($response,
+ $esearch ? '* ESEARCH' : '* SEARCH') + ($esearch ? 10 : 9));
+ // ...and unilateral untagged server responses
+ if ($pos = strpos($response, '*')) {
+ $response = rtrim(substr($response, 0, $pos));
+ }
if ($esearch) {
// Skip prefix: ... (TAG "A285") UID ...
@@ -1970,7 +1983,7 @@ class rcube_imap_generic
return $result;
}
else {
- $response = preg_split('/\s+/', $response, -1, PREG_SPLIT_NO_EMPTY);
+ $response = preg_split('/[\s\r\n]+/', $response, -1, PREG_SPLIT_NO_EMPTY);
if (!empty($items)) {
$result = array();