oops, this error was already encoded, so back my r1.366 out, and part of
[squirrelmail.git] / src / read_body.php
index 176ed65e2bce71fce4ab508e9688d40ab671259e..de7b9c43a480084b35c73b3166dc44351b0b4282 100644 (file)
@@ -3,12 +3,11 @@
 /**
  * read_body.php
  *
- * Copyright (c) 1999-2004 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-2005 The SquirrelMail Project Team
+ * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  * @version $Id$
  * @package squirrelmail
  */
@@ -29,7 +28,8 @@ 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/identity.php');
-require_once(SM_PATH . 'functions/mailbox_display.php');
+include_once(SM_PATH . 'functions/arrays.php');
+include_once(SM_PATH . 'functions/mailbox_display.php');
 
 /**
  * Given an IMAP message id number, this will look it up in the cached
@@ -45,18 +45,12 @@ function findNextMessage($uidset,$passed_id='backwards') {
     if ($passed_id=='backwards' || !is_array($uidset)) { // check for backwards compattibilty gpg plugin
         $passed_id = $uidset;
     }
-    $result = -1;
-    $count = count($uidset) - 1;
-    foreach($uidset as $key=>$value) {
-        if ($passed_id == $value) {
-            if ($key == $count) {
-                break;
-            }
-            $result = $uidset[$key + 1];
-            break;
-        }
+    $result = sqm_array_get_value_by_offset($uidset,$passed_id,1);
+    if ($result === false) {
+        return -1;
+    } else {
+        return $result;
     }
-    return $result;
 }
 
 /**
@@ -71,17 +65,12 @@ function findPreviousMessage($uidset, $passed_id) {
     if (!is_array($uidset)) {
         return -1;
     }
-    $result = -1;
-    foreach($uidset as $key=>$value) {
-        if ($passed_id == $value) {
-            if ($key != 0) {
-                $result = $uidset[$key - 1];
-            }
-            break;
-        }
+    $result = sqm_array_get_value_by_offset($uidset,$passed_id,-1);
+    if ($result === false) {
+        return -1;
+    } else {
+        return $result;
     }
-
-    return $result;
 }
 
 /**
@@ -93,9 +82,16 @@ function findPreviousMessage($uidset, $passed_id) {
 function printer_friendly_link($mailbox, $passed_id, $passed_ent_id) {
     global $javascript_on;
 
+    /* hackydiehack */
+    if( !sqgetGlobalVar('view_unsafe_images', $view_unsafe_images, SQ_GET) ) {
+        $view_unsafe_images = false;
+    } else {
+        $view_unsafe_images = true;
+    }
     $params = '?passed_ent_id=' . urlencode($passed_ent_id) .
               '&mailbox=' . urlencode($mailbox) .
-              '&passed_id=' . urlencode($passed_id);
+              '&passed_id=' . urlencode($passed_id).
+              '&view_unsafe_images='. (bool) $view_unsafe_images;
 
     $print_text = _("View Printable Version");
 
@@ -267,7 +263,7 @@ function SendMDN ( $mailbox, $passed_id, $sender, $message, $imapConnection) {
     }
     if (!$success) {
         $msg  = $deliver->dlv_msg . '<br />' .
-                _("Server replied: ") . $deliver->dlv_ret_nr . ' '.
+                _("Server replied:") . ' ' . $deliver->dlv_ret_nr . ' ' .
                 $deliver->dlv_server_msg;
         require_once(SM_PATH . 'functions/display_messages.php');
         plain_error_message($msg, $color);
@@ -292,27 +288,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;
@@ -462,7 +437,7 @@ function formatMenubar($aMailbox, $passed_id, $passed_ent_id, $message, $removed
            $startMessage, $PHP_SELF, $save_as_draft,
            $enable_forward_as_attachment, $imapConnection, $lastTargetMailbox,
            $username, $delete_prev_next_display,
-           $compose_new_win, $javascript_on;
+           $compose_new_win, $javascript_on, $compose_width, $compose_height;
 
     //FIXME cleanup argument list, use $aMailbox where possible
     $mailbox = $aMailbox['NAME'];
@@ -494,7 +469,7 @@ function formatMenubar($aMailbox, $passed_id, $passed_ent_id, $message, $removed
         }
 
         $prev_link = _("Previous");
-        if($entities[$passed_ent_id] > 1) {
+        if(isset($entities[$passed_ent_id]) && $entities[$passed_ent_id] > 1) {
             $prev_ent_id = $entity_count[$entities[$passed_ent_id] - 1];
             $prev_link   = '<a href="'
                          . set_url_var($PHP_SELF, 'passed_ent_id', $prev_ent_id)
@@ -502,7 +477,7 @@ function formatMenubar($aMailbox, $passed_id, $passed_ent_id, $message, $removed
         }
 
         $next_link = _("Next");
-        if($entities[$passed_ent_id] < $c) {
+        if(isset($entities[$passed_ent_id]) && $entities[$passed_ent_id] < $c) {
             $next_ent_id = $entity_count[$entities[$passed_ent_id] + 1];
             $next_link   = '<a href="'
                          . set_url_var($PHP_SELF, 'passed_ent_id', $next_ent_id)
@@ -525,12 +500,6 @@ function formatMenubar($aMailbox, $passed_id, $passed_ent_id, $message, $removed
 
     // Prev/Next links for regular messages
     } else if ( true ) { //!(isset($where) && isset($what)) ) {
-        /**
-         * Check if cache is still valid
-         */
-        if (!is_array($aMailbox['UIDSET'][$what])) {
-            fetchMessageHeaders($imapConnection, $aMailbox);
-        }
         $prev = findPreviousMessage($aMailbox['UIDSET'][$what], $passed_id);
         $next = findNextMessage($aMailbox['UIDSET'][$what],$passed_id);
 
@@ -610,8 +579,14 @@ function formatMenubar($aMailbox, $passed_id, $passed_ent_id, $message, $removed
     $method='method="post" ';
     $onsubmit='';
     if ($compose_new_win == '1') {
+        if (!preg_match("/^[0-9]{3,4}$/", $compose_width)) {
+            $compose_width = '640';
+        }
+        if (!preg_match("/^[0-9]{3,4}$/", $compose_height)) {
+            $compose_height = '550';
+        }
         if ( $javascript_on ) {
-          $on_click=' onclick="comp_in_new_form(\''.$comp_uri.'\', this, this.form)"';
+          $on_click=' onclick="comp_in_new_form(\''.$comp_uri.'\', this, this.form,'. $compose_width .',' . $compose_height .')"';
           $comp_uri = 'javascript:void(0)';
           $method='method="get" ';
           $onsubmit = 'onsubmit="return false" ';
@@ -736,6 +711,27 @@ function formatToolbar($mailbox, $passed_id, $passed_ent_id, $message, $color) {
 
 }
 
+/**
+ * Creates button
+ *
+ * @deprecated see form functions available in 1.5.1 and 1.4.3.
+ * @param string $type
+ * @param string $name
+ * @param string $value
+ * @param string $js
+ * @param bool $enabled
+ */
+function getButton($type, $name, $value, $js = '', $enabled = TRUE) {
+    $disabled = ( $enabled ? '' : 'disabled ' );
+    $js = ( $js ? $js.' ' : '' );
+    return '<input '.$disabled.$js.
+            'type="'.$type.
+            '" name="'.$name.
+            '" value="'.$value .
+            '" style="padding: 0px; margin: 0px" />';
+}
+
+
 /***************************/
 /*   Main of read_body.php */
 /***************************/
@@ -757,6 +753,10 @@ sqgetGlobalVar('sendreceipt',   $sendreceipt,   SQ_GET);
 if (!sqgetGlobalVar('where',         $where,         SQ_GET) ) {
     $where = 'right_main.php';
 }
+/*
+ * Used as entry key to the list of uid's cached in the mailbox cache
+ * we use the cached uid's to get the next and prev  message.
+ */
 if (!sqgetGlobalVar('what',          $what,          SQ_GET) ){
     $what = 0;
 }
@@ -773,6 +773,12 @@ if ( sqgetGlobalVar('view_hdr', $temp,  SQ_GET) ) {
     $view_hdr = (int) $temp;
 }
 
+if ( sqgetGlobalVar('account', $temp,  SQ_GET) ) {
+    $iAccount = (int) $temp;
+} else {
+    $iAccount = 0;
+}
+
 /** GET/POST VARS */
 sqgetGlobalVar('passed_ent_id', $passed_ent_id);
 sqgetGlobalVar('mailbox',       $mailbox);
@@ -797,7 +803,65 @@ sqgetGlobalVar('mailbox_cache',$mailbox_cache,SQ_SESSION);
 global $sqimap_capabilities, $lastTargetMailbox;
 
 $imapConnection = sqimap_login($username, $key, $imapServerAddress, $imapPort, 0);
-$aMailbox = sqm_api_mailbox_select($imapConnection, $mailbox,array('setindex' => $what),array());
+$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
+ */
+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;
+        }
+        $aNewOrder[] = $iCol;
+   }
+   $aColumns = $aNewOrder;
+} else {
+   $aColumns = $index_order;
+}
+
+$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);
+
+/**
+ 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);
+}
+
+$iSetIndex = $aMailbox['SETINDEX'];
+$aMailbox['CURRENT_MSG'][$iSetIndex] = $passed_id;
 
 /**
  * Update the seen state
@@ -813,8 +877,6 @@ if (isset($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS'])) {
  */
 if ( sqgetGlobalVar('delete_id', $delete_id, SQ_GET) ) {
     handleMessageListForm($imapConnection,$aMailbox,$sButton='setDeleted', array($delete_id));
-//    sqimap_messages_delete($imapConnection, $delete_id, $delete_id, $mailbox);
-//    sqimap_mailbox_expunge_dmn($imapConnection,$aMailbox,$delete_id);
 }
 
 /**
@@ -841,11 +903,18 @@ if (isset($passed_ent_id) && $passed_ent_id) {
     $rfc822_header = new Rfc822Header();
     $rfc822_header->parseHeader($read);
     $message->rfc822_header = $rfc822_header;
+} else if ($message->type0 == 'message'  && $message->type1 == 'rfc822' && isset($message->entities[0])) {
+    $read = sqimap_run_command ($imapConnection, "FETCH $passed_id BODY[1.HEADER]", true, $response, $msg, TRUE);
+    $rfc822_header = new Rfc822Header();
+    $rfc822_header->parseHeader($read);
+    $message->rfc822_header = $rfc822_header;
 } else {
     $passed_ent_id = 0;
 }
 $header = $message->header;
 
+$header = $message->header;
+
 
 /****************************************/
 /* Block for handling incoming url vars */
@@ -864,7 +933,6 @@ if (isset($sendreceipt)) {
          $message->is_mdnsent = true;
          $aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'] = $message;
       }
-      ClearAttachments();
    }
 }
 /***********************************************/
@@ -888,7 +956,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">';
@@ -898,7 +966,7 @@ echo '      <tr><td>';
 echo '        <table width="100%" cellpadding="3" cellspacing="0" align="center" border="0">';
 echo '          <tr bgcolor="'.$color[4].'"><td>';
 // echo '            <table cellpadding="1" cellspacing="5" align="left" border="0">';
-echo html_tag( 'table' ,'' , 'left', '', 'cellpadding="1" cellspacing="5" border="0"' );
+echo html_tag( 'table' ,'' , 'left', '', 'width="100%" cellpadding="1" cellspacing="5" border="0"' );
 echo '              <tr>' . html_tag( 'td', '<br />'. $messagebody."\n", 'left')
                         . '</tr>';
 echo '            </table>';
@@ -954,10 +1022,12 @@ formatMenuBar($aMailbox, $passed_id, $passed_ent_id, $message, false, FALSE);
 
 do_hook('read_body_bottom');
 sqimap_logout($imapConnection);
-/* sessions are written at the end of the script. it's better to register
-   them at the end so we avoid double session_register calls */
-/* add the mailbox to the cache */
-$mailbox_cache[$aMailbox['NAME']] = $aMailbox;
+
+/**
+ * Write mailbox with updated seen flag information back to cache.
+ */
+$mailbox_cache[$iAccount.'_'.$aMailbox['NAME']] = $aMailbox;
 sqsession_register($mailbox_cache,'mailbox_cache');
+
 ?>
-</body></html>
\ No newline at end of file
+</body></html>