Remove use of in function copied from STABLE; change 'FIX ME' to 'FIXME'
[squirrelmail.git] / functions / imap_messages.php
index 911b06f31292cd5af97a7d74c2e91039a01dfd01..9107e43cd9de8b1be18aa252efdfe4bd5683a6cd 100755 (executable)
@@ -66,7 +66,7 @@ function sqimap_msgs_list_move($imap_stream, $id, $mailbox, $handle_errors = tru
  * @since 1.4.0
  */
 function sqimap_msgs_list_delete($imap_stream, $mailbox, $id, $bypass_trash=false) {
-    // FIX ME, remove globals by introducing an associative array with properties
+    // FIXME, remove globals by introducing an associative array with properties
     // as 4th argument as replacement for the bypass_trash var
     global $move_to_trash, $trash_folder;
     if (($move_to_trash == true) && ($bypass_trash != true) &&
@@ -165,7 +165,7 @@ function sqimap_get_sort_order($imap_stream, $sSortField, $reverse, $search='ALL
             $sSortField = 'REVERSE '.$sSortField;
         }
         $query = "SORT ($sSortField) ".strtoupper($default_charset)." $search";
-        // FIX ME sqimap_run_command should return the parsed data accessible by $aDATA['SORT']
+        // FIXME sqimap_run_command should return the parsed data accessible by $aDATA['SORT']
         // use sqimap_run_command_list in case of unsollicited responses. If we don't we could loose the SORT response
         $aData = sqimap_run_command_list ($imap_stream, $query, false, $response, $message, TRUE);
         /* fallback to default charset */
@@ -228,6 +228,13 @@ function get_squirrel_sort($imap_stream, $sSortField, $reverse = false, $aUid =
         $msgs = sqimap_get_small_header_list($imap_stream, $aUid,
                                       array(), array($sSortField));
     }
+
+    // sqimap_get_small_header (see above) returns fields in lower case,
+    // but the code below uses all upper case
+    foreach ($msgs as $k => $v) 
+        if (isset($msgs[$k][strtolower($sSortField)])) 
+            $msgs[$k][strtoupper($sSortField)] = $msgs[$k][strtolower($sSortField)];
+
     $aUid = array();
     $walk = false;
     switch ($sSortField) {
@@ -244,7 +251,7 @@ function get_squirrel_sort($imap_stream, $sSortField, $reverse = false, $aUid =
                  $sEmail = ($addr[SQM_ADDR_HOST]) ?
                       $addr[SQM_ADDR_MAILBOX] . "@".$addr[SQM_ADDR_HOST] :
                       $addr[SQM_ADDR_HOST];
-                 $v[$f] = ($sPersonal) ? decodeHeader($sPersonal):$sEmail;'),$sSortField);
+                 $v[$f] = ($sPersonal) ? decodeHeader($sPersonal, true, false):$sEmail;'),$sSortField);
             $walk = true;
         }
         // nobreak
@@ -252,9 +259,9 @@ function get_squirrel_sort($imap_stream, $sSortField, $reverse = false, $aUid =
         if(!$walk) {
             array_walk($msgs, create_function('&$v,&$k,$f',
                 '$v[$f] = (isset($v[$f])) ? $v[$f] : "";
-                 $v[$f] = strtolower(decodeHeader(trim($v[$f])));
-                 $v[$f] = (preg_match("/^(vedr|sv|re|aw|\[\w\]):\s*(.*)$/si", $v[$f], $matches)) ?
-                                    $matches[2] : $v[$f];'),$sSortField);
+                 $v[$f] = strtolower(decodeHeader(trim($v[$f]), true, false));
+                 $v[$f] = (preg_match("/^(?:(?:vedr|sv|re|aw|fw|fwd|\[\w\]):\s*)*\s*(.*)$/si", $v[$f], $matches)) ?
+                                    $matches[1] : $v[$f];'),$sSortField);
             $walk = true;
         }
         foreach ($msgs as $item) {
@@ -709,7 +716,7 @@ function parseFetch(&$aResponse,$aMessageList = array()) {
                                         if  (is_numeric($sPrio)) {
                                             $iPrio = (int) $sPrio;
                                         } elseif ( $sPrio == 'non-urgent' || $sPrio == 'low' ) {
-                                            $iPrio = 3;
+                                            $iPrio = 5;
                                         } elseif ( $sPrio == 'urgent' || $sPrio == 'high' ) {
                                             $iPrio = 1;
                                         } else {
@@ -923,5 +930,39 @@ function sqimap_get_message($imap_stream, $id, $mailbox, $hide=0) {
     $rfc822_header = new Rfc822Header();
     $rfc822_header->parseHeader($read);
     $msg->rfc822_header = $rfc822_header;
+
+    parse_message_entities($msg, $id, $imap_stream);
     return $msg;
+ }
+
+
+/**
+ * Recursively parse embedded messages (if any) in the given
+ * message, building correct rfc822 headers for each one
+ *
+ * @param object $msg The message object to scan for attached messages
+ *                    NOTE: this is passed by reference!  Changes made
+ *                    within will affect the caller's copy of $msg!
+ * @param int $id The top-level message UID on the IMAP server, even
+ *                if the $msg being passed in is only an attached entity
+ *                thereof.
+ * @param resource $imap_stream A live connection to the IMAP server.
+ *
+ * @return void
+ *
+ * @since 1.5.2
+ *
+ */
+function parse_message_entities(&$msg, $id, $imap_stream) {
+    if (!empty($msg->entities)) foreach ($msg->entities as $i => $entity) {
+        if (is_object($entity) && get_class($entity) == 'Message') {
+            if (!empty($entity->rfc822_header)) {
+                $read = sqimap_run_command($imap_stream, "FETCH $id BODY[". $entity->entity_id .".HEADER]", true, $response, $message, TRUE);
+                $rfc822_header = new Rfc822Header();
+                $rfc822_header->parseHeader($read);
+                $msg->entities[$i]->rfc822_header = $rfc822_header;
+            }
+            parse_message_entities($msg->entities[$i], $id, $imap_stream);
+        }
+    }
 }