Make message details link a non-relative URI. Thanks Thierry Godefroy
[squirrelmail.git] / functions / imap_messages.php
index ece3179fe4e4c394a09496a4dc86df11bd88daa9..c10439c834a59643f59bc13a1d7006f4a663a03e 100755 (executable)
@@ -6,7 +6,7 @@
  * This implements functions that manipulate messages
  * NOTE: Quite a few functions in this file are obsolete
  *
- * @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
@@ -203,7 +203,7 @@ function parseUidList($aData,$sCommand) {
         for ($i=0,$iCnt=count($aData);$i<$iCnt;++$i) {
             for ($j=0,$jCnt=count($aData[$i]);$j<$jCnt;++$j) {
                 if (preg_match("/^\* $sCommand (.+)$/", $aData[$i][$j], $aMatch)) {
-                    $aUid += preg_split("/ /", trim($aMatch[1]));
+                    $aUid += explode(' ', trim($aMatch[1]));
                 }
             }
         }
@@ -335,6 +335,7 @@ function get_thread_sort($imap_stream, $search='ALL') {
     } elseif ($response == 'BAD') {
         sqm_trigger_imap_error('SQM_IMAP_NO_THREAD',$query, $response, $message);
     }
+    $sThreadResponse = '';
     if (isset($sRead[0])) {
         for ($i=0,$iCnt=count($sRead);$i<$iCnt;++$i) {
             if (preg_match("/^\* THREAD (.+)$/", $sRead[$i], $aMatch)) {
@@ -342,8 +343,6 @@ function get_thread_sort($imap_stream, $search='ALL') {
                 break;
             }
         }
-    } else {
-        $sThreadResponse = "";
     }
     unset($sRead);
 
@@ -455,33 +454,6 @@ function elapsedTime($start) {
     return $timepassed;
 }
 
-
-/**
- * Normalise the different Priority headers into a uniform value,
- * namely that of the X-Priority header (1, 3, 5). Supports:
- * Prioirty, X-Priority, Importance.
- * X-MS-Mail-Priority is not parsed because it always coincides
- * with one of the other headers.
- *
- * FIXME: DUPLICATE CODE ALERT:
- * NOTE: this is actually a duplicate from the function in
- * class/mime/Rfc822Header.php.
- * @todo obsolate function or use it instead of code block in parseFetch()
- */
-function parsePriority($sValue) {
-    $aValue = split('/\w/',trim($sValue));
-    $value = strtolower(array_shift($aValue));
-    if ( is_numeric($value) ) {
-        return $value;
-    }
-    if ( $value == 'urgent' || $value == 'high' ) {
-        return 1;
-    } elseif ( $value == 'non-urgent' || $value == 'low' ) {
-        return 5;
-    }
-    return 3;
-}
-
 /**
  * Parses a string in an imap response. String starts with " or { which means it
  * can handle double quoted strings and literal strings
@@ -730,8 +702,9 @@ function parseFetch(&$aResponse,$aMessageList = array()) {
                                 case 'x-priority': $aMsg['x-priority'] = ($value) ? (int) $value{0} : 3; break;
                                 case 'priority':
                                 case 'importance':
+                                    // duplicate code with Rfc822Header.cls:parsePriority()
                                     if (!isset($aMsg['x-priority'])) {
-                                        $aPrio = split('/\w/',trim($value));
+                                        $aPrio = preg_split('/\s/',trim($value));
                                         $sPrio = strtolower(array_shift($aPrio));
                                         if  (is_numeric($sPrio)) {
                                             $iPrio = (int) $sPrio;
@@ -932,7 +905,7 @@ function sqimap_get_message($imap_stream, $id, $mailbox, $hide=0) {
         if ($hide == 2) return FALSE;
 
         /* the message was not found, maybe the mailbox was modified? */
-        global $sort, $startMessage, $color;
+        global $sort, $startMessage;
 
         $errmessage = _("The server couldn't find the message you requested.");
 
@@ -941,7 +914,7 @@ function sqimap_get_message($imap_stream, $id, $mailbox, $hide=0) {
         $errmessage .= '<p>'._("Most probably your message list was out of date and the message has been moved away or deleted (perhaps by another program accessing the same mailbox).");
 
         /* this will include a link back to the message list */
-        error_message($errmessage, $mailbox, $sort, (int) $startMessage, $color);
+        error_message($errmessage, $mailbox, $sort, (int) $startMessage);
         exit;
     }
     $bodystructure = implode('',$read);
@@ -950,5 +923,40 @@ 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) {
+    global $uid_support;
+    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, $uid_support);
+                $rfc822_header = new Rfc822Header();
+                $rfc822_header->parseHeader($read);
+                $msg->entities[$i]->rfc822_header = $rfc822_header;
+            }
+            parse_message_entities($msg->entities[$i], $id, $imap_stream);
+        }
+    }
 }