From de9497cea760849a05f52848b9a670a7006b97d6 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak <alec@alec.pl> Date: Wed, 15 Aug 2012 09:33:46 -0400 Subject: [PATCH] Fix line separator in exported messages (#1488603) --- program/include/rcube_imap_generic.php | 103 ++++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 88 insertions(+), 15 deletions(-) diff --git a/program/include/rcube_imap_generic.php b/program/include/rcube_imap_generic.php index 4d4698f..f70b91b 100644 --- a/program/include/rcube_imap_generic.php +++ b/program/include/rcube_imap_generic.php @@ -7,7 +7,10 @@ | This file is part of the Roundcube Webmail client | | Copyright (C) 2005-2010, The Roundcube Dev Team | | Copyright (C) 2011, Kolab Systems AG | - | Licensed under the GNU GPL | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | | | | PURPOSE: | | Provide alternative IMAP library that doesn't rely on the standard | @@ -56,10 +59,67 @@ public $mdn_to; public $others = array(); public $flags = array(); + + // map header to rcube_mail_header object property + private $obj_headers = array( + 'date' => 'date', + 'from' => 'from', + 'to' => 'to', + 'subject' => 'subject', + 'reply-to' => 'replyto', + 'cc' => 'cc', + 'bcc' => 'bcc', + 'content-transfer-encoding' => 'encoding', + 'in-reply-to' => 'in_reply_to', + 'content-type' => 'ctype', + 'references' => 'references', + 'return-receipt-to' => 'mdn_to', + 'disposition-notification-to' => 'mdn_to', + 'x-confirm-reading-to' => 'mdn_to', + 'message-id' => 'messageID', + 'x-priority' => 'priority', + ); + + /** + * Returns header value + */ + public function get($name, $decode = true) + { + $name = strtolower($name); + + if (isset($this->obj_headers[$name])) { + $value = $this->{$this->obj_headers[$name]}; + } + else { + $value = $this->others[$name]; + } + + return $decode ? rcube_mime::decode_header($value, $this->charset) : $value; + } + + /** + * Sets header value + */ + public function set($name, $value) + { + $name = strtolower($name); + + if (isset($this->obj_headers[$name])) { + $this->{$this->obj_headers[$name]} = $value; + } + else { + $this->others[$name] = $value; + } + } } // For backward compatibility with cached messages (#1486602) class iilBasicHeader extends rcube_mail_header +{ +} + +// Support objects created in git-master (0.9) +class rcube_message_header extends rcube_mail_header { } @@ -1349,12 +1409,16 @@ $folders[$mailbox] = array(); } - // Add to options array - if (empty($this->data['LIST'][$mailbox])) - $this->data['LIST'][$mailbox] = $opts; - else if (!empty($opts)) - $this->data['LIST'][$mailbox] = array_unique(array_merge( - $this->data['LIST'][$mailbox], $opts)); + // store LSUB options only if not empty, this way + // we can detect a situation when LIST doesn't return specified folder + if (!empty($opts) || $cmd == 'LIST') { + // Add to options array + if (empty($this->data['LIST'][$mailbox])) + $this->data['LIST'][$mailbox] = $opts; + else if (!empty($opts)) + $this->data['LIST'][$mailbox] = array_unique(array_merge( + $this->data['LIST'][$mailbox], $opts)); + } } // * STATUS <mailbox> (<result>) else if ($cmd == 'STATUS') { @@ -1450,7 +1514,7 @@ // Invoke SEARCH as a fallback $index = $this->search($mailbox, 'ALL UNSEEN', false, array('COUNT')); - if (!$index->isError()) { + if (!$index->is_error()) { return $index->count(); } @@ -1556,6 +1620,11 @@ return new rcube_result_index($mailbox); } + // RFC 5957: SORT=DISPLAY + if (($field == 'FROM' || $field == 'TO') && $this->getCapability('SORT=DISPLAY')) { + $field = 'DISPLAY' . $field; + } + // message IDs if (!empty($add)) $add = $this->compressMessageSet($add); @@ -1638,7 +1707,7 @@ // If ESEARCH is supported always use ALL // but not when items are specified or using simple id2uid search - if (empty($items) && ((int) $criteria != $criteria)) { + if (empty($items) && preg_match('/[^0-9]/', $criteria)) { $items = array('ALL'); } @@ -2067,9 +2136,10 @@ $result[$id]->subject = ''; $result[$id]->messageID = 'mid:' . $id; - $lines = array(); - $line = substr($line, strlen($m[0]) + 2); - $ln = 0; + $headers = null; + $lines = array(); + $line = substr($line, strlen($m[0]) + 2); + $ln = 0; // get complete entry while (preg_match('/\{([0-9]+)\}\r\n$/', $line, $m)) { @@ -2385,7 +2455,7 @@ return $this->handlePartBody($mailbox, $id, $is_uid, $part); } - function handlePartBody($mailbox, $id, $is_uid=false, $part='', $encoding=NULL, $print=NULL, $file=NULL) + function handlePartBody($mailbox, $id, $is_uid=false, $part='', $encoding=NULL, $print=NULL, $file=NULL, $formatted=true) { if (!$this->select($mailbox)) { return false; @@ -2502,7 +2572,7 @@ continue; $line = convert_uudecode($line); // default - } else { + } else if ($formatted) { $line = rtrim($line, "\t\r\n\0\x0B") . "\n"; } @@ -3604,13 +3674,16 @@ if ($string === null) { return 'NIL'; } + if ($string === '') { return '""'; } + // atom-string (only safe characters) - if (!$force_quotes && !preg_match('/[\x00-\x20\x22\x28-\x2A\x5B-\x5D\x7B\x7D\x80-\xFF]/', $string)) { + if (!$force_quotes && !preg_match('/[\x00-\x20\x22\x25\x28-\x2A\x5B-\x5D\x7B\x7D\x80-\xFF]/', $string)) { return $string; } + // quoted-string if (!preg_match('/[\r\n\x00\x80-\xFF]/', $string)) { return '"' . addcslashes($string, '\\"') . '"'; -- Gitblit v1.9.1