From cb15aaa2654c00ecc78880c7daec7acee6fa61ec Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Mon, 27 Oct 2008 13:49:05 -0400
Subject: [PATCH] Also check for negative image size + set caching headers for 1 hour

---
 program/steps/mail/compose.inc |  231 +++++++++++++++++++++++++++++++++++----------------------
 1 files changed, 143 insertions(+), 88 deletions(-)

diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc
index 0a5226e..df6f1ff 100644
--- a/program/steps/mail/compose.inc
+++ b/program/steps/mail/compose.inc
@@ -35,8 +35,8 @@
     unset($_SESSION['compose']['attachments'][$id]);
     $OUTPUT->command('remove_from_attachment_list', "rcmfile$id");
     $OUTPUT->send();
-    exit;
   }
+  exit;
 }
 
 if ($RCMAIL->action=='display-attachment' && preg_match('/^rcmfile([0-9]+)$/', $_GET['_file'], $regs))
@@ -81,11 +81,15 @@
 }
 
 // add some labels to client
-rcube_add_label('nosubject', 'norecipientwarning', 'nosubjectwarning', 'nobodywarning', 'notsentwarning', 'savingmessage', 'sendingmessage', 'messagesaved', 'converting');
+$OUTPUT->add_label('nosubject', 'nosenderwarning', 'norecipientwarning', 'nosubjectwarning', 'nobodywarning', 'notsentwarning', 'savingmessage', 'sendingmessage', 'messagesaved', 'converting');
 
-// add config parameter to client script
-$OUTPUT->set_env('draft_autosave', !empty($CONFIG['drafts_mbox']) ? $CONFIG['draft_autosave'] : 0);
-
+// add config parameters to client script
+if (!empty($CONFIG['drafts_mbox'])) {
+  $OUTPUT->set_env('drafts_mailbox', $CONFIG['drafts_mbox']);
+  $OUTPUT->set_env('draft_autosave', $CONFIG['draft_autosave']);
+}
+// set current mailbox in client environment
+$OUTPUT->set_env('mailbox', $IMAP->get_mailbox_name());
 
 // get reference message and set compose mode
 if ($msg_uid = $_SESSION['compose']['param']['_reply_uid'])
@@ -209,9 +213,14 @@
     {
       $to_addresses = $IMAP->decode_address_list($fvalue);
       $fvalue = '';
+
       foreach ($to_addresses as $addr_part)
       {
-        if (!empty($addr_part['mailto']) && !in_array($addr_part['mailto'], $sa_recipients) && (!$MESSAGE->compose_from || !in_array($addr_part['mailto'], $MESSAGE->compose_from)))
+        if (!empty($addr_part['mailto'])
+	    && !in_array($addr_part['mailto'], $sa_recipients)
+	    && (!$MESSAGE->compose_from
+		|| !in_array_nocase($addr_part['mailto'], $MESSAGE->compose_from)
+		|| count($to_addresses)==1)) // allow reply to yourself
         {
           $fvalue .= (strlen($fvalue) ? ', ':'').$addr_part['string'];
           $sa_recipients[] = $addr_part['mailto'];
@@ -236,7 +245,7 @@
   if ($fname && $field_type)
   {
     // pass the following attributes to the form class
-    $field_attrib = array('name' => $fname);
+    $field_attrib = array('name' => $fname, 'spellcheck' => 'false');
     foreach ($attrib as $attr => $value)
       if (in_array($attr, $allow_attrib))
         $field_attrib[$attr] = $value;
@@ -274,7 +283,7 @@
     foreach ($a_to as $addr)
     {
       if (!empty($addr['mailto']))
-        $a_recipients[] = $addr['mailto'];
+        $a_recipients[] = rc_strtolower($addr['mailto']);
     }
 
     if (!empty($MESSAGE->headers->cc))
@@ -283,7 +292,7 @@
       foreach ($a_cc as $addr)
       {
         if (!empty($addr['mailto']))
-          $a_recipients[] = $addr['mailto'];
+          $a_recipients[] = rc_strtolower($addr['mailto']);
       }
     }
   }
@@ -317,19 +326,22 @@
         }
       }
 
-      // set identity if it's one of the reply-message recipients
-      if (in_array($sql_arr['email'], $a_recipients))
-        $from_id = $sql_arr['identity_id'];
-
       if ($compose_mode == RCUBE_COMPOSE_REPLY && is_array($MESSAGE->compose_from))
         $MESSAGE->compose_from[] = $sql_arr['email'];
 
-      if ($compose_mode == RCUBE_COMPOSE_DRAFT && strstr($MESSAGE->headers->from, $sql_arr['email']))
-        $from_id = $sql_arr['identity_id'];
+      if (empty($_POST['_from']))
+      {
+        // set draft's identity
+        if ($compose_mode == RCUBE_COMPOSE_DRAFT && strstr($MESSAGE->headers->from, $sql_arr['email']))
+          $from_id = $sql_arr['identity_id'];
+        // set identity if it's one of the reply-message recipients (with prio for default identity)
+        else if (in_array(rc_strtolower($sql_arr['email']), $a_recipients) && (empty($from_id) || $sql_arr['standard']))
+          $from_id = $sql_arr['identity_id'];
+      }
     }
 
     // overwrite identity selection with post parameter
-    if (isset($_POST['_from']))
+    if (!empty($_POST['_from']))
       $from_id = get_input_value('_from', RCUBE_INPUT_POST);
 
     $out = $select_from->show($from_id);
@@ -396,6 +408,16 @@
     // load draft message body
     else if ($compose_mode == RCUBE_COMPOSE_DRAFT)
       $body = rcmail_create_draft_body($body, $isHtml);
+
+    if ($isHtml) {
+      // replace cid with href in inline images links
+      foreach ((array)$_SESSION['compose']['attachments'] as $pid => $attachment) {
+        if ($attachment['content_id']) {
+	  $body = str_replace('cid:'. $attachment['content_id'], 
+	    $OUTPUT->app->comm_path.'&_action=display-attachment&_file=rcmfile'.$pid, $body);
+        }
+      }
+    }
   }
   else if (!empty($_SESSION['compose']['param']['_body']))
   {
@@ -421,8 +443,8 @@
   $msgtype = new html_hiddenfield(array('name' => '_is_html', 'value' => ($isHtml?"1":"0")));
   $out .= $msgtype->show();
 
-  // If desired, set this text area to be editable by TinyMCE
-  if ($isHtml) $attrib['class'] = "mce_editor";
+  // If desired, set this textarea to be editable by TinyMCE
+  if ($isHtml) $attrib['class'] = 'mce_editor';
   $textarea = new html_textarea($attrib);
   $out .= $textarea->show($body);
   $out .= $form_end ? "\n$form_end" : '';
@@ -461,7 +483,7 @@
       $attrib['id'],
       JS_OBJECT_NAME), 'foot');
 
-    rcube_add_label('checking');
+    $OUTPUT->add_label('checking');
     $OUTPUT->set_env('spellcheck_langs', join(',', $editor_lang_set));
   }
  
@@ -477,43 +499,49 @@
 
   if (! $bodyIsHtml)
   {
-    // soft-wrap message first
-    $body = rcmail_wrap_quoted($body, 75);
-  
-    // split body into single lines
-    $a_lines = preg_split('/\r?\n/', $body);
-  
-    // add > to each line
-    for($n=0; $n<sizeof($a_lines); $n++)
-    {
-      if (strpos($a_lines[$n], '>')===0)
-        $a_lines[$n] = '>'.$a_lines[$n];
-      else
-        $a_lines[$n] = '> '.$a_lines[$n];
-    }
- 
-    $body = join("\n", $a_lines);
-
-    // add title line
-    $prefix = sprintf("\n\n\nOn %s, %s wrote:\n",
-      $MESSAGE->headers->date,
-      $MESSAGE->get_header('from'));
-
     // try to remove the signature
-    if ($sp = strrpos($body, '-- '))
+    if (($sp = strrpos($body, '-- ')) !== false && ($sp == 0 || $body{$sp-1} == "\n"))
       {
       if ($body{$sp+3}==' ' || $body{$sp+3}=="\n" || $body{$sp+3}=="\r")
-        $body = substr($body, 0, $sp-1);
+        $body = substr($body, 0, max(0, $sp-1));
       }
+
+    // soft-wrap message first
+    $body = rcmail_wrap_quoted($body, 75);
+
+    $body = rtrim($body, "\r\n");
+
+    if ($body) {
+      // split body into single lines
+      $a_lines = preg_split('/\r?\n/', $body);
+
+      // add > to each line
+      for($n=0; $n<sizeof($a_lines); $n++) {
+        if (strpos($a_lines[$n], '>')===0)
+          $a_lines[$n] = '>'.$a_lines[$n];
+        else
+          $a_lines[$n] = '> '.$a_lines[$n];
+        }
+ 
+      $body = join("\n", $a_lines);
+      }
+
+    // add title line(s)
+    $prefix = wordwrap(sprintf("On %s, %s wrote:\n",
+      $MESSAGE->headers->date,
+      $MESSAGE->get_header('from')), 76);
+
     $suffix = '';
   }
   else
   {
-    $prefix = sprintf("<br /><br />On %s, %s wrote:<br />\n",
+    $prefix = sprintf("On %s, %s wrote:<br />\n",
       $MESSAGE->headers->date,
-      htmlspecialchars(Q($MESSAGE->get_header('from'), 'replace'), ENT_COMPAT, $OUTPUT->get_charset(), true));
+      htmlspecialchars(Q($MESSAGE->get_header('from'), 'replace'), ENT_COMPAT, $OUTPUT->get_charset()));
     $prefix .= '<blockquote type="cite" style="padding-left:5px; border-left:#1010ff 2px solid; margin-left:5px; width:100%">';
     $suffix = "</blockquote>";
+
+    rcmail_write_inline_attachments($MESSAGE);
   }
 
   return $prefix.$body.$suffix;
@@ -526,11 +554,14 @@
 
   if (!$bodyIsHtml)
   {
-    $prefix = sprintf("\n\n\n-------- Original Message --------\nSubject: %s\nDate: %s\nFrom: %s\nTo: %s\n\n",
-      $MESSAGE->subject,
-      $MESSAGE->headers->date,
-      $MESSAGE->get_header('from'),
-      $MESSAGE->get_header('to'));
+    $prefix = "\n\n\n-------- Original Message --------\n";
+    $prefix .= 'Subject: ' . $MESSAGE->subject . "\n";
+    $prefix .= 'Date: ' . $MESSAGE->headers->date . "\n";
+    $prefix .= 'From: ' . $MESSAGE->get_header('from') . "\n";
+    $prefix .= 'To: ' . $MESSAGE->get_header('to') . "\n";
+    if ($MESSAGE->headers->replyto && $MESSAGE->headers->replyto != $MESSAGE->headers->from)
+      $prefix .= 'Reply-To: ' . $MESSAGE->get_header('replyto') . "\n";
+    $prefix .= "\n";
   }
   else
   {
@@ -540,12 +571,17 @@
         "<tr><th align=\"right\" nowrap=\"nowrap\" valign=\"baseline\">Subject: </th><td>%s</td></tr>" .
         "<tr><th align=\"right\" nowrap=\"nowrap\" valign=\"baseline\">Date: </th><td>%s</td></tr>" .
         "<tr><th align=\"right\" nowrap=\"nowrap\" valign=\"baseline\">From: </th><td>%s</td></tr>" .
-        "<tr><th align=\"right\" nowrap=\"nowrap\" valign=\"baseline\">To: </th><td>%s</td></tr>" .
-        "</tbody></table><br>",
+        "<tr><th align=\"right\" nowrap=\"nowrap\" valign=\"baseline\">To: </th><td>%s</td></tr>",
       Q($MESSAGE->subject),
       Q($MESSAGE->headers->date),
       htmlspecialchars(Q($MESSAGE->get_header('from'), 'replace'), ENT_COMPAT, $OUTPUT->get_charset(), true),
-      htmlspecialchars(Q($MESSAGE->get_header('to'), 'replace'), ENT_COMPAT, $OUTPUT->get_charset(), true));
+	htmlspecialchars(Q($MESSAGE->get_header('to'), 'replace'), ENT_COMPAT, $OUTPUT->get_charset(), true));
+
+    if ($MESSAGE->headers->replyto && $MESSAGE->headers->replyto != $MESSAGE->headers->from)
+      $prefix .= sprintf("<tr><th align=\"right\" nowrap=\"nowrap\" valign=\"baseline\">Reply-To: </th><td>%s</td></tr>",
+	htmlspecialchars(Q($MESSAGE->get_header('replyto'), 'replace'), ENT_COMPAT, $OUTPUT->get_charset(), true));
+
+    $prefix .= "</tbody></table><br>";
   }
 
   // add attachments
@@ -575,35 +611,53 @@
   
 function rcmail_write_compose_attachments(&$message, $bodyIsHtml)
 {
-  global $RCMAIL, $IMAP;
-
-  $temp_dir = unslashify($RCMAIL->config->get('temp_dir'));
-
-  if (!is_array($_SESSION['compose']['attachments']))
-    $_SESSION['compose']['attachments'] = array();
-  
   foreach ((array)$message->mime_parts as $pid => $part)
   {
     if (($part->ctype_primary != 'message' || !$bodyIsHtml) &&
-        ($part->disposition=='attachment' || $part->disposition=='inline' || $part->headers['content-id'] ||
-         (empty($part->disposition) && $part->filename)))
+        ($part->disposition=='attachment' || $part->disposition=='inline' || $part->headers['content-id']
+	|| (empty($part->disposition) && $part->filename)))
     {
-      $tmp_path = tempnam($temp_dir, 'rcmAttmnt');
-      if ($fp = fopen($tmp_path, 'w'))
-      {
-        fwrite($fp, $message->get_part_content($pid));
-        fclose($fp);
-        
-        $_SESSION['compose']['attachments'][] = array(
-          'mimetype' => $part->ctype_primary . '/' . $part->ctype_secondary,
-          'name' => $part->filename,
-          'path' => $tmp_path
-          );
-      }
+      if ($attachment = rcmail_save_attachment($message, $pid))
+        $_SESSION['compose']['attachments'][] = $attachment;
     }
   }
 	
   $_SESSION['compose']['forward_attachments'] = true;
+}
+
+
+function rcmail_write_inline_attachments(&$message)
+{
+  foreach ((array)$message->mime_parts as $pid => $part)
+  {
+    if ($part->content_id && $part->filename)
+    {
+      if ($attachment = rcmail_save_attachment($message, $pid))
+        $_SESSION['compose']['attachments'][] = $attachment;
+    }
+  }
+}
+
+function rcmail_save_attachment(&$message, $pid)
+{
+  global $RCMAIL;
+
+  $temp_dir = unslashify($RCMAIL->config->get('temp_dir'));
+  $tmp_path = tempnam($temp_dir, 'rcmAttmnt');
+  $part = $message->mime_parts[$pid];
+  
+  if ($fp = fopen($tmp_path, 'w'))
+  {
+    $message->get_part_content($pid, $fp);
+    fclose($fp);
+
+    return array(
+        'mimetype' => $part->ctype_primary . '/' . $part->ctype_secondary,
+        'name' => $part->filename,
+        'path' => $tmp_path,
+	'content_id' => $part->content_id
+    );
+  }
 }
 
 
@@ -615,6 +669,7 @@
   unset($attrib['form']);
   
   $attrib['name'] = '_subject';
+  $attrib['spellcheck'] = 'true';
   $textfield = new html_inputfield($attrib);
 
   $subject = '';
@@ -669,7 +724,7 @@
       $button = html::img(array(
         'src' => $CONFIG['skin_path'] . $attrib['deleteicon'],
         'alt' => rcube_label('delete'),
-        'style' => "border:0;padding-right:2px;vertical-align:middle"));
+        'style' => "padding-right:2px;vertical-align:middle"));
     else
       $button = Q(rcube_label('delete'));
 
@@ -704,14 +759,15 @@
   $button = new html_inputfield(array('type' => 'button', 'class' => 'button'));
   
   $out = html::div($attrib,
-    $OUTPUT->form_tag(array('name' => 'form', 'method' => 'post', 'enctype' => 'multipart/form-data')) .
-    html::div(null, rcmail_compose_attachment_field(array())) .
-    html::div('hint', rcube_label(array('name' => 'maxuploadsize', 'vars' => array('size' => show_bytes(parse_bytes(ini_get('upload_max_filesize'))))))) .
-    html::div('buttons',
-      $button->show(rcube_label('close'), array('onclick' => "document.getElementById('$attrib[id]').style.visibility='hidden'")) . ' ' .
-      $button->show(rcube_label('upload'), array('onclick' => JS_OBJECT_NAME . ".command('send-attachment', this.form)")))
+    $OUTPUT->form_tag(array('name' => 'form', 'method' => 'post', 'enctype' => 'multipart/form-data'),
+      html::div(null, rcmail_compose_attachment_field(array())) .
+      html::div('hint', rcube_label(array('name' => 'maxuploadsize', 'vars' => array('size' => show_bytes(parse_bytes(ini_get('upload_max_filesize'))))))) .
+      html::div('buttons',
+        $button->show(rcube_label('close'), array('onclick' => "document.getElementById('$attrib[id]').style.visibility='hidden'")) . ' ' .
+        $button->show(rcube_label('upload'), array('onclick' => JS_OBJECT_NAME . ".command('send-attachment', this.form)"))
+      )
+    )
   );
-  
   
   $OUTPUT->add_gui_object('uploadbox', $attrib['id']);
   return $out;
@@ -720,11 +776,10 @@
 
 function rcmail_compose_attachment_field($attrib)
 {
-  // allow the following attributes to be added to the <input> tag
-  $attrib_str = create_attrib_string($attrib, array('id', 'class', 'style', 'size'));
- 
-  $out = '<input type="file" name="_attachments[]"'. $attrib_str . " />";
-  return $out;
+  $attrib['type'] = 'file';
+  $attrib['name'] = '_attachments[]';
+  $field = new html_inputfield($attrib);
+  return $field->show();
 }
 
 
@@ -810,7 +865,7 @@
 function rcmail_store_target_selection($attrib)
 {
   $attrib['name'] = '_store_target';
-  $select = rcmail_mailbox_select(array('noselection' => '- '.rcube_label('dontsave').' -'));
+  $select = rcmail_mailbox_select(array_merge($attrib, array('noselection' => '- '.rcube_label('dontsave').' -')));
   return $select->show(rcmail::get_instance()->config->get('sent_mbox'), $attrib);
 }
 

--
Gitblit v1.9.1