From e6b6925b6763157a3db62ab84c3efaa9e54f9dcc Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Thu, 04 Jul 2013 07:38:38 -0400
Subject: [PATCH] Fix handling of message/rfc822 attachments on message forward and edit (#1489214)

---
 program/steps/mail/compose.inc |   56 ++++++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 48 insertions(+), 8 deletions(-)

diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc
index 85fa712..c2d7bf9 100644
--- a/program/steps/mail/compose.inc
+++ b/program/steps/mail/compose.inc
@@ -577,13 +577,30 @@
   }
   // reply/edit/draft/forward
   else if ($compose_mode && ($compose_mode != RCUBE_COMPOSE_REPLY || intval($RCMAIL->config->get('reply_mode')) != -1)) {
-    $isHtml = rcmail_compose_editor_mode();
+    $isHtml   = rcmail_compose_editor_mode();
+    $messages = array();
 
     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->parts as $part) {
         // skip no-content and attachment parts (#1488557)
         if ($part->type != 'content' || !$part->size || $MESSAGE->is_attachment($part)) {
           continue;
+        }
+
+        // skip all content parts inside the message/rfc822 part in DRAFT/EDIT mode
+        foreach ($messages as $mimeid) {
+          if (strpos($part->mime_id, $mimeid . '.') === 0) {
+            continue 2;
+          }
         }
 
         if ($part_body = rcmail_compose_part_body($part, $isHtml)) {
@@ -996,7 +1013,18 @@
 {
   global $RCMAIL, $COMPOSE, $compose_mode;
 
+<<<<<<< HEAD
   $cid_map = $messages = array();
+=======
+  $loaded_attachments = array();
+  foreach ((array)$COMPOSE['attachments'] as $attachment) {
+      $loaded_attachments[$attachment['name'] . $attachment['mimetype']] = $attachment;
+  }
+
+  $cid_map  = array();
+  $messages = array();
+
+>>>>>>> cb1715c... Fix handling of message/rfc822 attachments on message forward and edit (#1489214)
   foreach ((array)$message->mime_parts as $pid => $part)
   {
     if ($part->disposition == 'attachment' || ($part->disposition == 'inline' && $bodyIsHtml) || $part->filename) {
@@ -1008,24 +1036,36 @@
       if ($part->ctype_primary == 'message' && $compose_mode == RCUBE_COMPOSE_REPLY) {
         continue;
       }
-      // skip inline images when forwarding
-      if ($part->content_id && $part->disposition == 'inline' && $compose_mode == RCUBE_COMPOSE_FORWARD) {
+      // skip inline images when forwarding in text mode
+      if ($part->content_id && $part->disposition == 'inline' && !$bodyIsHtml && $compose_mode == RCUBE_COMPOSE_FORWARD) {
         continue;
       }
 
-      $skip = false;
+      // 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 ($messages) {
+      }
+      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) {
-            $skip = true;
-            break;
+          if (strpos($part->mime_id, $mimeid . '.') === 0) {
+            continue 2;
           }
       }
 
+<<<<<<< HEAD
       if (!$skip && ($attachment = rcmail_save_attachment($message, $pid))) {
+=======
+      if (($attachment = $loaded_attachments[rcmail_attachment_name($part) . $part->mimetype])
+          || ($attachment = rcmail_save_attachment($message, $pid))) {
+>>>>>>> cb1715c... Fix handling of message/rfc822 attachments on message forward and edit (#1489214)
         $COMPOSE['attachments'][$attachment['id']] = $attachment;
         if ($bodyIsHtml && ($part->content_id || $part->content_location)) {
           $url = sprintf('%s&_id=%s&_action=display-attachment&_file=rcmfile%s',

--
Gitblit v1.9.1