Use templates to build buttons. Remove all this document.write crap - that's what...
[squirrelmail.git] / src / compose.php
index de1c2f019ea07a6e3b4ace96769933660822cb14..8b2f6e50a41b0dacbb398c6b445a400472ebead0 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');
@@ -124,7 +125,7 @@ if ( sqgetGlobalVar('mailtodata', $mailtodata, SQ_GET) ) {
                  'body'         => 'body',
                  'subject'      => 'subject');
     $mtdata = unserialize($mailtodata);
-    
+
     foreach ($trtable as $f => $t) {
         if ( !empty($mtdata[$f]) ) {
             $$t = $mtdata[$f];
@@ -146,8 +147,8 @@ function replyAllString($header) {
     /**
      * 1) Remove the addresses we'll be sending the message 'to'
      */
-    if (isset($header->replyto)) {
-        $excl_ar = $header->getAddr_a('replyto');
+    if (isset($header->reply_to)) {
+        $excl_ar = $header->getAddr_a('reply_to');
     }
     /**
      * 2) Remove our identities from the CC list (they still can be in the
@@ -312,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',
@@ -412,7 +413,7 @@ if ($draft) {
             }
             sqimap_logout($imap_stream);
         }
-        
+
         $oErrorHandler->saveDelayedErrors();
         session_write_close();
 
@@ -491,10 +492,15 @@ if ($send) {
 
         $Result = deliverMessage($composeMessage);
 
-        // NOTE: this hook changed in 1.5.2 from sending $Result and 
+        if ($Result)
+            $mail_sent = 'yes';
+        else
+            $mail_sent = 'no';
+
+        // 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));
+        do_hook('compose_send_after', $temp=array(&$Result, &$composeMessage, &$mail_sent));
         if (! $Result) {
             showInputForm($session);
             exit();
@@ -522,21 +528,21 @@ if ($send) {
 
         if ($compose_new_win == '1') {
             if ( !isset($pageheader_sent) || !$pageheader_sent ) {
-                Header("Location: $location/compose.php?mail_sent=yes");
+                Header("Location: $location/compose.php?mail_sent=$mail_sent");
             } else {
                 echo '   <br><br><div style="text-align: center;"><a href="' . $location
-                    . '/compose.php?mail_sent=yes">'
+                    . '/compose.php?mail_sent=$mail_sent">'
                     . _("Return") . '</a></div>';
             }
             exit();
         } else {
             if ( !isset($pageheader_sent) || !$pageheader_sent ) {
                 Header("Location: $location/right_main.php?mailbox=$urlMailbox".
-                    "&startMessage=$startMessage&mail_sent=yes");
+                    "&startMessage=$startMessage&mail_sent=$mail_sent");
             } else {
                 echo '   <br><br><div style="text-align: center;"><a href="' . $location
                     . "/right_main.php?mailbox=$urlMailbox"
-                    . "&amp;startMessage=$startMessage&amp;mail_sent=yes\">"
+                    . "&amp;startMessage=$startMessage&amp;mail_sent=$mail_sent\">"
                     . _("Return") . '</a></div>';
             }
             exit();
@@ -765,7 +771,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);
@@ -854,11 +860,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;
@@ -974,8 +980,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) {
@@ -1003,19 +1009,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);
         }
@@ -1029,8 +1030,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',
@@ -1048,14 +1047,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;
 }
@@ -1169,7 +1166,7 @@ function showInputForm ($session, $values=false) {
     if ($compose_new_win == '1') {
         $oTemplate->display('compose_newwin_close.tpl');
     }
-    
+
     if ($location_of_buttons == 'top') {
         showComposeButtonRow();
     }
@@ -1181,16 +1178,16 @@ function showInputForm ($session, $values=false) {
             $identities[$id] = $data['full_name'].' &lt;'.$data['email_address'].'&gt;';
         }
     }
-    
+
     $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') {
@@ -1232,9 +1229,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();
     }
@@ -1265,7 +1262,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;
@@ -1275,15 +1272,16 @@ 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 */
 
+//FIXME: no direct echoing to browser, no HTML output in core!
     echo addHidden('username', $username).
          addHidden('smaction', $action).
          addHidden('mailbox', $mailbox);
@@ -1292,13 +1290,15 @@ 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)).
+//FIXME: no direct echoing to browser, no HTML output in core!
+    echo addHidden('restoremessages', urlencode(serialize($compose_messages))).
         addHidden('composesession', $composesession).
         addHidden('querystring', $queryString).
         "</form>\n";
     if (!(bool) ini_get('file_uploads')) {
         /* File uploads are off, so we didn't show that part of the form.
            To avoid bogus bug reports, tell the user why. */
+//FIXME: no direct echoing to browser, no HTML output in core!
         echo '<p style="text-align:center">'
             . _("Because PHP file uploads are turned off, you can not attach files to this message. Please see your system administrator for details.")
             . "</p>\r\n";
@@ -1309,7 +1309,7 @@ function showInputForm ($session, $values=false) {
     if ($compose_new_win=='1') {
         $oTemplate->display('compose_newwin_close.tpl');
     }
-    
+
     $oErrorHandler->setDelayedErrors(false);
     $oTemplate->display('footer.tpl');
 }
@@ -1322,38 +1322,31 @@ 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) {
-        $addr_book = "         <script type=\"text/javascript\"><!--\n document.write(\"".
-            "            <input type=button value=\\\""._("Addresses").
-            "\\\" onclick=\\\"javascript:open_abook();\\\" />\");".
-            "            // --></script><noscript>\n".
-            '            <input type="submit" name="html_addr_search" value="'.
-            _("Addresses").'" />'.
-            "         </noscript>\n";
+    if ($use_javascript_addr_book && checkForJavascript()) {
+        $addr_book = addButton(_("Addresses"), null, array('onclick' => 'javascript:open_abook();'));
     } else {
-        $addr_book = '         <input type="submit" name="html_addr_search" value="'.
-            _("Addresses").'" />' . "\n";
+        $addr_book = addSubmit(_("Addresses"), 'html_addr_search');
     }
 
     $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);
 
@@ -1381,33 +1374,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');
 }
@@ -1511,7 +1497,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;
@@ -1552,7 +1538,7 @@ 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; plugin authors note that $composeMessage
        is sent and modified by reference since 1.5.2 */
@@ -1686,7 +1672,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);