X-Git-Url: https://vcs.fsf.org/?p=squirrelmail.git;a=blobdiff_plain;f=src%2Fcompose.php;h=83ffe5c24f77b8c89b191b9e3be091a2596a0ce1;hp=8effe7742bad906f1f77d607595c158815eea7d2;hb=6a108031f5a965a47615ba6aa934c45595b5273b;hpb=7058a2a9da7b7e141848fd92c15f1ab3f47b8bbb diff --git a/src/compose.php b/src/compose.php index 8effe774..83ffe5c2 100644 --- a/src/compose.php +++ b/src/compose.php @@ -24,12 +24,58 @@ require_once('../functions/mime.php'); require_once('../functions/smtp.php'); require_once('../functions/display_messages.php'); require_once('../functions/plugin.php'); +require_once('../functions/html.php'); + +/* --------------------- Specific Functions ------------------------------ */ + + + +/** + * Does the opposite of sqWordWrap() + */ +function sqUnWordWrap(&$body) { + $lines = explode("\n", $body); + $body = ''; + $PreviousSpaces = ''; + for ($i = 0; $i < count($lines); $i ++) { + ereg("^([\t >]*)([^\t >].*)?$", $lines[$i], $regs); + $CurrentSpaces = $regs[1]; + if (isset($regs[2])) { + $CurrentRest = $regs[2]; + } + + if ($i == 0) { + $PreviousSpaces = $CurrentSpaces; + $body = $lines[$i]; + } else if (($PreviousSpaces == $CurrentSpaces) /* Do the beginnings match */ + && (strlen($lines[$i - 1]) > 65) /* Over 65 characters long */ + && strlen($CurrentRest)) { /* and there's a line to continue with */ + $body .= ' ' . $CurrentRest; + } else { + $body .= "\n" . $lines[$i]; + $PreviousSpaces = $CurrentSpaces; + } + } + $body .= "\n"; +} + +/* ----------------------------------------------------------------------- */ if (!isset($attachments)) { $attachments = array(); session_register('attachments'); } +if (!isset($composesession)) { + $composesession = 0; + session_register('composesession'); +} + +if (!isset($session) || (isset($newmessage) && $newmessage)) { + $session = "$composesession" +1; + $composesession = $session; +} + if (!isset($mailbox) || $mailbox == '' || ($mailbox == 'None')) { $mailbox = 'INBOX'; } @@ -42,8 +88,11 @@ if (isset($draft)) { if (! isset($MDN)) { $MDN = 'False'; } - if (!saveMessageAsDraft($send_to, $send_to_cc, $send_to_bcc, $subject, $body, $reply_id, $MDN)) { - showInputForm(); + if (! isset($mailprio)) { + $mailprio = ''; + } + if (!saveMessageAsDraft($send_to, $send_to_cc, $send_to_bcc, $subject, $body, $reply_id, $mailprio, $session)) { + showInputForm($session); exit(); } else { $draft_message = _("Draft Email Saved"); @@ -55,12 +104,12 @@ if (isset($draft)) { } else { if ($compose_new_win == '1') { - Header("Location: compose.php?saved_draft=yes"); + Header("Location: compose.php?saved_draft=yes&session=$composesession"); exit(); } else { Header("Location: right_main.php?mailbox=$draft_folder&sort=$sort". - "&startMessage=1¬e=$draft_message"); + "&startMessage=1¬e=".urlencode($draft_message)); exit(); } } @@ -71,7 +120,7 @@ if (isset($send)) { if (isset($HTTP_POST_FILES['attachfile']) && $HTTP_POST_FILES['attachfile']['tmp_name'] && $HTTP_POST_FILES['attachfile']['tmp_name'] != 'none') { - $AttachFailure = saveAttachedFiles(); + $AttachFailure = saveAttachedFiles($session); } if (checkInput(false) && !isset($AttachFailure)) { $urlMailbox = urlencode (trim($mailbox)); @@ -94,8 +143,7 @@ if (isset($send)) { /* * Rewrap $body so that no line is bigger than $editor_size * This should only really kick in the sqWordWrap function - * if the browser doesn't support "HARD" as the wrap type - * Or, in Opera's case, something goes wrong. + * if the browser doesn't support "VIRTUAL" as the wrap type. */ $body = explode("\n", $body); $newBody = ''; @@ -106,24 +154,24 @@ if (isset($send)) { if (strlen($line) <= $editor_size + 1) { $newBody .= $line . "\n"; } else { - sqWordWrap($line, $editor_size) . "\n"; - $newBody .= $line; + sqWordWrap($line, $editor_size); + $newBody .= $line . "\n"; } } $body = $newBody; - do_hook("compose_send"); - + do_hook('compose_send'); + $MDN = False; // we are not sending a mdn response if (! isset($mailprio)) { $Result = sendMessage($send_to, $send_to_cc, $send_to_bcc, - $subject, $body, $reply_id, $MDN); + $subject, $body, $reply_id, $MDN, '', $session); } else { $Result = sendMessage($send_to, $send_to_cc, $send_to_bcc, - $subject, $body, $reply_id, $MDN, $mailprio); + $subject, $body, $reply_id, $MDN, $mailprio, $session); } if (! $Result) { - showInputForm(); + showInputForm($session); exit(); } if ( isset($delete_draft)) { @@ -155,11 +203,10 @@ if (isset($send)) { } checkInput(true); - showInputForm(); + showInputForm($session); /* sqimap_logout($imapConnection); */ } -} -elseif (isset($html_addr_search_done)) { +} elseif (isset($html_addr_search_done)) { if ($compose_new_win == '1') { compose_Header($color, $mailbox); } @@ -189,13 +236,12 @@ elseif (isset($html_addr_search_done)) { } } } - showInputForm(); -} -elseif (isset($html_addr_search)) { + showInputForm($session); +} elseif (isset($html_addr_search)) { if (isset($HTTP_POST_FILES['attachfile']) && $HTTP_POST_FILES['attachfile']['tmp_name'] && $HTTP_POST_FILES['attachfile']['tmp_name'] != 'none') { - if (saveAttachedFiles()) { + if (saveAttachedFiles($session)) { plain_error_message(_("Could not move/copy file. File not attached"), $color); } } @@ -204,9 +250,8 @@ elseif (isset($html_addr_search)) { * click. If you can think of a better way, please implement it. */ include_once('./addrbook_search_html.php'); -} -elseif (isset($attach)) { - if (saveAttachedFiles()) { +} elseif (isset($attach)) { + if (saveAttachedFiles($session)) { plain_error_message(_("Could not move/copy file. File not attached"), $color); } if ($compose_new_win == '1') { @@ -215,9 +260,26 @@ elseif (isset($attach)) { else { displayPageHeader($color, $mailbox); } - showInputForm(); + showInputForm($session); } -elseif (isset($do_delete)) { +elseif (isset($sigappend)) { + $idents = getPref($data_dir, $username, 'identities', 0); + if ($idents > 1) { + if ($identity == 'default') { + $no = 'g'; + } else { + $no = $identity; + } + $signature = getSig($data_dir, $username, $no); + } + $body .= "\n\n".($prefix_sig==true? "-- \n":'').$signature; + if ($compose_new_win == '1') { + compose_Header($color, $mailbox); + } else { + displayPageHeader($color, $mailbox); + } + showInputForm($session); +} elseif (isset($do_delete)) { if ($compose_new_win == '1') { compose_Header($color, $mailbox); } @@ -230,12 +292,33 @@ elseif (isset($do_delete)) { foreach($delete as $index) { $attached_file = $hashed_attachment_dir . '/' . $attachments[$index]['localfilename']; - unlink ($attached_file); - unset ($attachments[$index]); + unlink ($attached_file); + unset ($attachments[$index]); } } - showInputForm(); + showInputForm($session); + +} elseif (isset($attachedmessages)) { + + /* + * This handles the case if we attache message + */ + $imapConnection = sqimap_login($username, $key, $imapServerAddress, + $imapPort, 0); + if ($compose_new_win == '1') { + compose_Header($color, $mailbox); + } + else { + displayPageHeader($color, $mailbox); + } + + $newmail = true; + + newMail(); + showInputForm($session); + sqimap_logout($imapConnection); + } else { /* * This handles the default case as well as the error case @@ -252,18 +335,22 @@ elseif (isset($do_delete)) { $newmail = true; - ClearAttachments(); + ClearAttachments($session); if (isset($forward_id) && $forward_id && isset($ent_num) && $ent_num) { - getAttachments(0); + getAttachments(0, $session); } if (isset($draft_id) && $draft_id && isset($ent_num) && $ent_num) { - getAttachments(0); + getAttachments(0, $session); } - newMail(); - showInputForm(); + if (isset($passed_id) && $passed_id && isset($ent_num) && $ent_num) { + getAttachments(0, $session); + } + + newMail($session); + showInputForm($session); sqimap_logout($imapConnection); } @@ -277,18 +364,24 @@ exit(); function newMail () { global $forward_id, $imapConnection, $msg, $ent_num, $body_ary, $body, $reply_id, $send_to, $send_to_cc, $mailbox, $send_to_bcc, $editor_size, - $draft_id, $use_signature; + $draft_id, $use_signature, $composesession, $forward_cc, $passed_id; $send_to = decodeHeader($send_to, false); $send_to_cc = decodeHeader($send_to_cc, false); $send_to_bcc = decodeHeader($send_to_bcc, false); + $send_to = str_replace('<', '<', str_replace('>', '>', str_replace('&', '&', str_replace('"', '"', $send_to)))); + $send_to_cc = str_replace('<', '<', str_replace('>', '>', str_replace('&', '&', str_replace('"', '"', $send_to_cc)))); + $send_to_bcc = str_replace('<', '<', str_replace('>', '>', str_replace('&', '&', str_replace('"', '"', $send_to_bcc)))); if ($forward_id) { $id = $forward_id; } elseif ($reply_id) { $id = $reply_id; + } elseif ($passed_id) { + $id = $passed_id; } + if ($draft_id){ $id = $draft_id; $use_signature = FALSE; @@ -298,29 +391,51 @@ function newMail () { sqimap_mailbox_select($imapConnection, $mailbox); $message = sqimap_get_message($imapConnection, $id, $mailbox); $orig_header = $message->header; + $body = ''; + if ($ent_num) { - $message = getEntity($message, $ent_num); - } - if ($message->header->type0 == 'text' || - $message->header->type1 == 'message') { - if ($ent_num) { - $body = decodeBody( - mime_fetch_body($imapConnection, $id, $ent_num), - $message->header->encoding); - } else { - $body = decodeBody( - mime_fetch_body($imapConnection, $id, 1), - $message->header->encoding); - } - } else { - $body = ''; - } + $ent_ar = preg_split('/_/',$ent_num); + foreach($ent_ar as $ent_num) { + $msg = $message; + $msg->getEntity($ent_num); + if ($msg->header->type0 == 'text' || + $msg->header->type1 == 'message') { + $bodypart = decodeBody( + mime_fetch_body($imapConnection, $id, $ent_num), + $msg->header->encoding); + if ($msg->header->type1 == 'html') { + $bodypart = strip_tags($bodypart); + } + $body .= $bodypart; + } + } + } else if ($message->header->type0 == 'text' || + $message->header->type1 == 'message') { + $body .= decodeBody( + mime_fetch_body($imapConnection, $id, 1), + $message->header->encoding); + if ($message->header->type1 == 'html') { + $body = strip_tags($body); + } + + } - if ($message->header->type1 == 'html') { - $body = strip_tags($body); + sqUnWordWrap($body); + + /* this corrects some wrapping/quoting problems on replies */ + if ($reply_id) { + $rewrap_body = explode("\n", $body); + for ($i=0;$i+)/", $rewrap_body[$i], $matches)) { + $gt = $matches[1]; + $rewrap_body[$i] = str_replace("\n", "\n$gt ", $rewrap_body[$i]); + } + $rewrap_body[$i] .= "\n"; + } + $body = implode("", $rewrap_body); } - sqUnWordWrap($body); $body_ary = explode("\n", $body); $i = count($body_ary) - 1; while ($i >= 0 && ereg("^[>\\s]*$", $body_ary[$i])) { @@ -330,14 +445,14 @@ function newMail () { $body = ''; for ($i=0; isset($body_ary[$i]); $i++) { if ($reply_id) { - if (ereg('^[ >]+', $body_ary[$i])) { + if (preg_match("/^(>){1,}/", $body_ary[$i])) { $body_ary[$i] = '>' . $body_ary[$i]; } else { $body_ary[$i] = '> ' . $body_ary[$i]; } } - if (!$draft_id) { - sqWordWrap($body_ary[$i], $editor_size - 1); + if ($draft_id) { + sqWordWrap($body_ary[$i], $editor_size ); } $body .= $body_ary[$i] . "\n"; unset($body_ary[$i]); @@ -354,14 +469,21 @@ function newMail () { $bodyTop .= ' ' . $orig_header->to[$x] . "\n"; } } + if (isset($forward_cc) && $forward_cc) { + $bodyTop .= _("Cc") . ': ' . $orig_header->cc[0] . "\n"; + if (count($orig_header->cc) > 1) { + for ($x = 1; $x < count($orig_header->cc); $x++) { + $bodyTop .= ' ' . $orig_header->cc[$x] . "\n"; + } + } + } $bodyTop .= "\n"; $body = $bodyTop . $body; } elseif ($reply_id) { - $orig_from = decodeHeader($orig_header->from, false); + $orig_from = decodeHeader($orig_header->getAddr_s('from' ), false); $body = getReplyCitation($orig_from) . $body; } - return; } @@ -400,14 +522,16 @@ function newMail () { } /* function newMail() */ -function getAttachments($message) { +function getAttachments($message, $session) { global $mailbox, $attachments, $attachment_dir, $imapConnection, - $ent_num, $forward_id, $draft_id, $username; + $ent_num, $forward_id, $draft_id, $username, $passed_id; if (isset($draft_id)) { $id = $draft_id; - } else { + } else if (isset($forward_id)) { $id = $forward_id; + } else { + $id = $passed_id; } if (!$message) { @@ -436,6 +560,8 @@ function getAttachments($message) { $newAttachment['remotefilename'] = $filename; $newAttachment['type'] = strtolower($message->header->type0 . '/' . $message->header->type1); + $newAttachment['id'] = strtolower($message->header->id); + $newAttachment['session'] = $session; /* Write Attachment to file */ $fp = fopen ("$hashed_attachment_dir/$localfilename", 'w'); @@ -448,13 +574,13 @@ function getAttachments($message) { } } else { for ($i = 0; $i < count($message->entities); $i++) { - getAttachments($message->entities[$i]); + getAttachments($message->entities[$i], $session); } } return; } -function showInputForm () { +function showInputForm ($session) { global $send_to, $send_to_cc, $reply_subj, $forward_subj, $body, $passed_body, $color, $use_signature, $signature, $prefix_sig, $editor_size, $attachments, $subject, $newmail, @@ -462,8 +588,9 @@ function showInputForm () { $from_htmladdr_search, $location_of_buttons, $attachment_dir, $username, $data_dir, $identity, $draft_id, $delete_draft, $mailprio, $default_use_mdn, $mdn_user_support, $compose_new_win, - $saved_draft, $mail_sent; + $saved_draft, $mail_sent, $sig_first, $edit_as_new; + $file_uploads = ini_get('file_uploads'); $subject = decodeHeader($subject, false); $reply_subj = decodeHeader($reply_subj, false); $forward_subj = decodeHeader($forward_subj, false); @@ -479,28 +606,40 @@ function showInputForm () { '// -->' . "\n\n"; } - echo "\n" . '
\n"; - if (isset($draft_id)) { + if (isset($draft_id) && !$edit_as_new) { echo '\n"; } if (isset($delete_draft)) { echo '\n"; } + if (isset($session)) { + echo '\n"; + } + if ($saved_draft == 'yes') { echo '
'. _("Draft Saved").'
'; } if ($mail_sent == 'yes') { echo '
'. _("Your Message has been sent").'
'; } - echo '' . "\n"; + echo html_tag( 'table', '', 'center', '', 'width="100%" cellspacing="0" border="0"' ) . "\n"; if ($compose_new_win == '1') { - echo ' '."\n"; + echo html_tag( 'table', '', 'center', $color[0], 'width="100%" border="0"' ) . + html_tag( 'tr', + html_tag( 'td' ) . + html_tag( 'td', + '', + 'right' ) + ); } if ($location_of_buttons == 'top') { showComposeButtonRow(); @@ -508,11 +647,9 @@ function showInputForm () { $idents = getPref($data_dir, $username, 'identities', 0); if ($idents > 1) { - echo ' ' . "\n" . - ' ' . "\n" . - ' ' . "\n"; - } - echo ' ' . "\n" . - ' ' . "\n" . - ' ' . "\n" . - ' ' . "\n" . - ' ' . "\n" . - ' ' . "\n" . - ' ' . "\n" . - ' ' . "\n" . - ' ' . "\n" . - ' ' . "\n" . + ' ' . "\n"; + } + echo html_tag( 'tr', + html_tag( 'td', "\n" . _("To:"), 'right', $color[4], 'width="10%"' ) . + html_tag( 'td', + '
' . "\n", + 'left', $color[4], 'width="90%"' ) + ) . "\n" . + html_tag( 'tr', + html_tag( 'td', "\n" . _("CC:"), 'right', $color[4], 'width="10%"' ) . + html_tag( 'td', + '
' . "\n", + 'left', $color[4], 'width="90%"' ) + ) . "\n" . + html_tag( 'tr', + html_tag( 'td', "\n" . _("BCC:"), 'right', $color[4], 'width="10%"' ) . + html_tag( 'td', + '
' . "\n", + 'left', $color[4], 'width="90%"' ) + ) . "\n"; + if ($reply_subj) { - $reply_subj = str_replace('"', "'", $reply_subj); + $reply_subj = str_replace('"', '\'', $reply_subj); $reply_subj = trim($reply_subj); if (substr(strtolower($reply_subj), 0, 3) != 're:') { $reply_subj = 'Re: ' . $reply_subj; } - echo ' '; + $subject = $reply_subj; } elseif ($forward_subj) { $forward_subj = trim($forward_subj); @@ -580,67 +711,93 @@ function showInputForm () { (substr(strtolower($forward_subj), 0, 6) != '[ fwd:')) { $forward_subj = '[Fwd: ' . $forward_subj . ']'; } - echo ' '; + $subject = $forward_subj; } else { - echo ' '; + $subject = $subject; } - echo '' . "\n\n"; + + echo html_tag( 'tr', + html_tag( 'td', "\n" . _("Subject:"), 'right', $color[4], 'width="10%"' ) . + html_tag( 'td', + '
' . "\n", + 'left', $color[4], 'width="90%"' ) + ) . "\n"; if ($location_of_buttons == 'between') { showComposeButtonRow(); } - echo ' ' . "\n" . - ' ' . "\n" . - ' ' . "\n"; + echo '
' . "\n" . + ' ' . "\n" . + ' ' . "\n"; if ($location_of_buttons == 'bottom') { showComposeButtonRow(); } else { - echo ' ' . "\n"; + echo html_tag( 'tr', + html_tag( 'td', '   ', 'left', '', 'colspan="2"' ) ."\n" + ); } /* This code is for attachments */ - echo ' ' . "\n" . - ' ' . "\n" . - ' ' . "\n" . - ' ' . "\n"; - - if (count($attachments)) { - $hashed_attachment_dir = getHashedDir($username, $attachment_dir); - echo ''; - } - /* End of attachment code */ - - echo '
' . - "\n" . - _("From:") . - ' ' . "\n" . + echo html_tag( 'tr' ) . "\n" . + html_tag( 'td', "\n" . _("From:"), 'right', $color[4], 'width="10%"' ) . + html_tag( 'td', '', 'left', $color[4], 'width="90%"' ) . '' . "\n" . - '
' . "\n" . - _("To:") . - ' ' . "\n" . - '
' . "\n" . - '
' . "\n" . - _("CC:") . - ' ' . "\n" . - '
' . "\n" . - '
' . "\n" . - _("BCC:") . - ' ' . "\n" . - '
' . "\n" . - '
' . "\n" . - _("Subject:") . - ' ' . "\n"; + '
' . "\n" . - '   
' . "\n" . - '
'; - echo '  
' . "\n" . - _("Attach:") . - ' ' . "\n" . - ' ' . "\n" . - '   ' . "\n" . - '
' . "\n" . - ' ' . - ''; - foreach ($attachments as $key => $info) { - $attached_file = "$hashed_attachment_dir/$info[localfilename]"; - echo '\n" . - $info['remotefilename'] . ' - ' . $info['type'] . ' (' . - show_readable_size(filesize($attached_file)) . ")
\n"; - } - - echo '\n" . - '
' . "\n"; + if ($file_uploads) { + echo html_tag( 'tr', + html_tag( 'td', "\n" . _("Attach:") ."\n", 'right', '', 'valign="middle"' ) ."\n" . + html_tag( 'td', "\n" . '' . + '  ' . "\n" , + 'left', '', 'valign="middle"' ) ."\n" + ); + + if (count($attachments)) { + $hashed_attachment_dir = getHashedDir($username, $attachment_dir); + echo html_tag( 'tr' ) . + html_tag( 'td', "\n" . ' ', 'right', $color[0] ) . + html_tag( 'td', '', 'left', $color[0] ); + foreach ($attachments as $key => $info) { + if ($info['session'] == $session) { + $attached_file = "$hashed_attachment_dir/$info[localfilename]"; + echo '\n" . + $info['remotefilename'] . ' - ' . $info['type'] . ' (' . + show_readable_size( filesize( $attached_file ) ) . ")
\n"; + } + } + + echo '\n" . + ''; + } + /* End of attachment code */ + } + if ($compose_new_win == '1') { + echo ''."\n"; + } + echo '' . "\n"; if ($reply_id) { echo ''. _("On read"). - ' '. _("On Delivery"); + ''. _("On read"). + ' '. _("On Delivery"); } } - echo " \n \n"; + echo " \n" . + html_tag( 'tr' ) . + html_tag( 'td', "\n", 'left' ) . + html_tag( 'td', '', 'left' ); + echo "\n \n"; if ($use_javascript_addr_book) { echo "