summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoralecpl <alec@alec.pl>2009-02-06 19:04:45 +0000
committeralecpl <alec@alec.pl>2009-02-06 19:04:45 +0000
commit5801afdf3ecc30b3eaaa19afa9d50ea42849271b (patch)
tree51f925d305f959ce33029ea94c87e8e1d22966e1
parent874717b7f1b98ede166a078fc1ffd3f536716576 (diff)
- Fix some base64 encoded attachments handling (#1485725)
-rw-r--r--CHANGELOG1
-rw-r--r--program/lib/imap.inc22
2 files changed, 19 insertions, 4 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 810f24c89..e6c4a85d6 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -5,6 +5,7 @@ CHANGELOG RoundCube Webmail
----------
- Fix pressing select all/unread multiple times (#1485723)
- Fix selecting all unread does not honor new messages (#1485724)
+- Fix some base64 encoded attachments handling (#1485725)
2009/02/05 (alec)
----------
diff --git a/program/lib/imap.inc b/program/lib/imap.inc
index 302cfc007..056632209 100644
--- a/program/lib/imap.inc
+++ b/program/lib/imap.inc
@@ -2508,7 +2508,8 @@ function iil_C_HandlePartBody(&$conn, $mailbox, $id, $part='', $mode=1, $file=NU
$len = $to - $from;
$sizeStr = substr($line, $from, $len);
$bytes = (int)$sizeStr;
-
+ $prev = '';
+
while ($bytes > 0) {
$line = iil_ReadLine($fp, 1024);
$len = strlen($line);
@@ -2518,14 +2519,27 @@ function iil_C_HandlePartBody(&$conn, $mailbox, $id, $part='', $mode=1, $file=NU
}
$bytes -= strlen($line);
+ $line = rtrim($line, "\t\r\n\0\x0B");
+
if ($mode == 1) {
if ($file)
- fwrite($file, rtrim($line, "\t\r\n\0\x0B") . "\n");
+ fwrite($file, $line . "\n");
else
- $result .= rtrim($line, "\t\r\n\0\x0B") . "\n";
+ $result .= $line . "\n";
} else if ($mode == 2) {
- echo rtrim($line, "\t\r\n\0\x0B") . "\n";
+ echo $line . "\n";
} else if ($mode == 3) {
+ // create chunks with proper length for base64 decoding
+ $line = $prev.$line;
+ $length = strlen($line);
+ if ($length % 4) {
+ $length = floor($length / 4) * 4;
+ $prev = substr($line, $length);
+ $line = substr($line, 0, $length);
+ }
+ else
+ $prev = '';
+
if ($file)
fwrite($file, base64_decode($line));
else