Fix for #1093360.
[squirrelmail.git] / src / read_body.php
index b336e23ec51ea90fc1beeb35340cd110d3952d08..2e1f99872bed384b661570278f8c4041d3d8f780 100644 (file)
@@ -3,12 +3,11 @@
 /**
  * read_body.php
  *
- * Copyright (c) 1999-2005 The SquirrelMail Project Team
- * Licensed under the GNU GPL. For full terms see the file COPYING.
- *
  * This file is used for reading the msgs array and displaying
  * the resulting emails in the right frame.
  *
+ * @copyright © 1999-2006 The SquirrelMail Project Team
+ * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  * @version $Id$
  * @package squirrelmail
  */
 define('SM_PATH','../');
 
 /* SquirrelMail required files. */
-require_once(SM_PATH . 'include/validate.php');
-require_once(SM_PATH . 'functions/global.php');
+include_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/mime.php');
 require_once(SM_PATH . 'functions/date.php');
 require_once(SM_PATH . 'functions/url_parser.php');
 require_once(SM_PATH . 'functions/html.php');
-require_once(SM_PATH . 'functions/global.php');
+//require_once(SM_PATH . 'functions/global.php');
 require_once(SM_PATH . 'functions/identity.php');
 include_once(SM_PATH . 'functions/arrays.php');
-require_once(SM_PATH . 'functions/mailbox_display.php');
+include_once(SM_PATH . 'functions/mailbox_display.php');
 
 /**
  * Given an IMAP message id number, this will look it up in the cached
@@ -81,7 +80,7 @@ function findPreviousMessage($uidset, $passed_id) {
  * @param int $passed_id
  */
 function printer_friendly_link($mailbox, $passed_id, $passed_ent_id) {
-    global $javascript_on;
+    global $javascript_on, $show_html_default;
 
     /* hackydiehack */
     if( !sqgetGlobalVar('view_unsafe_images', $view_unsafe_images, SQ_GET) ) {
@@ -91,15 +90,16 @@ function printer_friendly_link($mailbox, $passed_id, $passed_ent_id) {
     }
     $params = '?passed_ent_id=' . urlencode($passed_ent_id) .
               '&mailbox=' . urlencode($mailbox) .
-              '&passed_id=' . urlencode($passed_id).
-              '&view_unsafe_images='. (bool) $view_unsafe_images;
+              '&passed_id=' . urlencode($passed_id) .
+              '&view_unsafe_images='. (bool) $view_unsafe_images .
+              '&show_html_default=' . $show_html_default;
 
     $print_text = _("View Printable Version");
 
     $result = '';
     /* Output the link. */
     if ($javascript_on) {
-        $result = '<script language="javascript" type="text/javascript">' . "\n" .
+        $result = '<script type="text/javascript">' . "\n" .
                   '<!--' . "\n" .
                   "  function printFormat() {\n" .
                   '    window.open("../src/printer_friendly_main.php' .
@@ -115,6 +115,55 @@ function printer_friendly_link($mailbox, $passed_id, $passed_ent_id) {
     return $result;
 }
 
+function view_as_html_link($mailbox, $passed_id, $passed_ent_id, $message) {
+    global $base_uri, $show_html_default;
+
+    $has_html = false;
+    if ($message->header->type0 == 'message' && $message->header->type1 == 'rfc822') {
+        $type0 = $message->rfc822_header->content_type->type0;
+        $type1 = $message->rfc822_header->content_type->type1;
+    } else {
+        $type0 = $message->header->type0;
+        $type1 = $message->header->type1;
+    }
+    if($type0 == 'multipart' &&
+       ($type1 == 'alternative' || $type1 == 'mixed' || $type1 == 'related')) {
+        if ($message->findDisplayEntity(array(), array('text/html'), true)) {
+            $has_html = true;
+        }
+    }
+    /*
+     * Normal single part message so check its type.
+     */
+    else {
+        if($type0 == 'text' && $type1 == 'html') {
+            $has_html = true;
+        }
+    }
+    if($has_html == true) {
+        $vars = array('passed_ent_id', 'show_more', 'show_more_cc', 'override_type0', 'override_type1', 'startMessage');
+
+        $new_link = $base_uri . 'src/read_body.php?passed_id=' . urlencode($passed_id) .
+                    '&amp;passed_ent_id=' . urlencode($passed_ent_id) .
+                    '&amp;mailbox=' . urlencode($mailbox);
+        foreach($vars as $var) {
+            if(sqgetGlobalVar($var, $temp)) {
+                $new_link .= '&amp;' . $var . '=' . urlencode($temp);
+            }
+        }
+
+        if($show_html_default == 1) {
+            $new_link .= '&amp;show_html_default=0';
+            $link      = _("View as plain text");
+        } else {
+            $new_link .= '&amp;show_html_default=1';
+            $link      = _("View as HTML");
+        }
+        return '&nbsp;|&nbsp<a href="' . $new_link . '">' . $link . '</a>';
+    }
+    return '';
+}
+
 function ServerMDNSupport($aFlags) {
     /* escaping $ doesn't work -> \x36 */
     return ( in_array('$mdnsent',$aFlags,true) ||
@@ -263,19 +312,22 @@ function SendMDN ( $mailbox, $passed_id, $sender, $message, $imapConnection) {
         $success = $deliver->finalizeStream($stream);
     }
     if (!$success) {
-        $msg  = $deliver->dlv_msg . '<br />' .
-                _("Server replied: ") . $deliver->dlv_ret_nr . ' '.
-                $deliver->dlv_server_msg;
+        $msg = $deliver->dlv_msg;
+        if (! empty($deliver->dlv_server_msg)) {
+            $msg.= '<br />' .
+                _("Server replied:") . ' ' . $deliver->dlv_ret_nr . ' ' .
+                nl2br(htmlspecialchars($deliver->dlv_server_msg));
+        }
         require_once(SM_PATH . 'functions/display_messages.php');
         plain_error_message($msg, $color);
     } else {
         unset ($deliver);
         if (sqimap_mailbox_exists ($imapConnection, $sent_folder)) {
-            sqimap_append ($imapConnection, $sent_folder, $length);
+            $sid = sqimap_append ($imapConnection, $sent_folder, $length);
             require_once(SM_PATH . 'class/deliver/Deliver_IMAP.class.php');
             $imap_deliver = new Deliver_IMAP();
             $imap_deliver->mail($composeMessage, $imapConnection);
-            sqimap_append_done ($imapConnection);
+            sqimap_append_done ($imapConnection, $sent_folder);
             unset ($imap_deliver);
         }
     }
@@ -289,27 +341,6 @@ function ToggleMDNflag ($set ,$imapConnection, $mailbox, $passed_id) {
                                 $readmessage, TRUE);
 }
 
-function ClearAttachments() {
-    global $username, $attachments, $attachment_dir;
-
-    $hashed_attachment_dir = getHashedDir($username, $attachment_dir);
-
-    $rem_attachments = array();
-    if (isset($attachments)) {
-        foreach ($attachments as $info) {
-            if ($info['session'] == -1) {
-                $attached_file = "$hashed_attachment_dir/$info[localfilename]";
-                if (file_exists($attached_file)) {
-                    unlink($attached_file);
-                }
-            } else {
-                $rem_attachments[] = $info;
-            }
-        }
-    }
-    $attachments = $rem_attachments;
-}
-
 function formatRecipientString($recipients, $item ) {
     global $show_more_cc, $show_more, $show_more_bcc,
            $PHP_SELF;
@@ -404,7 +435,7 @@ function formatEnvheader($aMailbox, $passed_id, $passed_ent_id, $message,
                           $passed_ent_id)) {
                         $mdn_url = $PHP_SELF . '&sendreceipt=1';
                         if ($FirstTimeSee && $javascript_on) {
-                            $script  = '<script language="JavaScript" type="text/javascript">' . "\n";
+                            $script  = '<script type="text/javascript">' . "\n";
                             $script .= '<!--'. "\n";
                             $script .= 'if(window.confirm("' .
                                        _("The message sender has requested a response to indicate that you have read this message. Would you like to send a receipt?") .
@@ -699,7 +730,7 @@ function formatMenubar($aMailbox, $passed_id, $passed_ent_id, $message, $removed
 }
 
 function formatToolbar($mailbox, $passed_id, $passed_ent_id, $message, $color) {
-    global $base_uri, $where, $what;
+    global $base_uri, $where, $what, $download_and_unsafe_link;
 
     $urlMailbox = urlencode($mailbox);
     $urlPassed_id = urlencode($passed_id);
@@ -726,6 +757,13 @@ function formatToolbar($mailbox, $passed_id, $passed_ent_id, $message, $color) {
     $s .= '&nbsp;|&nbsp;' .
           printer_friendly_link($mailbox, $passed_id, $passed_ent_id);
     echo $s;
+    echo view_as_html_link($mailbox, $passed_id, $passed_ent_id, $message);
+
+    /* Output the download and/or unsafe images link/-s, if any. */
+    if ($download_and_unsafe_link) {
+       echo $download_and_unsafe_link;
+    }
+
     do_hook("read_body_header_right");
     $s = "</small></td>\n" .
          "</tr>\n";
@@ -769,7 +807,11 @@ sqgetGlobalVar('lastTargetMailbox', $lastTargetMailbox, SQ_SESSION);
 if (!sqgetGlobalVar('messages', $messages, SQ_SESSION) ) {
     $messages = array();
 }
-
+sqgetGlobalVar('delayed_errors',  $delayed_errors,  SQ_SESSION);
+if (is_array($delayed_errors)) {
+    $oErrorHandler->AssignDelayedErrors($delayed_errors);
+    sqsession_unregister("delayed_errors");
+}
 /** GET VARS */
 sqgetGlobalVar('sendreceipt',   $sendreceipt,   SQ_GET);
 if (!sqgetGlobalVar('where',         $where,         SQ_GET) ) {
@@ -816,6 +858,18 @@ if ( sqgetGlobalVar('startMessage', $temp) ) {
 } else {
     $startMessage = 1;
 }
+if(sqgetGlobalVar('show_html_default', $temp)) {
+    $show_html_default = (int) $temp;
+}
+
+if(sqgetGlobalVar('view_unsafe_images', $temp)) {
+    $view_unsafe_images = (int) $temp;
+    if($view_unsafe_images == 1) {
+        $show_html_default = 1;
+    }
+} else {
+    $view_unsafe_images = 0;
+}
 /**
  * Retrieve mailbox cache
  */
@@ -827,15 +881,59 @@ global $sqimap_capabilities, $lastTargetMailbox;
 $imapConnection = sqimap_login($username, $key, $imapServerAddress, $imapPort, 0);
 $aMailbox = sqm_api_mailbox_select($imapConnection, $iAccount, $mailbox,array('setindex' => $what, 'offset' => $startMessage),array());
 
+
+/**
+ Start code to set the columns to fetch in case of hitting the next/prev link
+ The reason for this is the fact that the cache can be invalidated which means that the headers
+ to fetch aren't there anymore. Before they got calculated when the messagelist was shown.
+
+ Todo, better central handling of setting the mailbox options so we do not need to do the stuff below
+*/
+
+/**
+ * Replace From => To  in case it concerns a draft or sent folder
+ */
+$aColumns = array();
+if (($mailbox == $sent_folder || $mailbox == $draft_folder) &&
+    !in_array(SQM_COL_TO,$index_order)) {
+    $aNewOrder = array(); // nice var name ;)
+    foreach($index_order as $iCol) {
+        if ($iCol == SQM_COL_FROM) {
+            $iCol = SQM_COL_TO;
+        }
+        $aColumns[$iCol] = array();
+   }
+} else {
+   foreach ($index_order as $iCol) {
+       $aColumns[$iCol] = array();
+   }
+}
+
+$aProps = array(
+    'columns' => $aColumns, // columns bound settings
+    'config'  => array(
+                        'highlight_list'        => $message_highlight_list, // row highlighting rules
+                        'trash_folder'          => $trash_folder,
+                        'sent_folder'           => $sent_folder,
+                        'draft_folder'          => $draft_folder));
+
+calcFetchColumns($aMailbox,$aProps);
+
 /**
-    * Check if cache is still valid, $what contains the key
-    * which gives us acces to the array with uid's. At this moment
-    * 0 is used for a normal message list and search uses 1 as key. This can be
-    * changed / extended in the future.
-    * If on a select of a mailbox we detect that the cache should be invalidated due to
-    * the delete of messages or due to new messages we empty the list with uid's and
-    * that's what we detect below.
-    */
+ End code to set the columns to fetch in case of hitting the next/prev link
+*/
+
+
+
+/**
+ * Check if cache is still valid, $what contains the key
+ * which gives us acces to the array with uid's. At this moment
+ * 0 is used for a normal message list and search uses 1 as key. This can be
+ * changed / extended in the future.
+ * If on a select of a mailbox we detect that the cache should be invalidated due to
+ * the delete of messages or due to new messages we empty the list with uid's and
+ * that's what we detect below.
+ */
 if (!is_array($aMailbox['UIDSET'][$what])) {
     fetchMessageHeaders($imapConnection, $aMailbox);
 }
@@ -873,7 +971,6 @@ if (isset($aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'])) {
     $message->is_seen = true;
     $aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'] = $message;
 }
-
 if (isset($passed_ent_id) && $passed_ent_id) {
     $message = $message->getEntity($passed_ent_id);
     if ($message->type0 != 'message'  && $message->type1 != 'rfc822') {
@@ -893,8 +990,6 @@ if (isset($passed_ent_id) && $passed_ent_id) {
 }
 $header = $message->header;
 
-$header = $message->header;
-
 
 /****************************************/
 /* Block for handling incoming url vars */
@@ -913,15 +1008,12 @@ if (isset($sendreceipt)) {
          $message->is_mdnsent = true;
          $aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'] = $message;
       }
-      ClearAttachments();
    }
 }
 /***********************************************/
 /* End of block for handling incoming url vars */
 /***********************************************/
 
-
-
 $messagebody = '';
 do_hook('read_body_top');
 if ($show_html_default == 1) {
@@ -937,7 +1029,7 @@ for ($i = 0; $i < $cnt; $i++) {
    }
 }
 
-displayPageHeader($color, $mailbox);
+displayPageHeader($color, $mailbox,'','');
 formatMenuBar($aMailbox, $passed_id, $passed_ent_id, $message,false);
 formatEnvheader($aMailbox, $passed_id, $passed_ent_id, $message, $color, $FirstTimeSee);
 echo '<table width="100%" cellpadding="0" cellspacing="0" align="center" border="0">';
@@ -1009,5 +1101,5 @@ sqimap_logout($imapConnection);
  */
 $mailbox_cache[$iAccount.'_'.$aMailbox['NAME']] = $aMailbox;
 sqsession_register($mailbox_cache,'mailbox_cache');
+$oTemplate->display('footer.tpl');
 ?>
-</body></html>
\ No newline at end of file