diff --git a/program/lib/Roundcube/rcube_imap_generic.php b/program/lib/Roundcube/rcube_imap_generic.php index 764604d6a..f682b71e1 100644 --- a/program/lib/Roundcube/rcube_imap_generic.php +++ b/program/lib/Roundcube/rcube_imap_generic.php @@ -1128,35 +1128,61 @@ class rcube_imap_generic $response = explode("\r\n", $response); foreach ($response as $line) { - if (preg_match('/^\* ([0-9]+) (EXISTS|RECENT)$/i', $line, $m)) { - $this->data[strtoupper($m[2])] = (int) $m[1]; - } - else if (preg_match('/^\* OK \[/i', $line, $match)) { - $line = substr($line, 6); - if (preg_match('/^(UIDNEXT|UIDVALIDITY|UNSEEN) ([0-9]+)/i', $line, $match)) { - $this->data[strtoupper($match[1])] = (int) $match[2]; - } - else if (preg_match('/^(HIGHESTMODSEQ) ([0-9]+)/i', $line, $match)) { - $this->data[strtoupper($match[1])] = (string) $match[2]; - } - else if (preg_match('/^(NOMODSEQ)/i', $line, $match)) { - $this->data[strtoupper($match[1])] = true; - } - else if (preg_match('/^PERMANENTFLAGS \(([^\)]+)\)/iU', $line, $match)) { - $this->data['PERMANENTFLAGS'] = explode(' ', $match[1]); + if (preg_match('/^\* OK \[/i', $line)) { + $pos = strcspn($line, ' ]', 6); + $token = strtoupper(substr($line, 6, $pos)); + $pos += 7; + + switch ($token) { + case 'UIDNEXT': + case 'UIDVALIDITY': + case 'UNSEEN': + if ($len = strspn($line, '0123456789', $pos)) { + $this->data[$token] = (int) substr($line, $pos, $len); + } + break; + + case 'HIGHESTMODSEQ': + if ($len = strspn($line, '0123456789', $pos)) { + $this->data[$token] = (string) substr($line, $pos, $len); + } + break; + + case 'NOMODSEQ': + $this->data[$token] = true; + break; + + case 'PERMANENTFLAGS': + $start = strpos($line, '(', $pos); + $end = strrpos($line, ')'); + if ($start && $end) { + $flags = substr($line, $start + 1, $end - $start - 1); + $this->data[$token] = explode(' ', $flags); + } + break; } } - // QRESYNC FETCH response (RFC5162) - else if (preg_match('/^\* ([0-9+]) FETCH/i', $line, $match)) { - $line = substr($line, strlen($match[0])); - $fetch_data = $this->tokenizeResponse($line, 1); - $data = array('id' => $match[1]); - - for ($i=0, $size=count($fetch_data); $i<$size; $i+=2) { - $data[strtolower($fetch_data[$i])] = $fetch_data[$i+1]; - } + else if (preg_match('/^\* ([0-9]+) (EXISTS|RECENT|FETCH)/i', $line, $match)) { + $token = strtoupper($match[2]); + switch ($token) { + case 'EXISTS': + case 'RECENT': + $this->data[$token] = (int) $match[1]; + break; - $this->data['QRESYNC'][$data['uid']] = $data; + case 'FETCH': + // QRESYNC FETCH response (RFC5162) + $line = substr($line, strlen($match[0])); + $fetch_data = $this->tokenizeResponse($line, 1); + $data = array('id' => $match[1]); + + for ($i=0, $size=count($fetch_data); $i<$size; $i+=2) { + $data[strtolower($fetch_data[$i])] = $fetch_data[$i+1]; + } + + $this->data['QRESYNC'][$data['uid']] = $data; + break; + } } // QRESYNC VANISHED response (RFC5162) else if (preg_match('/^\* VANISHED [()EARLIER]*/i', $line, $match)) {