added step for copying config_default.php to config.php
[squirrelmail.git] / functions / imap.php
index 62bfe30b96ffdd112a4c92e5fddecfa23363fdbb..267bce91a9659f010d9ab9905b000498c241c490 100644 (file)
 
       if ($handle_errors == true) {
          if ($response == "NO") {
-            echo "<B><FONT COLOR=FF0000>ERROR</FONT><FONT COLOR=CC0000>:  Could not complete request.</B> </FONT><BR><FONT COLOR=CC0000>&nbsp;&nbsp;<B>Reason given:</B> $message</FONT><BR><BR>";
+            echo "<BR><B><FONT FACE=\"Arial,Helvetica\" COLOR=FF0000>ERROR</FONT FACE=\"Arial,Helvetica\"><FONT FACE=\"Arial,Helvetica\" COLOR=CC0000>:  Could not complete request.</B> </FONT FACE=\"Arial,Helvetica\"><BR><FONT FACE=\"Arial,Helvetica\" COLOR=CC0000>&nbsp;&nbsp;<B>Reason given:</B> $message</FONT FACE=\"Arial,Helvetica\"><BR><BR>";
             exit;
          } else if ($response == "BAD") {
-            echo "<B><FONT COLOR=FF0000>ERROR</FONT><FONT COLOR=CC0000>:  Bad or malformed request.</B></FONT><BR><FONT COLOR=CC0000>&nbsp;&nbsp;<B>Server responded:</B> $message</FONT><BR><BR>";
+            echo "<BR><B><FONT FACE=\"Arial,Helvetica\" COLOR=FF0000>ERROR</FONT FACE=\"Arial,Helvetica\"><FONT FACE=\"Arial,Helvetica\" COLOR=CC0000>:  Bad or malformed request.</B></FONT FACE=\"Arial,Helvetica\"><BR><FONT FACE=\"Arial,Helvetica\" COLOR=CC0000>&nbsp;&nbsp;<B>Server responded:</B> $message</FONT FACE=\"Arial,Helvetica\"><BR><BR>";
             exit;
          }
       }
       fputs($imapConnection, ". list \"\" \"\"\n");
       $read = fgets($imapConnection, 1024);
 
-      $pos = strrpos($read, "\"");
-      $read = substr($read, 0, $pos);
-
-      $pos = strrpos($read, "\"");
-      $read = substr($read, 0, $pos);
+      if (strrpos($read, "\"") == strlen($read)) {
+         $pos = strrpos($read, "\"");
+         $read = substr($read, 0, $pos);
 
+         $pos = strrpos($read, "\"");
+         $read = substr($read, 0, $pos);
+      } else {
+         $pos = strrpos($read, " ");
+         $read = substr($read, 0, $pos);
+      }
+   
       $pos = strrpos($read, "\"");
       $read = substr($read, 0, $pos);
 
       $serverInfo = fgets($imapConnection, 256);
  
       // login
-      fputs($imapConnection, "a001 LOGIN $username $key\n");
+      fputs($imapConnection, "a001 LOGIN \"$username\" \"$key\"\n");
       $read = fgets($imapConnection, 1024);
       if ($debug_login == true) {
          echo "SERVER SAYS: $read<BR>";
       }
 
+      /** If the login attempt was UNsuccessful, lets see why **/
       if (substr($read, 0, 7) != "a001 OK") {
          if (!$hide) {
             if (substr($read, 0, 8) == "a001 BAD") {
                exit;
             }
             else if (substr($read, 0, 7) == "a001 NO") {
-               echo "<BR>";
-               echo "<TABLE COLS=1 WIDTH=70% NOBORDER BGCOLOR=\"$color[4]\" ALIGN=CENTER>";
+               echo "<HTML><BODY BGCOLOR=FFFFFF><BR>";
+               echo "<TABLE COLS=1 WIDTH=70% NOBORDER BGCOLOR=FFFFFF ALIGN=CENTER>";
                echo "   <TR>";
-               echo "      <TD BGCOLOR=\"$color[0]\">";
-               echo "         <FONT FACE=\"Arial,Helvetica\" COLOR=\"$color[2]\"><B><CENTER>ERROR</CENTER></B></FONT>";
+               echo "      <TD BGCOLOR=\"DCDCDC\">";
+               echo "         <FONT FACE=\"Arial,Helvetica\" COLOR=CC0000><B><CENTER>ERROR</CENTER></B></FONT>";
                echo "   </TD></TR><TR><TD>";
                echo "      <CENTER><FONT FACE=\"Arial,Helvetica\"><BR>Unknown user or password incorrect.<BR><A HREF=\"login.php\" TARGET=_top>Click here to try again</A>.</FONT></CENTER>";
                echo "   </TD></TR>";
       $data = imapReadData($imapConnection, "1", false, $response, $message);
 
       if ($response == "NO") {
-         echo "<B><FONT COLOR=FF0000>ERROR</FONT><FONT COLOR=CC0000>:  Could not complete request.</B> </FONT><BR><FONT COLOR=CC0000>&nbsp;&nbsp;<B>Reason given:</B> $message</FONT><BR><BR>";
-         echo "Possible solutions:<BR><LI>You may need to specify that the folder is a subfolder of INBOX</LI>";
+         echo "<BR><B><FONT FACE=\"Arial,Helvetica\" COLOR=FF0000>ERROR</FONT FACE=\"Arial,Helvetica\"><FONT FACE=\"Arial,Helvetica\" COLOR=CC0000>:  Could not complete request.</B> </FONT FACE=\"Arial,Helvetica\"><BR><FONT FACE=\"Arial,Helvetica\" COLOR=CC0000>&nbsp;&nbsp;<B>Reason given:</B> $message</FONT FACE=\"Arial,Helvetica\"><BR><BR>";
+         echo "<FONT FACE=\"Arial,Helvetica\">Possible solutions:<BR><LI>You may need to specify that the folder is a subfolder of INBOX</LI>";
+         echo "<LI>Try renaming the folder to something different.</LI>";
          exit;
       } else if ($response == "BAD") {
-         echo "<B><FONT COLOR=FF0000>ERROR</FONT><FONT COLOR=CC0000>:  Bad or malformed request.</B></FONT><BR><FONT COLOR=CC0000>&nbsp;&nbsp;<B>Server responded:</B> $message</FONT><BR><BR>";
+         echo "<B><FONT FACE=\"Arial,Helvetica\" COLOR=FF0000>ERROR</FONT FACE=\"Arial,Helvetica\"><FONT FACE=\"Arial,Helvetica\" COLOR=CC0000>:  Bad or malformed request.</B></FONT FACE=\"Arial,Helvetica\"><BR><FONT FACE=\"Arial,Helvetica\" COLOR=CC0000>&nbsp;&nbsp;<B>Server responded:</B> $message</FONT FACE=\"Arial,Helvetica\"><BR><BR>";
          exit;
       }
+      fputs($imapConnection, "1 SUBSCRIBE \"$folder\"\n");
+      $data = imapReadData($imapConnection, "1", true, $response, $message);
    }
 
    function removeFolder($imapConnection, $folder) {
    }
 
    /** Sends back two arrays, boxesFormatted and boxesUnformatted **/
-   function getFolderList($imapConnection, &$boxesFormatted, &$boxesUnformatted, &$boxesRaw) {
-      fputs($imapConnection, "1 list \"\" *\n");
+   function getFolderList($imapConnection, &$boxes) {
+      require ("../config/config.php");
+      if (!function_exists("ary_sort"))
+         include("../functions/array.php");
+
+      /** First we get the inbox **/
+      fputs($imapConnection, "1 LIST \"\" INBOX\n");
       $str = imapReadData($imapConnection, "1", true, $response, $message);
+      $dm = findMailboxDelimeter($imapConnection);
+      $g = 0;
+      for ($i = 0;$i < count($str); $i++) {
+         $mailbox = chop($str[$i]);
+         if (substr(findMailboxName($mailbox), 0, 1) != ".") {
+            $boxes[$g]["RAW"] = $mailbox;
+
+            $mailbox = findMailboxName($mailbox);
+            $periodCount = countCharInString($mailbox, $dm);
+
+            // indent the correct number of spaces.
+            for ($j = 0;$j < $periodCount;$j++)
+               $boxes[$g]["FORMATTED"] = $boxes[$g]["FORMATTED"] . "&nbsp;&nbsp;";
+
+            $boxes[$g]["FORMATTED"] = $boxes[$g]["FORMATTED"] . readShortMailboxName($mailbox, $dm);
+            $boxes[$g]["UNFORMATTED"] = $mailbox;
+            $boxes[$g]["ID"] = $g;
+            $g++;
+         }
+      }
 
+      /** Next, we get all subscribed folders **/
+      fputs($imapConnection, "1 LSUB \"\" *\n");
+      $str = imapReadData($imapConnection, "1", true, $response, $message);
       $dm = findMailboxDelimeter($imapConnection);
       for ($i = 0;$i < count($str); $i++) {
          $mailbox = chop($str[$i]);
-         $boxesRaw[$i] = $mailbox;
+         if (substr(findMailboxName($mailbox), 0, 1) != ".") {
+            $boxes[$g]["RAW"] = $mailbox;
 
-         $mailbox = findMailboxName($mailbox);
-         $periodCount = countCharInString($mailbox, $dm);
+            $mailbox = findMailboxName($mailbox);
+            $periodCount = countCharInString($mailbox, $dm);
 
-         // indent the correct number of spaces.
-         for ($j = 0;$j < $periodCount;$j++)
-            $boxesFormatted[$i] = "$boxesFormatted[$i]&nbsp;&nbsp;";
+            // indent the correct number of spaces.
+            for ($j = 0;$j < $periodCount;$j++)
+               $boxes[$g]["FORMATTED"] = $boxes[$g]["FORMATTED"] . "&nbsp;&nbsp;";
 
-         $boxesFormatted[$i] = $boxesFormatted[$i] . readShortMailboxName($mailbox, $dm);
-         $boxesUnformatted[$i] = $mailbox;
+            $boxes[$g]["FORMATTED"] = $boxes[$g]["FORMATTED"] . readShortMailboxName($mailbox, $dm);
+            $boxes[$g]["UNFORMATTED"] = $mailbox;
+            $boxes[$g]["ID"] = $g;
+            $g++;
+         }
       }
+
+      $original = $boxes;
+
+      for ($i = 0; $i < count($original); $i++) {
+         $boxes[$i]["UNFORMATTED"] = strtolower($boxes[$i]["UNFORMATTED"]);
+      }
+
+      $boxes = ary_sort($boxes, "UNFORMATTED", 1);
+
+      for ($i = 0; $i < count($original); $i++) {
+         for ($j = 0; $j < count($original); $j++) {
+            if ($boxes[$i]["ID"] == $original[$j]["ID"]) {
+               $boxes[$i]["UNFORMATTED"] = $original[$j]["UNFORMATTED"];
+               $boxes[$i]["FORMATTED"] = $original[$j]["FORMATTED"];
+               $boxes[$i]["RAW"] = $original[$j]["RAW"];
+            }
+         }
+      }
+
+      for ($i = 0; $i < count($boxes); $i++) {
+         if ($boxes[$i]["UNFORMATTED"] == $special_folders[0]) {
+            $boxesnew[0]["FORMATTED"] = $boxes[$i]["FORMATTED"];
+            $boxesnew[0]["UNFORMATTED"] = trim($boxes[$i]["UNFORMATTED"]);
+            $boxesnew[0]["RAW"] = trim($boxes[$i]["RAW"]);
+            $boxes[$i]["USED"] = true;
+         }
+      }
+      if ($list_special_folders_first == true) {
+         for ($i = 0; $i < count($boxes); $i++) {
+            for ($j = 1; $j < count($special_folders); $j++) {
+               if (substr($boxes[$i]["UNFORMATTED"], 0, strlen($special_folders[$j])) == $special_folders[$j]) {
+                  $pos = count($boxesnew);
+                  $boxesnew[$pos]["FORMATTED"] = $boxes[$i]["FORMATTED"];
+                  $boxesnew[$pos]["RAW"] = trim($boxes[$i]["RAW"]);
+                  $boxesnew[$pos]["UNFORMATTED"] = trim($boxes[$i]["UNFORMATTED"]);
+                  $boxes[$i]["USED"] = true;
+               }
+            }
+         }
+      }
+      for ($i = 0; $i < count($boxes); $i++) {
+         if (($boxes[$i]["UNFORMATTED"] != $special_folders[0]) &&
+             ($boxes[$i]["UNFORMATTED"] != ".mailboxlist") &&
+             ($boxes[$i]["USED"] == false))  {
+            $pos = count($boxesnew);
+            $boxesnew[$pos]["FORMATTED"] = $boxes[$i]["FORMATTED"];
+            $boxesnew[$pos]["RAW"] = trim($boxes[$i]["RAW"]);
+            $boxesnew[$pos]["UNFORMATTED"] = trim($boxes[$i]["UNFORMATTED"]);
+            $boxes[$i]["USED"] = true;
+         }
+      }
+
+      $boxes = $boxesnew;
    }
 
    function deleteMessages($imapConnection, $a, $b, $numMessages, $trash_folder, $move_to_trash, $auto_expunge, $mailbox) {
       /** check if they would like to move it to the trash folder or not */
-      if ($move_to_trash == true) {
+      if (($move_to_trash == true) && (folderExists($imapConnection, $trash_folder))) {
          $success = copyMessages($imapConnection, $a, $b, $trash_folder);
          if ($success == true)
             setMessageFlag($imapConnection, $a, $b, "Deleted");
       } else {
          setMessageFlag($imapConnection, $a, $b, "Deleted");
       }
+      if ($auto_expunge == true)
+         expungeBox($imapConnection, $mailbox);
    }
+
    function stripComments($line) {
       if (strpos($line, ";")) {
          $line = substr($line, 0, strpos($line, ";"));
       }
       return $full_line;
    }
+
+   function folderExists($imapConnection, $folderName) {
+      getFolderList($imapConnection, $folders);
+      $found = false;
+      for ($i = 0; ($i < count($folders)) && (!$found); $i++) {
+         if ($folders[$i]["UNFORMATTED"] == $folderName)
+            $found = true;
+      }
+      return $found;
+   }
 ?>