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 | 224 ++++++++++++++++++++++++++++++++++--------------------- 1 files changed, 137 insertions(+), 87 deletions(-) diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc index b25a7de..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']) @@ -215,7 +219,7 @@ if (!empty($addr_part['mailto']) && !in_array($addr_part['mailto'], $sa_recipients) && (!$MESSAGE->compose_from - || !in_array($addr_part['mailto'], $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']; @@ -241,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; @@ -279,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)) @@ -288,7 +292,7 @@ foreach ($a_cc as $addr) { if (!empty($addr['mailto'])) - $a_recipients[] = $addr['mailto']; + $a_recipients[] = rc_strtolower($addr['mailto']); } } } @@ -322,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); @@ -401,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'])) { @@ -426,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" : ''; @@ -466,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)); } @@ -482,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; @@ -531,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 { @@ -545,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 @@ -580,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')) - { - $message->get_part_content($pid, $fp); - 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 + ); + } } @@ -620,6 +669,7 @@ unset($attrib['form']); $attrib['name'] = '_subject'; + $attrib['spellcheck'] = 'true'; $textfield = new html_inputfield($attrib); $subject = ''; @@ -674,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')); @@ -709,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; @@ -725,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(); } -- Gitblit v1.9.1