thomascube
2010-03-04 a96183883d95dc83a7d0951f5b834e44b062f9cf
program/steps/mail/compose.inc
@@ -44,6 +44,8 @@
  
  // process values like "mailto:foo@bar.com?subject=new+message&cc=another"
  if ($_SESSION['compose']['param']['to']) {
    // #1486037: remove "mailto:" prefix
    $_SESSION['compose']['param']['to'] = preg_replace('/^mailto:/i', '', $_SESSION['compose']['param']['to']);
    $mailto = explode('?', $_SESSION['compose']['param']['to']);
    if (count($mailto) > 1) {
      $_SESSION['compose']['param']['to'] = $mailto[0];
@@ -55,8 +57,8 @@
  
  // pipe compose parameters thru plugins
  $plugin = $RCMAIL->plugins->exec_hook('message_compose', $_SESSION['compose']);
  $_SESSION['compose']['param'] = $plugin['param'];
  $_SESSION['compose']['param'] = array_merge($_SESSION['compose']['param'], $plugin['param']);
  // add attachments listed by message_compose hook
  if (is_array($plugin['attachments'])) {
    foreach ($plugin['attachments'] as $attach) {
@@ -103,6 +105,8 @@
}
// set current mailbox in client environment
$OUTPUT->set_env('mailbox', $IMAP->get_mailbox_name());
$OUTPUT->set_env('sig_above', $CONFIG['sig_above']);
$OUTPUT->set_env('top_posting', $CONFIG['top_posting']);
// get reference message and set compose mode
if ($msg_uid = $_SESSION['compose']['param']['reply_uid'])
@@ -116,11 +120,24 @@
  $compose_mode = RCUBE_COMPOSE_DRAFT;
}
$config_show_sig = $RCMAIL->config->get('show_sig', 1);
if ($config_show_sig == 1)
  $OUTPUT->set_env('show_sig', true);
else if ($config_show_sig == 2 && (empty($compose_mode) || $compose_mode == RCUBE_COMPOSE_EDIT || $compose_mode == RCUBE_COMPOSE_DRAFT))
  $OUTPUT->set_env('show_sig', true);
else if ($config_show_sig == 3 && ($compose_mode == RCUBE_COMPOSE_REPLY || $compose_mode == RCUBE_COMPOSE_FORWARD))
  $OUTPUT->set_env('show_sig', true);
else
  $OUTPUT->set_env('show_sig', false);
// set line length for body wrapping
$LINE_LENGTH = $RCMAIL->config->get('line_length', 75);
if (!empty($msg_uid))
{
  // similar as in program/steps/mail/show.inc
  // re-set 'prefer_html' to have possibility to use html part for compose
  $CONFIG['prefer_html'] = $CONFIG['htmleditor'] || $compose_mode == RCUBE_COMPOSE_DRAFT || $compose_mode == RCUBE_COMPOSE_EDIT;
  $CONFIG['prefer_html'] = $CONFIG['prefer_html'] || $CONFIG['htmleditor'] || $compose_mode == RCUBE_COMPOSE_DRAFT || $compose_mode == RCUBE_COMPOSE_EDIT;
  $MESSAGE = new rcube_message($msg_uid);
  
  if (!empty($MESSAGE->headers->charset))
@@ -134,6 +151,8 @@
    if (!empty($_SESSION['compose']['param']['all']))
      $MESSAGE->reply_all = 1;
    $OUTPUT->set_env('compose_mode', 'reply');
  }
  else if ($compose_mode == RCUBE_COMPOSE_DRAFT)
  {
@@ -149,6 +168,7 @@
  else if ($compose_mode == RCUBE_COMPOSE_FORWARD)
  {
    $_SESSION['compose']['forward_uid'] = $msg_uid;
    $OUTPUT->set_env('compose_mode', 'forward');
  }
}
@@ -383,7 +403,7 @@
function rcmail_compose_body($attrib)
{
  global $RCMAIL, $CONFIG, $OUTPUT, $MESSAGE, $compose_mode;
  global $RCMAIL, $CONFIG, $OUTPUT, $MESSAGE, $compose_mode, $LINE_LENGTH;
  
  list($form_start, $form_end) = get_form_tags($attrib);
  unset($attrib['form']);
@@ -412,10 +432,20 @@
  }
  else if ($compose_mode)
  {
    if (($isHtml || $compose_mode == RCUBE_COMPOSE_DRAFT) && $MESSAGE->has_html_part())
    $has_html_part = $MESSAGE->has_html_part();
    if (($isHtml || $compose_mode == RCUBE_COMPOSE_DRAFT) && $has_html_part)
    {
      $body = $MESSAGE->first_html_part();
      $isHtml = true;
    }
    else if ($has_html_part)
    {
      // use html part if it has been used for message (pre)viewing
      // decrease line length for quoting
      $len = $compose_mode == RCUBE_COMPOSE_REPLY ? $LINE_LENGTH-2 : $LINE_LENGTH;
      $txt = new html2text($MESSAGE->first_html_part(), false, true, $len);
      $body = $txt->get_text();
      $isHtml = false;
    }
    else
    {
@@ -433,10 +463,10 @@
    else if ($compose_mode == RCUBE_COMPOSE_DRAFT || $compose_mode == RCUBE_COMPOSE_EDIT)
      $body = rcmail_create_draft_body($body, $isHtml);
  }
  else if (!empty($_SESSION['compose']['param']['body']))
  {
    $body = $_SESSION['compose']['param']['body'];
  }
  $plugin = $RCMAIL->plugins->exec_hook('message_compose_body',
    array('body' => $body, 'html' => $isHtml, 'mode' => $compose_mode));
  $body = $plugin['body'];
  $out = $form_start ? "$form_start\n" : '';
@@ -510,19 +540,17 @@
function rcmail_create_reply_body($body, $bodyIsHtml)
{
  global $IMAP, $MESSAGE, $OUTPUT;
  global $RCMAIL, $MESSAGE, $LINE_LENGTH;
  if (! $bodyIsHtml)
  {
  if (!$bodyIsHtml) {
    // try to remove the signature
    if (($sp = strrpos($body, '-- ')) !== false && ($sp == 0 || $body{$sp-1} == "\n"))
      {
    if ($RCMAIL->config->get('strip_existing_sig', true) && ($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, max(0, $sp-1));
      }
    }
    // soft-wrap message first
    $body = rcmail_wrap_quoted($body, 75);
    $body = rcmail_wrap_quoted($body, $LINE_LENGTH);
    $body = rtrim($body, "\r\n");
@@ -531,25 +559,27 @@
      $a_lines = preg_split('/\r?\n/', $body);
      // add > to each line
      for($n=0; $n<sizeof($a_lines); $n++) {
      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 = rc_wordwrap(sprintf("On %s, %s wrote:\n",
      $MESSAGE->headers->date,
      $MESSAGE->get_header('from')), 76);
      $MESSAGE->get_header('from')), $LINE_LENGTH);
    $suffix = '';
    if ($RCMAIL->config->get('top_posting'))
      $prefix = "\n\n\n" . $prefix;
  }
  else
  {
  else {
    // save inline images to files
    $cid_map = rcmail_write_inline_attachments($MESSAGE);
    // set is_safe flag (we need this for html body washing)
@@ -560,9 +590,16 @@
    // build reply (quote content)
    $prefix = sprintf("On %s, %s wrote:<br />\n",
      $MESSAGE->headers->date,
      htmlspecialchars(Q($MESSAGE->get_header('from'), 'replace'), ENT_COMPAT, $OUTPUT->get_charset()));
      htmlspecialchars(Q($MESSAGE->get_header('from'), 'replace'), ENT_COMPAT, $RCMAIL->output->get_charset()));
    $prefix .= '<blockquote type="cite" style="padding-left:5px; border-left:#1010ff 2px solid; margin-left:5px; width:100%">';
    $suffix = "</blockquote><p></p>";
    if ($RCMAIL->config->get('top_posting')) {
      $prefix = "<p></p>" . $prefix;
      $suffix = "</blockquote>";
    }
    else {
      $suffix = "</blockquote><p></p>";
    }
  }
  return $prefix.$body.$suffix;
@@ -596,7 +633,7 @@
    $body = rcmail_wash_html($body, array('safe' => $MESSAGE->is_safe), $cid_map);
    $prefix = sprintf(
      "<br><br>-------- Original Message --------" .
      "<p></p><p>-------- Original Message --------</p>" .
        "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody>" .
        "<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>" .
@@ -709,9 +746,10 @@
    'mimetype' => $part->ctype_primary . '/' . $part->ctype_secondary,
    'content_id' => $part->content_id,
    'data' => $data,
    'path' => $path
    'path' => $path,
    'size' => $path ? filesize($path) : strlen($data),
  );
  $attachment = rcmail::get_instance()->plugins->exec_hook('save_attachment', $attachment);
  if ($attachment['status']) {
@@ -781,6 +819,7 @@
    $attrib['id'] = 'rcmAttachmentList';
  
  $out = "\n";
  $jslist = array();
  
  if (is_array($_SESSION['compose']['attachments']))
  {
@@ -798,12 +837,14 @@
      if (empty($a_prop))
        continue;
      
      $out .= html::tag('li', array('id' => "rcmfile".$id),
      $out .= html::tag('li', array('id' => 'rcmfile'.$id),
        html::a(array(
            'href' => "#delete",
            'title' => rcube_label('delete'),
            'onclick' => sprintf("return %s.command('remove-attachment','rcmfile%s', this)", JS_OBJECT_NAME, $id)),
          $button) . Q($a_prop['name']));
        $jslist['rcmfile'.$id] = array('name' => $a_prop['name'], 'complete' => true, 'mimetype' => $a_prop['mimetype']);
    }
  }
@@ -814,6 +855,7 @@
  if ($attrib['loadingicon'])
    $OUTPUT->set_env('loadingicon', $CONFIG['skin_path'] . $attrib['loadingicon']);
  $OUTPUT->set_env('attachments', $jslist);
  $OUTPUT->add_gui_object('attachmentlist', $attrib['id']);
    
  return html::tag('ul', $attrib, $out, html::$common_attrib);