Reinstating fix for the "to" addresses. Hopefully won't need them for CC
[squirrelmail.git] / functions / imap_general.php
index f6c8e79b7a8c2dcceb37d1658e5cd1450b65a762..496e2dd84bc13e314bdebf1cd9341afb330b354f 100755 (executable)
@@ -3,10 +3,11 @@
     **  imap.php
     **
     **  This implements all functions that do general imap functions.
+    **
+    **  $Id$
     **/
 
    $imap_general_debug = false;
-   //$imap_general_debug = false;
 
    /******************************************************************************
     **  Reads the output from the IMAP stream.  If handle_errors is set to true,
    function sqimap_read_data ($imap_stream, $pre, $handle_errors, &$response, &$message) {
       global $color, $squirrelmail_language, $imap_general_debug;
 
-      $counter = 0;
-      do {
-          $data[$counter] = $read = fgets ($imap_stream, 4096);
-          if ($imap_general_debug) { echo "<small><tt><font color=cc0000>$read</font></tt></small><br>"; flush(); }
-          $counter++;
-      } while (! ereg("^$pre (OK|BAD|NO)(.*)$", $read, $regs));
+      $read = fgets($imap_stream, 9096);
+
+      if (ereg("^\\* [0-9]+ FETCH.*\\{([0-9]+)\\}", $read, $regs)) {
+         $size = $regs[1];
+      } else {
+         $size = 0;
+      }
+      
+      $data = Array();
+      
+      $continue = true;
+      while ($continue) {
+         // Continue if needed for this single line
+         while (strpos($read, "\n") === false) {
+            $read .= fgets($imap_stream, 9096);
+         }
+         if ($imap_general_debug) {
+            echo "<small><tt><font color=\"#CC0000\">$read</font></tt></small><br>\n";
+            flush();
+         }
+         
+         if (ereg("^$pre (OK|BAD|NO)(.*)$", $read, $regs)) {
+            if ($size) {
+               $dt = $data;
+               $dt[0] = $dt[count($dt)-1] = "";
+               $d = implode ("", $dt);
+               if (strlen($d) >= $size) {
+                  $continue = false;
+               } else {
+                  $data[] = $read;
+                  $read = fgets ($imap_stream, 9096);
+               }
+            } else {
+               $continue = false;
+            }
+         } else {
+            $data[] = $read;
+            $read = fgets ($imap_stream, 9096);
+         }
+      }
 
       $response = $regs[1];
       $message = trim($regs[2]);
       
       if ($imap_general_debug) echo "--<br>";
 
-      if ($handle_errors == true) {
-         if ($response == "NO") {
+      if ($handle_errors == false)
+          return $data;
+     
+      if ($response == "NO") {
+         // ignore this error from m$ exchange, it is not fatal (aka bug)
+         if (!ereg("command resulted in",$message)) { 
             set_up_language($squirrelmail_language);
             echo "<br><b><font color=$color[2]>\n";
             echo _("ERROR : Could not complete request.");
             echo _("Reason Given: ");
             echo $message . "</font><br>\n";
             exit;
-         } else if ($response == "BAD") {
-            set_up_language($squirrelmail_language);
-            echo "<br><b><font color=$color[2]>\n";
-            echo _("ERROR : Bad or malformed request.");
-            echo "</b><br>\n";
-            echo _("Server responded: ");
-            echo $message . "</font><br>\n";
-            exit;
          }
+      } else if ($response == "BAD") {
+         set_up_language($squirrelmail_language);
+         echo "<br><b><font color=$color[2]>\n";
+         echo _("ERROR : Bad or malformed request.");
+         echo "</b><br>\n";
+         echo _("Server responded: ");
+         echo $message . "</font><br>\n";
+         exit;
       }
       
       return $data;
@@ -58,7 +97,8 @@
    function sqimap_login ($username, $password, $imap_server_address, $imap_port, $hide) {
       global $color, $squirrelmail_language, $HTTP_ACCEPT_LANGUAGE, $onetimepad;
 
-      $imap_stream = fsockopen ($imap_server_address, $imap_port, &$error_number, &$error_string);
+      $imap_stream = fsockopen ($imap_server_address, $imap_port,
+         $error_number, $error_string, 15);
       $server_info = fgets ($imap_stream, 1024);
       
       // Decrypt the password
          exit;
       }
 
-      fputs ($imap_stream, "a001 LOGIN \"$username\" \"$password\"\r\n");
+      fputs ($imap_stream, "a001 LOGIN \"" . quotemeta($username) . 
+         "\" \"" . quotemeta($password) . "\"\r\n");
       $read = sqimap_read_data ($imap_stream, "a001", false, $response, $message);
 
       /** If the connection was not successful, lets see why **/
@@ -168,8 +209,11 @@ function sqimap_capability($imap_stream, $capability) {
 
                $c = explode(' ', $read[0]);
                for ($i=2; $i < count($c); $i++) {
-                       list($k, $v) = explode('=', $c[$i]);
-                       $sqimap_capabilities[$k] = ($v)?$v:TRUE;
+                       $cap_list = explode('=', $c[$i]);
+                       if (isset($cap_list[1]))
+                           $sqimap_capabilities[$cap_list[0]] = $cap_list[1];
+                       else
+                           $sqimap_capabilities[$cap_list[0]] = TRUE;
                }
        }
        return $sqimap_capabilities[$capability];
@@ -179,8 +223,14 @@ function sqimap_capability($imap_stream, $capability) {
     **  Returns the delimeter between mailboxes:  INBOX/Test, or INBOX.Test... 
     ******************************************************************************/
 function sqimap_get_delimiter ($imap_stream = false) {
-       global $imap_general_debug;
-    global $sqimap_delimiter;
+   global $imap_general_debug;
+   global $sqimap_delimiter;
+   global $optional_delimiter;
+
+   /* Use configured delimiter if set */
+   if((!empty($optional_delimiter)) && $optional_delimiter != "detect") {
+      return $optional_delimiter;
+   }
 
        /* Do some caching here */
     if (!$sqimap_delimiter) {