X-Git-Url: https://vcs.fsf.org/?p=squirrelmail.git;a=blobdiff_plain;f=src%2Fcompose.php;h=595001939758b5bb03399c981d9e3066082543f8;hp=5dcb5bb6c65cd7215bd2b2a010920555d771852a;hb=98d42122fd9b0346374c5b1468e1c0cbb3767b24;hpb=12a0ed017a33a4df4afa2cbc1944626cc5315be5 diff --git a/src/compose.php b/src/compose.php index 5dcb5bb6..59500193 100644 --- a/src/compose.php +++ b/src/compose.php @@ -22,6 +22,7 @@ define('SM_PATH','../'); /* SquirrelMail required files. */ require_once(SM_PATH . 'include/validate.php'); +require_once(SM_PATH . 'functions/global.php'); require_once(SM_PATH . 'functions/imap.php'); require_once(SM_PATH . 'functions/date.php'); require_once(SM_PATH . 'functions/mime.php'); @@ -31,17 +32,19 @@ require_once(SM_PATH . 'class/deliver/Deliver.class.php'); require_once(SM_PATH . 'functions/addressbook.php'); /* --------------------- Get globals ------------------------------------- */ -$username = $_SESSION['username']; -$onetimepad = $_SESSION['onetimepad']; -$base_uri = $_SESSION['base_uri']; -$delimiter = $_SESSION['delimiter']; +/** COOKIE VARS */ +sqgetGlobalVar('key', $key, SQ_COOKIE); -if (isset($_POST['return'])) { - $html_addr_search_done = 'Use Addresses'; -} -if ( isset($_SESSION['composesession']) ) { - $composesession = $_SESSION['composesession']; -} +/** SESSION VARS */ +sqgetGlobalVar('username', $username, SQ_SESSION); +sqgetGlobalVar('onetimepad',$onetimepad, SQ_SESSION); +sqgetGlobalVar('base_uri', $base_uri, SQ_SESSION); +sqgetGlobalVar('delimiter', $delimiter, SQ_SESSION); + +sqgetGlobalVar('composesession', $composesession, SQ_SESSION); +sqgetGlobalVar('compose_messages', $compose_messages, SQ_SESSION); + +/** SESSION/POST/GET VARS */ sqgetGlobalVar('action',$action); sqgetGlobalVar('session',$session); sqgetGlobalVar('mailbox',$mailbox); @@ -60,46 +63,32 @@ sqgetGlobalVar('passed_id',$passed_id); sqgetGlobalVar('passed_ent_id',$passed_ent_id); sqgetGlobalVar('send',$send); -if ( isset($_POST['sigappend']) ) { - $sigappend = $_POST['sigappend']; -} -/* From addressbook search */ -if ( isset($_POST['from_htmladdr_search']) ) { - $from_htmladdr_search = $_POST['from_htmladdr_search']; -} -if ( isset($_POST['addr_search_done']) ) { - $html_addr_search_done = $_POST['addr_search_done']; -} -if ( isset($_POST['send_to_search']) ) { - $send_to_search = &$_POST['send_to_search']; -} - -/* Attachments */ sqgetGlobalVar('attach',$attach); -if ( isset($_POST['do_delete']) ) { - $do_delete = $_POST['do_delete']; -} -if ( isset($_POST['delete']) ) { - $delete = &$_POST['delete']; -} -if ( isset($_SESSION['compose_messages']) ) { - $compose_messages = &$_SESSION['compose_messages']; -} - - -/* Forward message as attachment */ -if ( isset($_GET['attachedmessages']) ) { - $attachedmessages = $_GET['attachedmessages']; -} -/* Drafts */ sqgetGlobalVar('draft',$draft); sqgetGlobalVar('draft_id',$draft_id); sqgetGlobalVar('ent_num',$ent_num); sqgetGlobalVar('saved_draft',$saved_draft); sqgetGlobalVar('delete_draft',$delete_draft); -$key = $_COOKIE['key']; + +/** POST VARS */ +sqgetGlobalVar('sigappend', $sigappend, SQ_POST); +sqgetGlobalVar('from_htmladdr_search', $from_htmladdr_search, SQ_POST); +sqgetGlobalVar('addr_search_done', $html_addr_search_done, SQ_POST); +sqgetGlobalVar('send_to_search', $send_to_search, SQ_POST); +sqgetGlobalVar('do_delete', $do_delete, SQ_POST); +sqgetGlobalVar('delete', $delete, SQ_POST); +sqgetGlobalVar('restoremessages', $restoremessages, SQ_POST); +if ( sqgetGlobalVar('return', $temp, SQ_POST) ) { + $html_addr_search_done = 'Use Addresses'; +} + +/** GET VARS */ +sqgetGlobalVar('attachedmessages', $attachedmessages, SQ_GET); + +/* Location (For HTTP 1.1 Header("Location: ...") redirects) */ +$location = get_location(); /* --------------------- Specific Functions ------------------------------ */ @@ -143,12 +132,13 @@ function replyAllString($header) { $url_replytoallcc = ''; foreach( $url_replytoall_ar as $email => $personal) { if ($personal) { - $url_replytoallcc .= ", \"$personal\" <$email>"; + $url_replytoallcc .= ", $personal <$email>"; } else { $url_replytoallcc .= ', '. $email; } } $url_replytoallcc = substr($url_replytoallcc,2); + return $url_replytoallcc; } @@ -209,7 +199,7 @@ function getforwardHeader($orig_header) { $subject = decodeHeader($orig_header->subject,false,false); $subject = str_replace(' ',' ',$subject); $bodyTop = str_pad(' '._("Original Message").' ',$editor_size -2,'-',STR_PAD_BOTH) . - "\n\n". $display[_("Subject")] . $subject . "\n" . + "\n". $display[_("Subject")] . $subject . "\n" . $display[_("From")] . $from . "\n" . $display[_("Date")] . getLongDateString( $orig_header->date ). "\n" . $display[_("To")] . $to . "\n"; @@ -229,7 +219,7 @@ function getforwardHeader($orig_header) { * vars. */ if (sqsession_is_registered('session_expired_post')) { - $session_expired_post = $_SESSION['session_expired_post']; + sqgetGlobalVar('session_expired_post', $session_expired_post, SQ_SESSION); /* * extra check for username so we don't display previous post data from * another user during this session. @@ -313,17 +303,17 @@ if ($draft) { $draft_message = _("Draft Email Saved"); /* If this is a resumed draft, then delete the original */ if(isset($delete_draft)) { - Header("Location: delete_message.php?mailbox=" . urlencode($draft_folder) . + Header("Location: $location/delete_message.php?mailbox=" . urlencode($draft_folder) . "&message=$delete_draft&sort=$sort&startMessage=1&saved_draft=yes"); exit(); } else { if ($compose_new_win == '1') { - Header("Location: compose.php?saved_draft=yes&session=$composesession"); + Header("Location: $location/compose.php?saved_draft=yes&session=$composesession"); exit(); } else { - Header("Location: right_main.php?mailbox=$draft_folder&sort=$sort". + Header("Location: $location/right_main.php?mailbox=$draft_folder&sort=$sort". "&startMessage=1¬e=".urlencode($draft_message)); exit(); } @@ -374,10 +364,12 @@ if ($send) { } else { sqWordWrap($line, $editor_size); $newBody .= $line . "\n"; + } + } $body = $newBody; - do_hook('compose_send'); + $composeMessage=$compose_messages[$session]; $Result = deliverMessage($composeMessage); @@ -387,16 +379,16 @@ if ($send) { } unset($compose_messages[$session]); if ( isset($delete_draft)) { - Header("Location: delete_message.php?mailbox=" . urlencode( $draft_folder ). + Header("Location: $location/delete_message.php?mailbox=" . urlencode( $draft_folder ). "&message=$delete_draft&sort=$sort&startMessage=1&mail_sent=yes"); exit(); } if ($compose_new_win == '1') { - Header("Location: compose.php?mail_sent=yes"); + Header("Location: $location/compose.php?mail_sent=yes"); } else { - Header("Location: right_main.php?mailbox=$urlMailbox&sort=$sort". + Header("Location: $location/right_main.php?mailbox=$urlMailbox&sort=$sort". "&startMessage=1"); } } else { @@ -550,6 +542,9 @@ elseif (isset($sigappend)) { if (isset($send_to_bcc)) { $values['send_to_bcc'] = $send_to_bcc; } + if (isset($subject)) { + $values['subject'] = $subject; + } showInputForm($session, $values); } @@ -564,6 +559,7 @@ function newMail ($mailbox='', $passed_id='', $passed_ent_id='', $action='', $se $use_signature, $composesession, $data_dir, $username, $username, $key, $imapServerAddress, $imapPort, $compose_messages, $composeMessage; + global $languages, $squirrelmail_language; $send_to = $send_to_cc = $send_to_bcc = $subject = $identity = ''; $mailprio = 3; @@ -614,6 +610,12 @@ function newMail ($mailbox='', $passed_id='', $passed_ent_id='', $action='', $se $bodypart = str_replace(array(' ','>','<'),array(' ','<','>'),$bodypart); $bodypart = strip_tags($bodypart); } + if (isset($languages[$squirrelmail_language]['XTRA_CODE']) && + function_exists($languages[$squirrelmail_language]['XTRA_CODE'])) { + if (mb_detect_encoding($bodypart) != 'ASCII') { + $bodypart = $languages[$squirrelmail_language]['XTRA_CODE']('decode', $bodypart); + } + } $body .= $bodypart; } if ($default_use_priority) { @@ -658,10 +660,14 @@ function newMail ($mailbox='', $passed_id='', $passed_ent_id='', $action='', $se switch ($action) { case ('draft'): $use_signature = FALSE; + $composeMessage->rfc822_header = $orig_header; $send_to = decodeHeader($orig_header->getAddr_s('to'),false,true); $send_to_cc = decodeHeader($orig_header->getAddr_s('cc'),false,true); $send_to_bcc = decodeHeader($orig_header->getAddr_s('bcc'),false,true); $subject = decodeHeader($orig_header->subject,false,true); +// /* remember the references and in-reply-to headers in case of an reply */ +// $composeMessage->rfc822_header->more_headers['References'] = $orig_header->references; +// $composeMessage->rfc822_header->more_headers['In-Reply-To'] = $orig_header->in_reply_to; $body_ary = explode("\n", $body); $cnt = count($body_ary) ; $body = ''; @@ -688,7 +694,7 @@ function newMail ($mailbox='', $passed_id='', $passed_ent_id='', $action='', $se case ('forward'): $send_to = ''; $subject = decodeHeader($orig_header->subject,false,true); - if ((substr(strtolower($subject), 0, 4) != 'fwd:') && + if ((substr(strtolower($subject), 0, 4) != 'fwd:') && (substr(strtolower($subject), 0, 5) != '[fwd:') && (substr(strtolower($subject), 0, 6) != '[ fwd:')) { $subject = '[Fwd: ' . $subject . ']'; @@ -829,7 +835,7 @@ function getMessage_RFC822_Attachment($message, $composeMessage, $passed_id, TRUE, $response, $readmessage, $uid_support); $message = $message->parent; } - if ($response = 'OK') { + if ($response == 'OK') { $subject = encodeHeader($message->rfc822_header->subject); array_shift($body_a); $body = implode('', $body_a) . "\r\n"; @@ -867,6 +873,10 @@ function showInputForm ($session, $values=false) { $mailprio = $values['mailprio']; $body = $values['body']; $identity = (int) $values['identity']; + } else { + $send_to = decodeHeader($send_to); + $send_to_cc = decodeHeader($send_to_cc); + $send_to_bcc = decodeHeader($send_to_bcc); } if ($use_javascript_addr_book) { @@ -915,73 +925,86 @@ function showInputForm ($session, $values=false) { showComposeButtonRow(); } + /* display select list for identities */ $idents = getPref($data_dir, $username, 'identities', 0); if ($idents > 1) { - echo ' ' . "\n" . - html_tag( 'td', '', 'right', $color[4], 'WIDTH="10%"' ) . - _("From:") . '' . "\n" . - html_tag( 'td', '', 'left', $color[4], 'WIDTH="90%"' ) . - ' ' . "\n" . + ' '; for ($i = 1; $i < $idents; $i ++) { + $fn = getPref($data_dir, $username, 'full_name' . $i); + $em = getPref($data_dir, $username, 'email_address' . $i); + echo ''; } echo '' . "\n" . - ' ' . "\n" . - ' ' . "\n"; + ' ' . "\n" . + ' ' . "\n"; } - echo ' ' . "\n" . - html_tag( 'td', '', 'right', $color[4], 'WIDTH="10%"' ) . + echo ' ' . "\n" . + html_tag( 'td', '', 'right', $color[4], 'width="10%"' ) . _("To:") . '' . "\n" . - html_tag( 'td', '', 'left', $color[4], 'WIDTH="90%"' ) . - '
' . "\n" . - ' ' . "\n" . - ' ' . "\n" . - ' ' . "\n" . + html_tag( 'td', '', 'left', $color[4], 'width="90%"' ) . + '
' . "\n" . + ' ' . "\n" . + ' ' . "\n" . + ' ' . "\n" . html_tag( 'td', '', 'right', $color[4] ) . - _("CC:") . '' . "\n" . + _("CC:") . '' . "\n" . html_tag( 'td', '', 'left', $color[4] ) . - '
' . "\n" . - ' ' . "\n" . - ' ' . "\n" . - ' ' . "\n" . + '
' . "\n" . + ' ' . "\n" . + ' ' . "\n" . + ' ' . "\n" . html_tag( 'td', '', 'right', $color[4] ) . - _("BCC:") . '' . "\n" . + _("BCC:") . '' . "\n" . html_tag( 'td', '', 'left', $color[4] ) . - '
' . "\n" . - ' ' . "\n" . - ' ' . "\n" . - ' ' . "\n" . + '
' . "\n" . + ' ' . "\n" . + ' ' . "\n" . + ' ' . "\n" . html_tag( 'td', '', 'right', $color[4] ) . - _("Subject:") . '' . "\n" . + _("Subject:") . '' . "\n" . html_tag( 'td', '', 'left', $color[4] ) . "\n"; - echo ' ' . "\n" . - ' ' . "\n" . - ' ' . "\n\n"; + echo ' ' . "\n" . + ' ' . "\n" . + ' ' . "\n\n"; if ($location_of_buttons == 'between') { showComposeButtonRow(); } + /* why this distinction? */ if ($compose_new_win == '1') { echo ' ' . "\n" . ' ' . "\n" . @@ -994,6 +1017,7 @@ function showInputForm ($session, $values=false) { '   
' . "\n" . - ' ' . "\n" . - ' ' . "\n"; + echo '
' . "\n" . + ' ' . "\n" . + ' ' . "\n"; if ($location_of_buttons == 'bottom') { showComposeButtonRow(); } else { - echo ' ' . "\n" . - html_tag( 'td', '', 'right', '', 'COLSPAN=2' ) . "\n" . - ' ' . "\n" . - '     

' . "\n" . - ' ' . "\n" . - ' ' . "\n"; + echo ' ' . "\n" . + html_tag( 'td', '', 'right', '', 'colspan="2"' ) . "\n" . + ' ' . "\n" . + '     

' . "\n" . + ' ' . "\n" . + ' ' . "\n"; } /* This code is for attachments */ if ((bool) ini_get('file_uploads')) { - echo ' ' . "\n" . - ' ' . "\n" . + + /* Calculate the max size for an uploaded file. + * This is advisory for the user because we can't actually prevent + * people to upload too large files. */ + $sizes = array(); + /* php.ini vars which influence the max for uploads */ + $configvars = array('post_max_size', 'memory_limit', 'upload_max_filesize'); + foreach($configvars as $var) { + /* skip 0 or empty values */ + if( $size = getByteSize(ini_get($var)) ) { + $sizes[] = $size; + } + } + + if(count($sizes) > 0) { + $maxsize = '(max. ' . show_readable_size( min( $sizes ) ) . ')'; + } else { + $maxsize = ''; + } + + echo ' ' . "\n" . + ' ' . "\n" . ' ' . "\n" . - ' ' . "\n" . - ' ' . "\n" . + '
' . "\n" . + '
' . "\n" . ' ' . "\n" . - ' ' . "\n" . - html_tag( 'td', '', 'right', '', 'VALIGN=MIDDLE' ) . - _("Attach:") . '' . "\n" . - html_tag( 'td', '', 'left', '', 'VALIGN=MIDDLE' ) . - ' ' . "\n" . + ' ' . "\n" . + html_tag( 'td', '', 'right', '', 'valign="middle"' ) . + _("Attach:") . '' . "\n" . + html_tag( 'td', '', 'left', '', 'valign="middle"' ) . + ' ' . "\n" . '   ' . "\n" . - ' ' . "\n" . - ' ' . "\n"; + $maxsize . + ' ' . "\n" . + ' ' . "\n"; $s_a = array(); @@ -1107,9 +1152,10 @@ function showInputForm ($session, $values=false) { store the complete ComposeMessages array in a hidden input value so we can restore them in case of a session timeout. */ + sqgetGlobalVar('QUERY_STRING', $queryString, SQ_SERVER); echo '\n"; echo '\n"; - echo '\n"; + echo '\n"; echo ''; if (!(bool) ini_get('file_uploads')) { /* File uploads are off, so we didn't show that part of the form. @@ -1118,7 +1164,6 @@ function showInputForm ($session, $values=false) { echo "to this message. Please see your system administrator for details.\r\n"; } - do_hook('compose_bottom'); echo '' . "\n"; } @@ -1233,6 +1278,7 @@ function saveAttachedFiles($session) { $name = $_FILES['attachfile']['name']; $message->initAttachment($type, $name, $full_localfilename); $compose_messages[$session] = $message; + sqsession_register($compose_messages , 'compose_messages'); } function ClearAttachments($composeMessage) { @@ -1247,7 +1293,35 @@ function ClearAttachments($composeMessage) { } } +/* parse values like 8M and 2k into bytes */ +function getByteSize($ini_size) { + + if(!$ini_size) { + return FALSE; + } + + $ini_size = trim($ini_size); + + // if there's some kind of letter at the end of the string we need to multiply. + if(!is_numeric(substr($ini_size, -1))) { + + switch(strtoupper(substr($ini_size, -1))) { + case 'G': + $bytesize = 1073741824; + break; + case 'M': + $bytesize = 1048576; + break; + case 'K': + $bytesize = 1024; + break; + } + return ($bytesize * (int)substr($ini_size, 0, -1)); + } + + return $ini_size; +} /* temporary function to make use of the deliver class. @@ -1260,9 +1334,18 @@ function deliverMessage($composeMessage, $draft=false) { global $send_to, $send_to_cc, $send_to_bcc, $mailprio, $subject, $body, $username, $popuser, $usernamedata, $identity, $data_dir, $request_mdn, $request_dr, $default_charset, $color, $useSendmail, - $domain, $action; + $domain, $action, $default_move_to_sent, $move_to_sent; global $imapServerAddress, $imapPort, $sent_folder, $key; + /* some browsers replace by nonbreaking spaces   + by replacing them back to spaces addressparsing works */ + /* FIXME: How to handle in case of other charsets where "\240" + is not a non breaking space ??? */ + + $send_to = str_replace("\240",' ',$send_to); + $send_to_cc = str_replace("\240",' ',$send_to_cc); + $send_to_bcc = str_replace("\240",' ',$send_to_bcc); + $rfc822_header = $composeMessage->rfc822_header; $abook = addressbook_init(false, true); @@ -1301,7 +1384,6 @@ function deliverMessage($composeMessage, $draft=false) { } if (!$from_mail) { $from_mail = "$popuser@$domain"; - $full_name = ''; } $rfc822_header->from = $rfc822_header->parseAddress($from_mail,true); if ($full_name) { @@ -1346,14 +1428,22 @@ function deliverMessage($composeMessage, $draft=false) { array_unshift($composeMessage->entities, $message_body); $content_type = new ContentType('multipart/mixed'); } else { - $content_type = new ContentType('text/plain'); - } - if ($default_charset) { - $content_type->properties['charset']=$default_charset; - } - + $content_type = new ContentType('text/plain'); + if ($special_encoding) { + $rfc822_header->encoding = $special_encoding; + } else { + $rfc822_header->encoding = '8bit'; + } + if ($default_charset) { + $content_type->properties['charset']=$default_charset; + } + } $rfc822_header->content_type = $content_type; $composeMessage->rfc822_header = $rfc822_header; + + /* Here you can modify the message structure just before we hand + it over to deliver */ + do_hook('compose_send'); if (!$useSendmail && !$draft) { require_once(SM_PATH . 'class/deliver/Deliver_SMTP.class.php'); @@ -1410,9 +1500,10 @@ function deliverMessage($composeMessage, $draft=false) { plain_error_message($msg, $color); } else { unset ($deliver); - $imap_stream = sqimap_login($username, $key, $imapServerAddress, - $imapPort, 0); - if (sqimap_mailbox_exists ($imap_stream, $sent_folder)) { + $move_to_sent = getPref($data_dir,$username,'move_to_sent'); + $imap_stream = sqimap_login($username, $key, $imapServerAddress, $imapPort, 0); + if (sqimap_mailbox_exists ($imap_stream, $sent_folder) && ((isset($move_to_sent) && $move_to_sent) || + (isset($default_move_to_sent) && $default_move_to_sent))) { sqimap_append ($imap_stream, $sent_folder, $length); require_once(SM_PATH . 'class/deliver/Deliver_IMAP.class.php'); $imap_deliver = new Deliver_IMAP();