diff options
author | Aleksander Machniak <alec@alec.pl> | 2014-10-23 13:42:21 +0200 |
---|---|---|
committer | Aleksander Machniak <alec@alec.pl> | 2014-10-23 13:42:21 +0200 |
commit | 81dab388d0aa982f6eecc23dcbfb9afdb17ef2e1 (patch) | |
tree | 4f89940a7e71483b63ef703e820612675cdb5dc1 /program/lib | |
parent | 9d9623462ab144f9013b1f7ac85667e186f6c0d8 (diff) |
Fix handling of UNKNOWN-CTE response, try do decode content client-side (#1490046)
Diffstat (limited to 'program/lib')
-rw-r--r-- | program/lib/Roundcube/rcube_imap_generic.php | 83 |
1 files changed, 47 insertions, 36 deletions
diff --git a/program/lib/Roundcube/rcube_imap_generic.php b/program/lib/Roundcube/rcube_imap_generic.php index 7c1166f5c..a3a76ab2a 100644 --- a/program/lib/Roundcube/rcube_imap_generic.php +++ b/program/lib/Roundcube/rcube_imap_generic.php @@ -2569,48 +2569,59 @@ class rcube_imap_generic return false; } - switch ($encoding) { - case 'base64': - $mode = 1; - break; - case 'quoted-printable': - $mode = 2; - break; - case 'x-uuencode': - case 'x-uue': - case 'uue': - case 'uuencode': - $mode = 3; - break; - default: - $mode = 0; - } - - // Use BINARY extension when possible (and safe) - $binary = $mode && preg_match('/^[0-9.]+$/', $part) && $this->hasCapability('BINARY'); - $fetch_mode = $binary ? 'BINARY' : 'BODY'; - $partial = $max_bytes ? sprintf('<0.%d>', $max_bytes) : ''; + $initiated = false; - // format request - $key = $this->nextTag(); - $request = $key . ($is_uid ? ' UID' : '') . " FETCH $id ($fetch_mode.PEEK[$part]$partial)"; - $result = false; - $found = false; + do { + if (!$initiated) { + switch ($encoding) { + case 'base64': + $mode = 1; + break; + case 'quoted-printable': + $mode = 2; + break; + case 'x-uuencode': + case 'x-uue': + case 'uue': + case 'uuencode': + $mode = 3; + break; + default: + $mode = 0; + } - // send request - if (!$this->putLine($request)) { - $this->setError(self::ERROR_COMMAND, "Unable to send command: $request"); - return false; - } + // Use BINARY extension when possible (and safe) + $binary = !$binary_err && $mode && preg_match('/^[0-9.]+$/', $part) && $this->hasCapability('BINARY'); + $fetch_mode = $binary ? 'BINARY' : 'BODY'; + $partial = $max_bytes ? sprintf('<0.%d>', $max_bytes) : ''; + + // format request + $key = $this->nextTag(); + $request = $key . ($is_uid ? ' UID' : '') . " FETCH $id ($fetch_mode.PEEK[$part]$partial)"; + $result = false; + $found = false; + $initiated = true; + + // send request + if (!$this->putLine($request)) { + $this->setError(self::ERROR_COMMAND, "Unable to send command: $request"); + return false; + } - if ($binary) { - // WARNING: Use $formatted argument with care, this may break binary data stream - $mode = -1; - } + if ($binary) { + // WARNING: Use $formatted argument with care, this may break binary data stream + $mode = -1; + } + } - do { $line = trim($this->readLine(1024)); + // handle UNKNOWN-CTE response - RFC 3516, try standard BODY request instead of BINARY + if ($binary && preg_match('/^' . $key . ' NO \[UNKNOWN-CTE\]/i', $line)) { + $initiated = false; + continue; + } + if (!$line) { break; } |