From 46f7b7096450939fe03c95aa81ce06ae4bfca89d Mon Sep 17 00:00:00 2001 From: Aleksander Machniak <alec@alec.pl> Date: Mon, 28 Mar 2016 06:51:43 -0400 Subject: [PATCH] Enable reply/reply-all/forward buttons also in preview frame of message/rfc822 --- program/steps/mail/compose.inc | 73 ++++++++++++++++++++---------------- 1 files changed, 41 insertions(+), 32 deletions(-) diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc index 934b862..9ef8647 100644 --- a/program/steps/mail/compose.inc +++ b/program/steps/mail/compose.inc @@ -5,7 +5,7 @@ | program/steps/mail/compose.inc | | | | This file is part of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2016, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -179,7 +179,7 @@ $MESSAGE = new rcube_message($msg_uid); // make sure message is marked as read - if ($MESSAGE->headers && empty($MESSAGE->headers->flags['SEEN'])) { + if ($MESSAGE->headers && $MESSAGE->context === null && empty($MESSAGE->headers->flags['SEEN'])) { $RCMAIL->storage->set_flag($msg_uid, 'SEEN'); } @@ -192,7 +192,7 @@ } else if ($compose_mode == RCUBE_COMPOSE_FORWARD || $compose_mode == RCUBE_COMPOSE_REPLY) { if ($compose_mode == RCUBE_COMPOSE_REPLY) { - $COMPOSE['reply_uid'] = $msg_uid; + $COMPOSE['reply_uid'] = $MESSAGE->context === null ? $msg_uid : null; if (!empty($COMPOSE['param']['all'])) { $MESSAGE->reply_all = $COMPOSE['param']['all']; @@ -359,7 +359,12 @@ // clean HTML message body which can be submitted by URL if (!empty($COMPOSE['param']['body'])) { - $COMPOSE['param']['body'] = rcmail_wash_html($COMPOSE['param']['body'], array('safe' => false, 'inline_html' => true), array()); + if ($COMPOSE['param']['html'] = strpos($COMPOSE['param']['body'], '<') !== false) { + $wash_params = array('safe' => false, 'inline_html' => true); + $COMPOSE['param']['body'] = rcmail_wash_html($COMPOSE['param']['body'], $wash_params, array()); + $COMPOSE['param']['body'] = preg_replace('/<!--[^>\n]+>/', '', $COMPOSE['param']['body']); + $COMPOSE['param']['body'] = preg_replace('/<\/?body>/', '', $COMPOSE['param']['body']); + } } $RCMAIL = rcmail::get_instance(); @@ -718,7 +723,10 @@ $html_editor = intval($RCMAIL->config->get('htmleditor')); $compose_mode = $COMPOSE['mode']; - if (isset($_POST['_is_html'])) { + if (is_bool($COMPOSE['param']['html'])) { + $useHtml = $COMPOSE['param']['html']; + } + else if (isset($_POST['_is_html'])) { $useHtml = !empty($_POST['_is_html']); } else if ($compose_mode == RCUBE_COMPOSE_DRAFT || $compose_mode == RCUBE_COMPOSE_EDIT) { @@ -772,11 +780,9 @@ if (!empty($MESSAGE->parts)) { // collect IDs of message/rfc822 parts - if ($COMPOSE['mode'] == RCUBE_COMPOSE_EDIT || $COMPOSE['mode'] == RCUBE_COMPOSE_DRAFT) { - foreach ($MESSAGE->attachments as $part) { - if ($part->mimetype == 'message/rfc822') { - $messages[] = $part->mime_id; - } + foreach ($MESSAGE->mime_parts() as $part) { + if ($part->mimetype == 'message/rfc822') { + $messages[] = $part->mime_id; } } @@ -798,7 +804,7 @@ continue; } - // skip all content parts inside the message/rfc822 part in DRAFT/EDIT mode + // skip all content parts inside the message/rfc822 part foreach ($messages as $mimeid) { if (strpos($part->mime_id, $mimeid . '.') === 0) { continue 2; @@ -1252,7 +1258,11 @@ return $cid_map; } - foreach ((array)$message->mime_parts as $pid => $part) { + foreach ((array) $message->mime_parts() as $pid => $part) { + if ($part->mimetype == 'message/rfc822') { + $messages[] = $part->mime_id; + } + if ($part->disposition == 'attachment' || ($part->disposition == 'inline' && $bodyIsHtml) || $part->filename) { // skip parts that aren't valid attachments if ($part->ctype_primary == 'multipart' || $part->mimetype == 'application/ms-tnef') { @@ -1274,23 +1284,10 @@ continue; } - // skip message/rfc822 attachments on forwards (#1489214) - // Thunderbird when forwarding in inline mode displays such attachments - // and skips any attachments from inside of such part, this however - // skipped e.g. images used in HTML body or other attachments. So, - // better to skip .eml attachments but not their content (included files). - if ($part->mimetype == 'message/rfc822') { - if ($COMPOSE['mode'] == RCUBE_COMPOSE_FORWARD) { - continue; - } - $messages[] = $part->mime_id; - } - else if ($COMPOSE['mode'] != RCUBE_COMPOSE_FORWARD) { - // skip attachments included in message/rfc822 attachment (#1486487) - foreach ($messages as $mimeid) { - if (strpos($part->mime_id, $mimeid . '.') === 0) { - continue 2; - } + // skip attachments included in message/rfc822 attachment (#1486487, #1490607) + foreach ($messages as $mimeid) { + if (strpos($part->mime_id, $mimeid . '.') === 0) { + continue 2; } } @@ -1320,14 +1317,26 @@ { global $RCMAIL, $COMPOSE; - $cid_map = array(); + $cid_map = array(); + $messages = array(); if ($message->pgp_mime) { return $cid_map; } - foreach ((array)$message->mime_parts as $pid => $part) { + foreach ((array) $message->mime_parts() as $pid => $part) { + if ($part->mimetype == 'message/rfc822') { + $messages[] = $part->mime_id; + } + if (($part->content_id || $part->content_location) && $part->filename) { + // skip attachments included in message/rfc822 attachment (#1486487, #1490607) + foreach ($messages as $mimeid) { + if (strpos($part->mime_id, $mimeid . '.') === 0) { + continue 2; + } + } + if ($attachment = rcmail_save_attachment($message, $pid, $COMPOSE['id'])) { $url = sprintf('%s&_id=%s&_action=display-attachment&_file=rcmfile%s', $RCMAIL->comm_path, $COMPOSE['id'], $attachment['id']); @@ -1849,7 +1858,7 @@ 'id' => 'rcmli%s', 'class' => '%s'), html::a(array('href' => '#list', 'rel' => '%s', - 'onclick' => "return ".rcmail_output::JS_OBJECT_NAME.".command('list-adresses','%s',this)"), '%s')); + 'onclick' => "return ".rcmail_output::JS_OBJECT_NAME.".command('list-addresses','%s',this)"), '%s')); foreach ($RCMAIL->get_address_sources(false, true) as $j => $source) { $id = strval(strlen($source['id']) ? $source['id'] : $j); -- Gitblit v1.9.1