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 | |
parent | 9d9623462ab144f9013b1f7ac85667e186f6c0d8 (diff) |
Fix handling of UNKNOWN-CTE response, try do decode content client-side (#1490046)
-rw-r--r-- | CHANGELOG | 1 | ||||
-rw-r--r-- | program/lib/Roundcube/rcube_imap_generic.php | 83 |
2 files changed, 48 insertions, 36 deletions
@@ -58,6 +58,7 @@ CHANGELOG Roundcube Webmail - Fix download of attachments that are part of TNEF message (#1490091) - Fix handling of uuencoded messages if messages_cache is enabled (#1490108) - Fix handling of base64-encoded attachments with extra spaces (#1490111) +- Fix handling of UNKNOWN-CTE response, try do decode content client-side (#1490046) RELEASE 1.0.3 ------------- 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; } |