Add preview pane to advanced default template. This serves as an example of how...
[squirrelmail.git] / src / compose.php
index 8bc437c8e81e1a561774e9d49f76c95ef561c3cd..f42426a47b833cb3de64496709bbc9e5bb56fc16 100644 (file)
@@ -10,7 +10,7 @@
  *    - Send mail
  *    - Save As Draft
  *
- * @copyright © 1999-2006 The SquirrelMail Project Team
+ * @copyright © 1999-2007 The SquirrelMail Project Team
  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  * @version $Id$
  * @package squirrelmail
@@ -26,6 +26,7 @@ require_once(SM_PATH . 'functions/imap_general.php');
 require_once(SM_PATH . 'functions/imap_messages.php');
 require_once(SM_PATH . 'functions/date.php');
 require_once(SM_PATH . 'functions/mime.php');
+require_once(SM_PATH . 'functions/compose.php');
 require_once(SM_PATH . 'class/deliver/Deliver.class.php');
 require_once(SM_PATH . 'functions/addressbook.php');
 require_once(SM_PATH . 'functions/forms.php');
@@ -69,7 +70,11 @@ sqgetGlobalVar('draft',$draft);
 sqgetGlobalVar('draft_id',$draft_id);
 sqgetGlobalVar('ent_num',$ent_num);
 sqgetGlobalVar('saved_draft',$saved_draft);
-sqgetGlobalVar('delete_draft',$delete_draft);
+
+if ( sqgetGlobalVar('delete_draft',$delete_draft) ) {
+    $delete_draft = (int)$delete_draft;
+}
+
 if ( sqgetGlobalVar('startMessage',$startMessage) ) {
     $startMessage = (int)$startMessage;
 } else {
@@ -110,6 +115,25 @@ if ( !sqgetGlobalVar('smaction',$action) )
     if ( sqgetGlobalVar('smaction_edit_new',$tmp) )   $action = 'edit_as_new';
 }
 
+/**
+ * Here we decode the data passed in from mailto.php.
+ */
+if ( sqgetGlobalVar('mailtodata', $mailtodata, SQ_GET) ) {
+    $trtable = array('to'       => 'send_to',
+                 'cc'           => 'send_to_cc',
+                 'bcc'          => 'send_to_bcc',
+                 'body'         => 'body',
+                 'subject'      => 'subject');
+    $mtdata = unserialize($mailtodata);
+
+    foreach ($trtable as $f => $t) {
+        if ( !empty($mtdata[$f]) ) {
+            $$t = $mtdata[$f];
+        }
+    }
+    unset($mailtodata,$mtdata, $trtable);
+}
+
 /* Location (For HTTP 1.1 Header("Location: ...") redirects) */
 $location = get_location();
 /* Identities (fetch only once) */
@@ -289,7 +313,7 @@ if (sqsession_is_registered('session_expired_post')) {
         sqsession_unregister('session_expired_post');
         session_write_close();
     } else {
-        // these are the vars that we can set from the expired composed session   
+        // these are the vars that we can set from the expired composed session
         $compo_var_list = array ( 'send_to', 'send_to_cc','body','startMessage',
             'passed_body','use_signature','signature','attachments','subject','newmail',
             'send_to_bcc', 'passed_id', 'mailbox', 'from_htmladdr_search', 'identity',
@@ -333,6 +357,8 @@ if (sqsession_is_registered('session_expired_post')) {
 if (!isset($composesession)) {
     $composesession = 0;
     sqsession_register(0,'composesession');
+} else {
+    $composesession = (int)$composesession;
 }
 
 if (!isset($session) || (isset($newmessage) && $newmessage)) {
@@ -387,7 +413,7 @@ if ($draft) {
             }
             sqimap_logout($imap_stream);
         }
-        
+
         $oErrorHandler->saveDelayedErrors();
         session_write_close();
 
@@ -466,7 +492,10 @@ if ($send) {
 
         $Result = deliverMessage($composeMessage);
 
-        do_hook('compose_send_after', $Result, $composeMessage);
+        // NOTE: this hook changed in 1.5.2 from sending $Result and
+        //       $composeMessage as args #2 and #3 to being in an array
+        //       under arg #2
+        do_hook('compose_send_after', $temp=array(&$Result, &$composeMessage));
         if (! $Result) {
             showInputForm($session);
             exit();
@@ -737,7 +766,7 @@ function newMail ($mailbox='', $passed_id='', $passed_ent_id='', $action='', $se
             $type1 = $msg->type1;
             $unencoded_bodypart = mime_fetch_body($imapConnection, $passed_id, $ent);
             $body_part_entity = $message->getEntity($ent);
-            $bodypart = decodeBody($unencoded_bodypart, 
+            $bodypart = decodeBody($unencoded_bodypart,
                     $body_part_entity->header->encoding);
             if ($type1 == 'html') {
                 $bodypart = str_replace("\n", ' ', $bodypart);
@@ -826,11 +855,11 @@ function newMail ($mailbox='', $passed_id='', $passed_ent_id='', $action='', $se
                     }
                 }
                 $subject = decodeHeader($orig_header->subject,false,false,true);
-                
+
                 // Remember the receipt settings
                 $request_mdn = $mdn_user_support && !empty($orig_header->dnt) ? '1' : '0';
                 $request_dr = $mdn_user_support && !empty($orig_header->drnt) ? '1' : '0';
-                
+
                 /* 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;
@@ -946,8 +975,8 @@ function newMail ($mailbox='', $passed_id='', $passed_ent_id='', $action='', $se
  * @return object
  */
 function getAttachments($message, &$composeMessage, $passed_id, $entities, $imapConnection) {
-    global $attachment_dir, $username, $data_dir, $squirrelmail_language, $languages;
-    $hashed_attachment_dir = getHashedDir($username, $attachment_dir);
+    global $squirrelmail_language, $languages;
+
     if (!count($message->entities) ||
             ($message->type0 == 'message' && $message->type1 == 'rfc822')) {
         if ( !in_array($message->entity_id, $entities) && $message->entity_id) {
@@ -975,19 +1004,14 @@ function getAttachments($message, &$composeMessage, $passed_id, $entities, $imap
                     function_exists($languages[$squirrelmail_language]['XTRA_CODE'] . '_encode')) {
                 $filename =  call_user_func($languages[$squirrelmail_language]['XTRA_CODE'] . '_encode', $filename);
             }
-            $localfilename = GenerateRandomString(32, '', 7);
-            $full_localfilename = "$hashed_attachment_dir/$localfilename";
-            while (file_exists($full_localfilename)) {
-                $localfilename = GenerateRandomString(32, '', 7);
-                $full_localfilename = "$hashed_attachment_dir/$localfilename";
-            }
-            $message->att_local_name = $full_localfilename;
+            $localfilename = sq_get_attach_tempfile();
+            $message->att_local_name = $localfilename;
 
             $composeMessage->initAttachment($message->type0.'/'.$message->type1,$filename,
-                    $full_localfilename);
+                    $localfilename);
 
             /* Write Attachment to file */
-            $fp = fopen ("$hashed_attachment_dir/$localfilename", 'wb');
+            $fp = fopen ($localfilename, 'wb');
             mime_print_body_lines ($imapConnection, $passed_id, $message->entity_id, $message->header->encoding, $fp);
             fclose ($fp);
         }
@@ -1001,8 +1025,6 @@ function getAttachments($message, &$composeMessage, $passed_id, $entities, $imap
 
 function getMessage_RFC822_Attachment($message, $composeMessage, $passed_id,
         $passed_ent_id='', $imapConnection) {
-    global $attachment_dir, $username, $data_dir;
-    $hashed_attachment_dir = getHashedDir($username, $attachment_dir);
     if (!$passed_ent_id) {
         $body_a = sqimap_run_command($imapConnection,
                 'FETCH '.$passed_id.' RFC822',
@@ -1020,14 +1042,12 @@ function getMessage_RFC822_Attachment($message, $composeMessage, $passed_id,
         array_pop($body_a);
         $body = implode('', $body_a) . "\r\n";
 
-        $localfilename = GenerateRandomString(32, 'FILE', 7);
-        $full_localfilename = "$hashed_attachment_dir/$localfilename";
-
-        $fp = fopen($full_localfilename, 'w');
+        $localfilename = sq_get_attach_tempfile();
+        $fp = fopen($localfilename, 'wb');
         fwrite ($fp, $body);
         fclose($fp);
         $composeMessage->initAttachment('message/rfc822',$subject.'.msg',
-                $full_localfilename);
+                $localfilename);
     }
     return $composeMessage;
 }
@@ -1082,7 +1102,8 @@ function showInputForm ($session, $values=false) {
         'enctype="multipart/form-data"';
 
     $compose_onsubmit = array();
-    do_hook('compose_form');
+    global $null;
+    do_hook('compose_form', $null);
 
     // Plugins that use compose_form hook can add an array entry
     // to the globally scoped $compose_onsubmit; we add them up
@@ -1140,7 +1161,7 @@ function showInputForm ($session, $values=false) {
     if ($compose_new_win == '1') {
         $oTemplate->display('compose_newwin_close.tpl');
     }
-    
+
     if ($location_of_buttons == 'top') {
         showComposeButtonRow();
     }
@@ -1152,16 +1173,16 @@ function showInputForm ($session, $values=false) {
             $identities[$id] = $data['full_name'].' <'.$data['email_address'].'>';
         }
     }
-    
+
     $oTemplate->assign('identities', $identities);
     $oTemplate->assign('identity_def', $identity);
     $oTemplate->assign('input_onfocus', 'onfocus="'.join(' ', $onfocus_array).'"');
-    
+
     $oTemplate->assign('to', htmlspecialchars($send_to));
     $oTemplate->assign('cc', htmlspecialchars($send_to_cc));
     $oTemplate->assign('bcc', htmlspecialchars($send_to_bcc));
     $oTemplate->assign('subject', htmlspecialchars($subject));
-        
+
     $oTemplate->display('compose_header.tpl');
 
     if ($location_of_buttons == 'between') {
@@ -1203,9 +1224,9 @@ function showInputForm ($session, $values=false) {
     $oTemplate->assign('input_onfocus', 'onfocus="'.join(' ', $onfocus_array).'"');
     $oTemplate->assign('body', $body_str);
     $oTemplate->assign('show_bottom_send', $location_of_buttons!='bottom');
-    
+
     $oTemplate->display ('compose_body.tpl');
-    
+
     if ($location_of_buttons == 'bottom') {
         showComposeButtonRow();
     }
@@ -1236,7 +1257,7 @@ function showInputForm ($session, $values=false) {
                     $attached_filename = decodeHeader($attachment->mime_header->getParameter('name'));
                     $type = $attachment->mime_header->type0.'/'.
                         $attachment->mime_header->type1;
-    
+
                     $a = array();
                     $a['Key'] = $key;
                     $a['FileName'] = $attached_filename;
@@ -1246,11 +1267,11 @@ function showInputForm ($session, $values=false) {
                 }
             }
         }
-    
+
         $max = min($sizes);
         $oTemplate->assign('max_file_size', empty($max) ? -1 : $max);
         $oTemplate->assign('attachments', $attach);
-        
+
         $oTemplate->display('compose_attachments.tpl');
     } // End of file_uploads if-block
     /* End of attachment code */
@@ -1263,7 +1284,7 @@ function showInputForm ($session, $values=false) {
        so we can restore them in case of a session timeout.
      */
     sqgetGlobalVar('QUERY_STRING', $queryString, SQ_SERVER);
-    echo addHidden('restoremessages', serialize($compose_messages)).
+    echo addHidden('restoremessages', urlencode(serialize($compose_messages))).
         addHidden('composesession', $composesession).
         addHidden('querystring', $queryString).
         "</form>\n";
@@ -1275,12 +1296,12 @@ function showInputForm ($session, $values=false) {
             . "</p>\r\n";
     }
 
-    do_hook('compose_bottom');
+    do_hook('compose_bottom', $null);
 
     if ($compose_new_win=='1') {
         $oTemplate->display('compose_newwin_close.tpl');
     }
-    
+
     $oErrorHandler->setDelayedErrors(false);
     $oTemplate->display('footer.tpl');
 }
@@ -1293,15 +1314,15 @@ function showComposeButtonRow() {
         $data_dir, $username;
 
     global $oTemplate, $buffer_hook;
-    
-    if ($default_use_priority) {    
+
+    if ($default_use_priority) {
         $priorities = array('1'=>_("High"), '3'=>_("Normal"), '5'=>_("Low"));
         $priority = isset($mailprio) ? $mailprio : 3;
     } else {
         $priorities = array();
         $priority = NULL;
     }
-    
+
     $mdn_user_support=getPref($data_dir, $username, 'mdn_user_support',$default_use_mdn);
 
     if ($use_javascript_addr_book) {
@@ -1320,11 +1341,11 @@ function showComposeButtonRow() {
     $oTemplate->assign('allow_priority', $default_use_priority==1);
     $oTemplate->assign('priority_list', $priorities);
     $oTemplate->assign('current_priority', $priority);
-    
+
     $oTemplate->assign('notifications_enabled', $mdn_user_support==1);
     $oTemplate->assign('read_receipt', $request_mdn=='1');
     $oTemplate->assign('delivery_receipt', $request_dr=='1');
-    
+
     $oTemplate->assign('drafts_enabled', $save_as_draft);
     $oTemplate->assign('address_book_button', $addr_book);
 
@@ -1352,33 +1373,26 @@ function checkInput ($show) {
 
 /* True if FAILURE */
 function saveAttachedFiles($session) {
-    global $_FILES, $attachment_dir, $username,
-        $data_dir, $compose_messages;
+    global $compose_messages;
 
     /* get out of here if no file was attached at all */
     if (! is_uploaded_file($_FILES['attachfile']['tmp_name']) ) {
         return true;
     }
 
-    $hashed_attachment_dir = getHashedDir($username, $attachment_dir);
-    $localfilename = GenerateRandomString(32, '', 7);
-    $full_localfilename = "$hashed_attachment_dir/$localfilename";
-    while (file_exists($full_localfilename)) {
-        $localfilename = GenerateRandomString(32, '', 7);
-        $full_localfilename = "$hashed_attachment_dir/$localfilename";
-    }
+    $localfilename = sq_get_attach_tempfile();
 
     // m_u_f works better with restricted PHP installs (safe_mode, open_basedir),
     // if that doesn't work, try a simple rename.
-    if (!@move_uploaded_file($_FILES['attachfile']['tmp_name'],$full_localfilename)) {
-        if (!@rename($_FILES['attachfile']['tmp_name'], $full_localfilename)) {
+    if (!@move_uploaded_file($_FILES['attachfile']['tmp_name'],$localfilename)) {
+        if (!@rename($_FILES['attachfile']['tmp_name'], $localfilename)) {
             return true;
         }
     }
     $message = $compose_messages[$session];
     $type = strtolower($_FILES['attachfile']['type']);
     $name = $_FILES['attachfile']['name'];
-    $message->initAttachment($type, $name, $full_localfilename);
+    $message->initAttachment($type, $name, $localfilename);
     $compose_messages[$session] = $message;
     sqsession_register($compose_messages , 'compose_messages');
 }
@@ -1482,7 +1496,7 @@ function deliverMessage($composeMessage, $draft=false) {
     } elseif (isset($rfc822_header->dnt)) {
         unset($rfc822_header->dnt);
     }
-    
+
     /* Receipt: On Delivery */
     if (isset($request_dr) && $request_dr) {
         $rfc822_header->more_headers['Return-Receipt-To'] = $from_mail;
@@ -1523,14 +1537,11 @@ function deliverMessage($composeMessage, $draft=false) {
 
     $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 */
-    $hookReturn = do_hook('compose_send', $composeMessage);
-    /* Get any changes made by plugins to $composeMessage. */
-    if ( is_object($hookReturn[1]) ) {
-        $composeMessage = $hookReturn[1];
-    }
+       it over to deliver; plugin authors note that $composeMessage
+       is sent and modified by reference since 1.5.2 */
+    do_hook('compose_send', $composeMessage);
 
     if (!$useSendmail && !$draft) {
         require_once(SM_PATH . 'class/deliver/Deliver_SMTP.class.php');
@@ -1583,7 +1594,8 @@ function deliverMessage($composeMessage, $draft=false) {
     }
     if (!$success) {
         // $deliver->dlv_server_msg is not always server's reply
-        $msg  = $deliver->dlv_msg;
+        $msg = _("Message not sent.") . "<br />\n" .
+            $deliver->dlv_msg;
         if (!empty($deliver->dlv_server_msg)) {
             // add 'server replied' part only when it is not empty.
             // Delivery error can be generated by delivery class itself
@@ -1659,7 +1671,7 @@ function deliverMessage($composeMessage, $draft=false) {
             case 'forward':
             case 'forward_as_attachment':
                 // check if we are allowed to set the $Forwarded flag (RFC 4550 paragraph 2.8)
-                if (in_array('$forwarded',$aMailbox['PERMANENTFLAGS'], true) || 
+                if (in_array('$forwarded',$aMailbox['PERMANENTFLAGS'], true) ||
                     in_array('\\*',$aMailbox['PERMANENTFLAGS'])) {
 
                     $aUpdatedMsgs = sqimap_toggle_flag($imap_stream, array($passed_id), '$Forwarded', true, false);
@@ -1685,4 +1697,4 @@ function deliverMessage($composeMessage, $draft=false) {
     }
     return $success;
 }
-?>
\ No newline at end of file
+?>