moved address-parsing to the displayable headers
[squirrelmail.git] / functions / mailbox_display.php
index 1d04af2a25e5f21a5785eb9a11c43c55058c43f6..97f1418bbac8958512b97d7e590d1ded1fd80ff0 100644 (file)
@@ -20,10 +20,24 @@ require_once(SM_PATH . 'functions/imap_mailbox.php');
 /* Default value for page_selector_max. */
 define('PG_SEL_MAX', 10);
 
+function elapsed($start)
+{
+   $end = microtime();
+   list($start2, $start1) = explode(" ", $start);
+   list($end2, $end1) = explode(" ", $end);
+  $diff1 = $end1 - $start1;
+   $diff2 = $end2 - $start2;
+   if( $diff2 < 0 ){
+       $diff1 -= 1;
+       $diff2 += 1.0;
+  }
+   return $diff2 + $diff1;
+}
+
 function printMessageInfo($imapConnection, $t, $not_last=true, $key, $mailbox,
                           $start_msg, $where, $what) {
     global $checkall,
-           $color, $msgs, $msort,
+           $color, $msgs, $msort, $td_str, $msg, 
            $default_use_priority,
            $message_highlight_list,
            $index_order,
@@ -58,26 +72,32 @@ function printMessageInfo($imapConnection, $t, $not_last=true, $key, $mailbox,
 
     if (handleAsSent($mailbox)) {
        $msg['FROM'] = $msg['TO'];
+    }
+    $msg['FROM'] = parseAddress($msg['FROM']);
+    
        /*
         * This is done in case you're looking into Sent folders,
         * because you can have multiple receivers.
         */
-       $senderNames = explode(',', $msg['FROM']);
-       $senderName  = '';
-       if (sizeof($senderNames)){
-          foreach ($senderNames as $senderNames_part) {
+
+    $senderNames = $msg['FROM'];
+    $senderName  = '';
+    if (sizeof($senderNames)){
+        foreach ($senderNames as $senderNames_part) {
             if ($senderName != '') {
                 $senderName .= ', ';
             }
-            $senderName .= sqimap_find_displayable_name($senderNames_part);
-          }
-       }
-    } else {
-       $senderName = sqimap_find_displayable_name($msg['FROM']);
+            if ($senderNames_part[1]) {
+                $senderName .= decodeHeader($senderNames_part[1]);
+            } else {
+                $senderName .= htmlspecialchars($senderNames_part[0]);
+            }
+        }
     }
 
+    $msg['SUBJECT'] = decodeHeader($msg['SUBJECT']);
     $subject = processSubject($msg['SUBJECT'], $indent_array[$msg['ID']]);
-
+    
     echo html_tag( 'tr','','','','VALIGN="top"') . "\n";
 
     if (isset($msg['FLAG_FLAGGED']) && ($msg['FLAG_FLAGGED'] == true)) {
@@ -118,22 +138,56 @@ function printMessageInfo($imapConnection, $t, $not_last=true, $key, $mailbox,
     * AAAAH! Make my eyes stop bleeding!
     * Who wrote this?!
     */
-    if (is_array($message_highlight_list) && count($message_highlight_list)){
+    if (is_array($message_highlight_list) && count($message_highlight_list)) {
+       $msg['TO'] = parseAddress($msg['TO']);
+       $msg['CC'] = parseAddress($msg['CC']);
         foreach ($message_highlight_list as $message_highlight_list_part) {
             if (trim($message_highlight_list_part['value']) != '') {
                 $high_val   = strtolower($message_highlight_list_part['value']);
                 $match_type = strtoupper($message_highlight_list_part['match_type']);
-                if ($match_type == 'TO_CC') {
-                    if (strstr('^^' . strtolower($msg['TO']), $high_val) ||
-                        strstr('^^' . strtolower($msg['CC']), $high_val)) {
-                        $hlt_color = $message_highlight_list_part['color'];
-                        continue;
-                    }
-                } else {
-                    if (strstr('^^' . strtolower($msg[$match_type]), $high_val)) {
-                        $hlt_color = $message_highlight_list_part['color'];
-                        continue;
-                    }
+                switch($match_type) {
+                    case('TO'):
+                    case('TO_CC'):
+                        foreach ($msg['TO'] as $address) {
+                            $address[0] = decodeHeader($address[0]);
+                            $address[1] = decodeHeader($address[1]);
+                            if (strstr('^^' . strtolower($address[0]), $high_val) ||
+                                strstr('^^' . strtolower($address[1]), $high_val)) {
+                                $hlt_color = $message_highlight_list_part['color'];
+                                continue;
+                            }
+                        }
+                        if($match_type != 'TO_CC') {
+                            break;
+                        }
+                    case('CC'):
+                        foreach ($msg['CC'] as $address) {
+                            $address[0] = decodeHeader($address[0]);
+                            $address[1] = decodeHeader($address[1]);
+                            if( strstr('^^' . strtolower($address[0]), $high_val) ||
+                                strstr('^^' . strtolower($address[1]), $high_val)) {
+                                $hlt_color = $message_highlight_list_part['color'];
+                                continue;
+                            }
+                        }
+                        break;
+                    case('FROM'):
+                        foreach ($msg['FROM'] as $address) {
+                            $address[0] = decodeHeader($address[0]);
+                            $address[1] = decodeHeader($address[1]);
+                            if( strstr('^^' . strtolower($address[0]), $high_val) ||
+                                strstr('^^' . strtolower($address[1]), $high_val)) {
+                                $hlt_color = $message_highlight_list_part['color'];
+                                continue;
+                            }
+                        }
+                        break;
+                    default:
+                        if (strstr('^^' . strtolower($msg[$match_type]), $high_val)) {
+                            $hlt_color = $message_highlight_list_part['color'];
+                            continue;
+                        }
+                        break;
                 }
             }
         }
@@ -155,7 +209,7 @@ function printMessageInfo($imapConnection, $t, $not_last=true, $key, $mailbox,
                 break;
             case 2: /* from */
                 echo html_tag( 'td',
-                               $italic . $bold . $flag . $fontstr . htmlentities($senderName) .
+                               $italic . $bold . $flag . $fontstr . $senderName .
                                $fontstr_end . $flag_end . $bold_end . $italic_end,
                                'left',
                                $hlt_color );
@@ -182,7 +236,7 @@ function printMessageInfo($imapConnection, $t, $not_last=true, $key, $mailbox,
                 $td_str .= '<a href="read_body.php?mailbox='.$urlMailbox
                         .  '&amp;passed_id='. $msg["ID"]
                         .  '&amp;startMessage='.$start_msg.$searchstr.'"';
-                $td_str .= ' ' .concat_hook_function('subject_link');
+                $td_str .= ' ' .concat_hook_function('subject_link'); 
                 if ($subject != $msg['SUBJECT']) {
                     $title = get_html_translation_table(HTML_SPECIALCHARS);
                     $title = array_flip($title);
@@ -222,6 +276,7 @@ function printMessageInfo($imapConnection, $t, $not_last=true, $key, $mailbox,
                 if (!$stuff) {
                     $td_str .= '&nbsp;';
                 }
+                do_hook("msg_envelope");
                 $td_str .= '</small></b>';
                 echo html_tag( 'td',
                                $td_str,
@@ -250,13 +305,7 @@ function printMessageInfo($imapConnection, $t, $not_last=true, $key, $mailbox,
 
 function getServerMessages($imapConnection, $start_msg, $show_num, $num_msgs, $id) {
     if ($id != 'no') {
-        if ($start_msg + ($show_num - 1) < $num_msgs) {
-            $end_msg = $start_msg + ($show_num-1);
-        } else {
-            $end_msg = $num_msgs;
-        }
-        $id = array_slice($id, ($start_msg-1), ($end_msg));
-
+        $id = array_slice($id, ($start_msg-1), $show_num);
         $end = $start_msg + $show_num - 1;
         if ($num_msgs < $show_num) {
             $end_loop = $num_msgs;
@@ -303,7 +352,7 @@ function getSelfSortMessages($imapConnection, $start_msg, $show_num,
                     $start_msg = 1;
                 }
             }
-            $id = array_slice(array_reverse($id), ($start_msg-1), ($end_msg));
+            $id = array_slice(array_reverse($id), ($start_msg-1), $show_num);
             $end = $start_msg + $show_num - 1;
             if ($num_msgs < $show_num) {
                 $end_loop = $num_msgs;
@@ -330,6 +379,21 @@ function showMessagesForMailbox($imapConnection, $mailbox, $num_msgs,
     global $msgs, $msort, $auto_expunge, $thread_sort_messages,
            $allow_server_sort, $server_sort_order;
 
+    /*
+     * For some reason, on PHP 4.3+, this being unset, and set in the session causes havoc
+     * so setting it to an empty array beforehand seems to clean up the issue, and stopping the
+     * "Your script possibly relies on a session side-effect which existed until PHP 4.2.3" error
+     */
+
+    if (!isset($msort)) {
+        $msort = array();
+    }
+
+    if (!isset($msgs)) {
+        $msgs = array();
+    }
+
+    $start = microtime();
     /* If autoexpunge is turned on, then do it now. */
     $mbxresponse = sqimap_mailbox_select($imapConnection, $mailbox);
     $srt = $sort;
@@ -443,6 +507,8 @@ function showMessagesForMailbox($imapConnection, $mailbox, $num_msgs,
 
     mail_message_listing_end($num_msgs, $paginator_str, $msg_cnt_str, $color); 
     echo '</td></tr></table>';
+    $t = elapsed($start);
+    //echo("elapsed time = $t seconds\n");
 }
 
 function calc_msort($msgs, $sort) {
@@ -781,7 +847,7 @@ function printHeader($mailbox, $sort, $color, $showsort=true) {
             echo "</td>\n";
             break;
         case 6: /* size */
-            echo html_tag( 'td', '<b>' . _("Size") . '</b>', 'center', '', 'width="5%"' );
+            echo html_tag( 'td', '<b>' . _("Size") . '</b>', 'center', '', 'width="5%" nowrap' );
             break;
         }
     }
@@ -1121,29 +1187,36 @@ function processSubject($subject, $threadlevel = 0) {
 
     $trim_at = 55;
 
-    /* if this is threaded, substract two chars per indentlevel */
+    /* if this is threaded, subtract two chars per indentlevel */
     if($threadlevel > 0 && $threadlevel <= 10)
         $trim_at -= (2*$threadlevel);
 
     if (strlen($subject) <= $trim_at)
         return $subject;
 
-    $ent_strlen = strlen($subject);
+    $ent_strlen = $orig_len = strlen($subject);
     $trim_val = $trim_at - 5;
     $ent_offset = 0;
     /*
      * see if this is entities-encoded string
      * If so, Iterate through the whole string, find out
      * the real number of characters, and if more
-     * than 55, substr with an updated trim value.
+     * than 55, substr with an updated trim value. 
      */
-    while ( (($ent_loc = strpos($subject, '&', $ent_offset)) !== false) &&
-            (($ent_loc_end = strpos($subject, ';', $ent_loc)) !== false) ) {
-        $trim_val   += ($ent_loc_end-$ent_loc)+1;
-        $ent_strlen -= $ent_loc_end-$ent_loc;
+    $step = $ent_loc = 0;
+    while ( $ent_loc < $trim_val && (($ent_loc = strpos($subject, '&', $ent_offset)) !== false) &&
+            (($ent_loc_end = strpos($subject, ';', $ent_loc+3)) !== false) ) {
+        $trim_val += ($ent_loc_end-$ent_loc);
         $ent_offset  = $ent_loc_end+1;
+        ++$step;
+    }
+    
+    if (($trim_val > 50) && (strlen($subject) > ($trim_val))&& (strpos($subject,';',$trim_val) < ($trim_val +6))) {
+        $i = strpos($subject,';',$trim_val);
+        if ($i) {
+            $trim_val = strpos($subject,';',$trim_val);
+        }
     }
-
     if ($ent_strlen <= $trim_at){
         return $subject;
     }
@@ -1152,7 +1225,6 @@ function processSubject($subject, $threadlevel = 0) {
         function_exists($languages[$squirrelmail_language]['XTRA_CODE'])) {
         return $languages[$squirrelmail_language]['XTRA_CODE']('strimwidth', $subject, $trim_val);
     }
-
     return substr($subject, 0, $trim_val) . '...';
 }
 
@@ -1203,4 +1275,5 @@ function handleAsSent($mailbox) {
     /* And return the result. */
     return $handleAsSent_result;
 }
+
 ?>