aStutus -> aStatus
[squirrelmail.git] / functions / imap_general.php
index 5e755b5d2ada1399555777cfafab99d2f12da6d3..0e11590c37f27238a3178778cdeca6af48d05abe 100755 (executable)
@@ -3,13 +3,14 @@
 /**
  * imap_general.php
  *
- * Copyright (c) 1999-2003 The SquirrelMail Project Team
+ * Copyright (c) 1999-2004 The SquirrelMail Project Team
  * Licensed under the GNU GPL. For full terms see the file COPYING.
  *
  * This implements all functions that do general imap functions.
  *
- * $Id$
+ * @version $Id$
  * @package squirrelmail
+ * @subpackage imap
  */
 
 /** Includes.. */
@@ -17,17 +18,15 @@ require_once(SM_PATH . 'functions/page_header.php');
 require_once(SM_PATH . 'functions/auth.php');
 
 
-global $sqimap_session_id;
-$sqimap_session_id = 1;
-
 /**
  * Generates a new session ID by incrementing the last one used;
  * this ensures that each command has a unique ID.
  * @param bool unique_id
  * @return string IMAP session id of the form 'A000'.
  */
-function sqimap_session_id($unique_id = false) {
-    global $data_dir, $username, $sqimap_session_id;
+function sqimap_session_id($unique_id = FALSE) {
+    static $sqimap_session_id = 1;
+
     if (!$unique_id) {
         return( sprintf("A%03d", $sqimap_session_id++) );
     } else {
@@ -73,10 +72,15 @@ function sqimap_run_command ($imap_stream, $query, $handle_errors, &$response,
    
         $read = sqimap_read_data ($imap_stream, $tag, $handle_errors, $response,
                                   $message, $query,$filter,$outputstream,$no_return);
+        if (empty($read)) {    //Imap server dropped its connection
+            $response = '';
+            $message = '';
+            return false;
+        }
         /* retrieve the response and the message */
         $response = $response[$tag];
         $message  = $message[$tag];
-        
+    
         if (!empty($read[$tag])) {
             return $read[$tag][0];
         } else {
@@ -202,6 +206,7 @@ function sqimap_fread($imap_stream,$iSize,$filter=false,
     if ($iSize < $iBufferSize) {
         $iBufferSize = $iSize;
     }
+
     $iRetrieved = 0;
     $results = '';
     $sRead = $sReadRem = '';
@@ -222,19 +227,10 @@ function sqimap_fread($imap_stream,$iSize,$filter=false,
             $sRead = $sReadRem . $sRead;
             $sReadRem = '';
         }
-        if (substr($sRead,-1) !== "\n") {  
-            $i = strrpos($sRead,"\n");
-            if ($i !== false && $iRetrieved<$iSize) {
-                ++$i;
-                $sReadRem = substr($sRead,$i);
-                $sRead = substr($sRead,0,$i);
-            } else if ($iLength && $iRetrieved<$iSize) { // linelength > received buffer
-                $sReadRem = $sRead;
-                $sRead = '';
-            }
-        } 
+
         if ($filter && $sRead) {
-           $filter($sRead);
+           // in case the filter is base64 decoding we return a remainder 
+           $sReadRem = $filter($sRead);
         }
         if ($outputstream && $sRead) {
            if (is_resource($outputstream)) {
@@ -252,6 +248,7 @@ function sqimap_fread($imap_stream,$iSize,$filter=false,
     return $results;       
 }        
 
+
 /**
  * Obsolete function, inform plugins that use it
  * @deprecated use sqimap_run_command or sqimap_run_command_list instead
@@ -280,11 +277,12 @@ function sqimap_read_data_list($imap_stream, $tag, $handle_errors,
  * Function to display an error related to an IMAP-query.
  * @param string title the caption of the error box
  * @param string query the query that went wrong
- * @param string message_title
- * @param string message the error message
+ * @param string message_title optional message title
+ * @param string message optional error message
+ * @param string $link an optional link to try again
  * @return void
  */
-function sqimap_error_box($title, $query = '', $message_title = '', $message = '')
+function sqimap_error_box($title, $query = '', $message_title = '', $message = '', $link = '')
 {
     global $color, $squirrelmail_language;
 
@@ -301,6 +299,8 @@ function sqimap_error_box($title, $query = '', $message_title = '', $message = '
     if ($message != '')
         $string .= htmlspecialchars($message);
     $string .= "</font><br>\n";
+    if ($link != '')
+        $string .= $link;
     error_box($string,$color);
 }
 
@@ -316,6 +316,7 @@ function sqimap_retrieve_imap_response($imap_stream, $tag, $handle_errors,
     $read = '';
     if (!is_array($message)) $message = array();
     if (!is_array($response)) $response = array();
+    $aResponse = '';
     $resultlist = array();
     $data = array();
     $read = sqimap_fgets($imap_stream);
@@ -469,9 +470,20 @@ function sqimap_retrieve_imap_response($imap_stream, $tag, $handle_errors,
     
     /* error processing in case $read is false */
     if ($read === false) {
-        unset($data);
-        sqimap_error_box(_("ERROR : Connection dropped by imap-server."), $query);
-        exit;
+        // try to retrieve an untagged bye respons from the results
+        $sResponse = array_pop($data);
+        if ($sResponse !== NULL && strpos($sResponse,'* BYE') !== false) {
+            if (!$handle_errors) {
+                $query = '';
+            }
+            sqimap_error_box(_("ERROR : Imap server closed the connection."), $query, _("Server responded:"),$sResponse);
+            echo '</body></html>';
+            exit;
+        } else if ($handle_errors) {
+            unset($data); 
+            sqimap_error_box(_("ERROR : Connection dropped by imap-server."), $query);
+            exit;
+        }
     }
     
     /* Set $resultlist array */
@@ -485,7 +497,6 @@ function sqimap_retrieve_imap_response($imap_stream, $tag, $handle_errors,
     /* Return result or handle errors */
     if ($handle_errors == false) {
         return $aResponse;
-        return( $resultlist ); //?? Why this?
     }
     switch ($response[$tag]) {
     case 'OK':
@@ -557,10 +568,10 @@ function sqimap_read_data ($imap_stream, $tag_uid, $handle_errors,
 function sqimap_create_stream($server,$port,$tls=false) {
     global $username, $use_imap_tls;
 
-    if ($use_imap_tls == true) {
+    if ($tls == true) {
         if ((check_php_version(4,3)) and (extension_loaded('openssl'))) {
             /* Use TLS by prefixing "tls://" to the hostname */
-            $server = 'tls://' . $imap_server_address;
+            $server = 'tls://' . $server;
         } else {
             require_once(SM_PATH . 'functions/display_messages.php');
             $string = "Unable to connect to IMAP server!<br>TLS is enabled, but this " .
@@ -764,6 +775,8 @@ function sqimap_capability($imap_stream, $capability='') {
         for ($i=2; $i < count($c); $i++) {
             $cap_list = explode('=', $c[$i]);
             if (isset($cap_list[1])) {
+                // FIX ME. capabilities can occure multiple times.
+                // THREAD=REFERENCES THREAD=ORDEREDSUBJECT
                 $sqimap_capabilities[$cap_list[0]] = $cap_list[1];
             } else {
                 $sqimap_capabilities[$cap_list[0]] = TRUE;
@@ -1026,27 +1039,26 @@ function parseAddress($address, $max=0) {
 
 /**
  * Returns the number of unseen messages in this folder.
+ * obsoleted by sqimap_status_messages !
  */
 function sqimap_unseen_messages ($imap_stream, $mailbox) {
-    $read_ary = sqimap_run_command ($imap_stream, 'STATUS ' . sqimap_encode_mailbox_name($mailbox) . ' (UNSEEN)', false, $result, $message);
-    $i = 0;
-    $regs = array(false, false);
-    while (isset($read_ary[$i])) {
-        if (ereg("UNSEEN ([0-9]+)", $read_ary[$i], $regs)) {
-            break;
-        }
-        $i++;
-    }
-    return $regs[1];
+    $aStatus = sqimap_status_messages($imap_stream,$mailbox,array('UNSEEN'));
+    return $aStatus['UNSEEN'];
 }
 
 /**
- * Returns the number of total/unseen/recent messages in this folder
+ * Returns the status items of a mailbox.
+ * Default it returns MESSAGES,UNSEEN and RECENT
+ * Supported status items are MESSAGES, UNSEEN, RECENT, UIDNEXT and UIDVALIDITY
  */
-function sqimap_status_messages ($imap_stream, $mailbox) {
-    $read_ary = sqimap_run_command ($imap_stream, 'STATUS ' . sqimap_encode_mailbox_name($mailbox) . ' (MESSAGES UNSEEN RECENT)', false, $result, $message);
+function sqimap_status_messages ($imap_stream, $mailbox, 
+                       $aStatusItems = array('MESSAGES','UNSEEN','RECENT')) {
+
+    $aStatusItems = implode(' ',$aStatusItems);
+    $read_ary = sqimap_run_command ($imap_stream, 'STATUS ' . sqimap_encode_mailbox_name($mailbox) .
+                                    " ($aStatusItems)", false, $result, $message);
     $i = 0;
-    $messages = $unseen = $recent = false;
+    $messages = $unseen = $recent = $uidnext = $uidvalidity = false;
     $regs = array(false,false);
     while (isset($read_ary[$i])) {
         if (preg_match('/UNSEEN\s+([0-9]+)/i', $read_ary[$i], $regs)) {
@@ -1058,9 +1070,19 @@ function sqimap_status_messages ($imap_stream, $mailbox) {
         if (preg_match('/RECENT\s+([0-9]+)/i', $read_ary[$i], $regs)) {
             $recent = $regs[1];
         }        
+        if (preg_match('/UIDNEXT\s+([0-9]+)/i', $read_ary[$i], $regs)) {
+            $uidnext = $regs[1];
+        }        
+        if (preg_match('/UIDVALIDITY\s+([0-9]+)/i', $read_ary[$i], $regs)) {
+            $uidvalidity = $regs[1];
+        }        
         $i++;
     }
-    return array('MESSAGES' => $messages, 'UNSEEN'=>$unseen, 'RECENT' => $recent);
+    return array('MESSAGES' => $messages, 
+                 'UNSEEN'=>$unseen, 
+                 'RECENT' => $recent,
+                 'UIDNEXT' => $uidnext,
+                 'UIDVALIDITY' => $uidvalidity);
 }