Aleksander Machniak
2013-07-04 cb1715cd165b5f0883d96e6350239f74fdb76a58
Fix handling of message/rfc822 attachments on message forward and edit (#1489214)
2 files modified
45 ■■■■ changed files
CHANGELOG 1 ●●●● patch | view | raw | blame | history
program/steps/mail/compose.inc 44 ●●●● patch | view | raw | blame | history
CHANGELOG
@@ -1,6 +1,7 @@
CHANGELOG Roundcube Webmail
===========================
- Fix handling of message/rfc822 attachments on message forward and edit (#1489214)
- Fix folder names truncation in Classic skin (#1489220)
- Fix parsing of square bracket characters in IMAP response strings (#1489223)
- Don't clear References and in-Reply-To when a message is "edited as new" (#1489216)
program/steps/mail/compose.inc
@@ -597,12 +597,29 @@
  // 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();
    $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)) {
@@ -1021,7 +1038,9 @@
      $loaded_attachments[$attachment['name'] . $attachment['mimetype']] = $attachment;
  }
  $cid_map = $messages = array();
  $cid_map  = array();
  $messages = array();
  foreach ((array)$message->mime_parts as $pid => $part)
  {
    if ($part->disposition == 'attachment' || ($part->disposition == 'inline' && $bodyIsHtml) || $part->filename) {
@@ -1033,25 +1052,32 @@
      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;
            continue 2;
          }
      }
      if (!$skip && (($attachment = $loaded_attachments[rcmail_attachment_name($part) . $part->mimetype])
          || ($attachment = rcmail_save_attachment($message, $pid)))) {
      if (($attachment = $loaded_attachments[rcmail_attachment_name($part) . $part->mimetype])
          || ($attachment = rcmail_save_attachment($message, $pid))) {
        $COMPOSE['attachments'][$attachment['id']] = $attachment;
        if ($bodyIsHtml && ($part->content_id || $part->content_location)) {
          $url = sprintf('%s&_id=%s&_action=display-attachment&_file=rcmfile%s',