diff options
author | Aleksander Machniak <alec@alec.pl> | 2013-07-04 08:45:41 +0200 |
---|---|---|
committer | Aleksander Machniak <alec@alec.pl> | 2013-07-04 08:45:41 +0200 |
commit | 6e57fb6b4cc8c108b89458651dd525a0df950fdd (patch) | |
tree | d86abd9fd28d23ddc82dd0b592a45c03d0bd6db2 /program | |
parent | 3e7b9be05c68fca5617c3c01b0cf3bf5f3b32113 (diff) |
Fix parsing of square bracket characters in IMAP response strings (#1489223)
Diffstat (limited to 'program')
-rw-r--r-- | program/lib/Roundcube/rcube_imap_generic.php | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/program/lib/Roundcube/rcube_imap_generic.php b/program/lib/Roundcube/rcube_imap_generic.php index ae390a0ee..9b11624a7 100644 --- a/program/lib/Roundcube/rcube_imap_generic.php +++ b/program/lib/Roundcube/rcube_imap_generic.php @@ -2163,14 +2163,18 @@ class rcube_imap_generic else if ($name == 'RFC822') { $result[$id]->body = $value; } - else if ($name == 'BODY') { - $body = $this->tokenizeResponse($line, 1); - if ($value[0] == 'HEADER.FIELDS') - $headers = $body; - else if (!empty($value)) - $result[$id]->bodypart[$value[0]] = $body; + else if (stripos($name, 'BODY[') === 0) { + $name = str_replace(']', '', substr($name, 5)); + + if ($name == 'HEADER.FIELDS') { + // skip ']' after headers list + $this->tokenizeResponse($line, 1); + $headers = $this->tokenizeResponse($line, 1); + } + else if (strlen($name)) + $result[$id]->bodypart[$name] = $value; else - $result[$id]->body = $body; + $result[$id]->body = $value; } } @@ -2515,8 +2519,7 @@ class rcube_imap_generic for ($i=0; $i<count($tokens); $i+=2) { if (preg_match('/^(BODY|BINARY)/i', $tokens[$i])) { - $i += 2; // skip BODY|BINARY and part number - $result = $tokens[$i]; + $result = $tokens[$i+1]; $found = true; break; } @@ -3481,25 +3484,24 @@ class rcube_imap_generic // Parenthesized list case '(': - case '[': $str = substr($str, 1); $result[] = self::tokenizeResponse($str); break; case ')': - case ']': $str = substr($str, 1); return $result; break; - // String atom, number, NIL, *, % + // String atom, number, astring, NIL, *, % default: // empty string if ($str === '' || $str === null) { break 2; } - // excluded chars: SP, CTL, ), [, ], DEL - if (preg_match('/^([^\x00-\x20\x29\x5B\x5D\x7F]+)/', $str, $m)) { + // excluded chars: SP, CTL, ), DEL + // we do not exclude [ and ] (#1489223) + if (preg_match('/^([^\x00-\x20\x29\x7F]+)/', $str, $m)) { $result[] = $m[1] == 'NIL' ? NULL : $m[1]; $str = substr($str, strlen($m[1])); } |