diff options
| author | Aleksander Machniak <alec@alec.pl> | 2013-04-29 13:32:29 +0200 | 
|---|---|---|
| committer | Aleksander Machniak <alec@alec.pl> | 2013-04-29 13:32:29 +0200 | 
| commit | c6f5adbac33e5a14cce5c093b2b9e69ec39a52c6 (patch) | |
| tree | f85bbf48c7e6790c12bc05825eae3b1eef2ee159 /program/lib/Roundcube | |
| parent | 6e8cd89fa3bd0fb359ebe349f8c9945ad61146cb (diff) | |
Fix handling untagged responses in IMAP FETCH - "could not load message" error (#1489074)
Diffstat (limited to 'program/lib/Roundcube')
| -rw-r--r-- | program/lib/Roundcube/rcube_imap_generic.php | 19 | 
1 files changed, 14 insertions, 5 deletions
| diff --git a/program/lib/Roundcube/rcube_imap_generic.php b/program/lib/Roundcube/rcube_imap_generic.php index 460e6cc92..db50ffbab 100644 --- a/program/lib/Roundcube/rcube_imap_generic.php +++ b/program/lib/Roundcube/rcube_imap_generic.php @@ -2475,6 +2475,7 @@ class rcube_imap_generic          $key     = $this->nextTag();          $request = $key . ($is_uid ? ' UID' : '') . " FETCH $id ($fetch_mode.PEEK[$part]$partial)";          $result  = false; +        $found   = false;          // send request          if (!$this->putLine($request)) { @@ -2494,18 +2495,25 @@ class rcube_imap_generic                  break;              } -            if (!preg_match('/^\* ([0-9]+) FETCH (.*)$/', $line, $m)) { +            // skip irrelevant untagged responses (we have a result already) +            if ($found || !preg_match('/^\* ([0-9]+) FETCH (.*)$/', $line, $m)) {                  continue;              }              $line = $m[2]; -            $last = substr($line, -1);              // handle one line response -            if ($line[0] == '(' && $last == ')') { +            if ($line[0] == '(' && substr($line, -1) == ')') {                  // tokenize content inside brackets -                $tokens = $this->tokenizeResponse(preg_replace('/(^\(|\$)/', '', $line)); -                $result = count($tokens) == 1 ? $tokens[0] : false; +                $tokens = $this->tokenizeResponse(preg_replace('/(^\(|\)$)/', '', $line)); + +                for ($i=0; $i<count($tokens); $i+=2) { +                    if (preg_match('/^(BODY|BINARY)/i', $token)) { +                        $result = $tokens[$i+1]; +                        $found  = true; +                        break; +                    } +                }                  if ($result !== false) {                      if ($mode == 1) { @@ -2523,6 +2531,7 @@ class rcube_imap_generic              else if (preg_match('/\{([0-9]+)\}$/', $line, $m)) {                  $bytes = (int) $m[1];                  $prev  = ''; +                $found = true;                  while ($bytes > 0) {                      $line = $this->readLine(8192); | 
