phpdoc block
[squirrelmail.git] / functions / imap_mailbox.php
index 54577b8e23d159aa219036478793a4b711ee8894..51149e30ac84850fb571522ea60ced721448707b 100755 (executable)
@@ -8,8 +8,9 @@
  *
  * This impliments all functions that manipulate mailboxes
  *
- * $Id$
+ * @version $Id$
  * @package squirrelmail
+ * @subpackage imap
  */
 
 /** UTF7 support */
@@ -224,13 +225,12 @@ function isDraftMailbox($box) {
  * Expunges a mailbox, ie. delete all contents.
  */
 function sqimap_mailbox_expunge ($imap_stream, $mailbox, $handle_errors = true, $id='') {
-    global $uid_support;
     if ($id) {
         if (is_array($id)) {
             $id = sqimap_message_list_squisher($id);
         }
         $id = ' '.$id;
-        $uid = $uid_support;
+       $uid = TRUE;
     } else {
         $uid = false;
     }
@@ -257,13 +257,17 @@ function sqimap_mailbox_expunge ($imap_stream, $mailbox, $handle_errors = true,
  * won't be changed - the array element for the message
  * will just be removed.
  */
-function sqimap_mailbox_expunge_dmn($message_id)
+function sqimap_mailbox_expunge_dmn($message_id, $aMbxResponse, &$server_sort_array)
 {
     global $msgs, $msort, $sort, $imapConnection, 
-           $mailbox, $uid_support, $mbx_response, $auto_expunge, 
+           $mailbox, $auto_expunge, 
            $sort, $allow_server_sort, $thread_sort_messages, $allow_thread_sort,
            $username, $data_dir;
+    $cnt = 0;
 
+    if (!isset($sort) || $sort === false) {
+        sqgetGlobalVar('sort',$sort,SQ_GET);
+    }
     // Got to grab this out of prefs, since it isn't saved from mailbox_view.php
     if ($allow_thread_sort) {
         $thread_sort_messages = getPref($data_dir, $username, "thread_$mailbox",0); 
@@ -274,30 +278,48 @@ function sqimap_mailbox_expunge_dmn($message_id)
             break;   
         }
     }
+    
+    if ( isset($msgs) ) {
+        unset($msgs[$i]);
+        $msgs = array_values($msgs);
+        sqsession_register($msgs, 'msgs');
+    }
 
-    unset($msgs[$i]);
-    unset($msort[$i]);
-
-    $msgs = array_values($msgs);
-    $msort = array_values($msort);
-
-    sqsession_register($msgs, 'msgs');
-    sqsession_register($msort, 'msort');
+    if ( isset($msort) ) {
+        unset($msort[$i]);
+        $msort = array_values($msort);
+        sqsession_register($msort, 'msort');
+    }
 
     if ($auto_expunge) {
-         sqimap_mailbox_expunge($imapConnection, $mailbox, true);
+         $cnt = sqimap_mailbox_expunge($imapConnection, $mailbox, true);
+    } else {
+         return $cnt;
     }
 
     // And after all that mucking around, update the sort list!
     // Remind me why the hell we need those two arrays again?!
+
     if ( $allow_thread_sort && $thread_sort_messages ) {
         $server_sort_array = get_thread_sort($imapConnection);
     } elseif ( $allow_server_sort ) {
-        $server_sort_array = sqimap_get_sort_order($imapConnection, $sort, $mbx_response);
-    } elseif ( $uid_support ) {
-        $server_sort_array = sqimap_get_php_sort_order($imapConnection, $mbx_response);
+        if (is_array($server_sort_array)) { 
+            $key = array_search($message_id,$server_sort_array,true);
+            if ($key !== false) {
+                unset($server_sort_array[$key]);
+                $server_sort_array = array_values($server_sort_array);
+            } else {
+                $server_sort_array = sqimap_get_sort_order($imapConnection,$sort,$aMbxResponse);
+            }
+        } else {
+            $server_sort_array = sqimap_get_sort_order($imapConnection,$sort,$aMbxResponse);
+        }
+    } else {
+        $server_sort_array = sqimap_get_php_sort_order($imapConnection,
+                                                   $sort,$aMbxResponse);
     }
-
+    sqsession_register($server_sort_array,'server_sort_array');
+    return $cnt;
 }
 
 /**
@@ -316,8 +338,6 @@ function sqimap_mailbox_exists ($imap_stream, $mailbox) {
  * Selects a mailbox
  */
 function sqimap_mailbox_select ($imap_stream, $mailbox) {
-    global $auto_expunge;
-
     if ($mailbox == 'None') {
         return;
     }
@@ -344,9 +364,6 @@ function sqimap_mailbox_select ($imap_stream, $mailbox) {
         $result['RIGHTS']=$regs[1];
     }
 
-    if ($auto_expunge) {
-        $tmp = sqimap_run_command($imap_stream, 'EXPUNGE', false, $a, $b);
-    }
     return $result;
 }
 
@@ -368,10 +385,10 @@ function sqimap_mailbox_create ($imap_stream, $mailbox, $type) {
 /**
  * Subscribes to an existing folder.
  */
-function sqimap_subscribe ($imap_stream, $mailbox) {
+function sqimap_subscribe ($imap_stream, $mailbox,$debug=true) {
     $read_ary = sqimap_run_command($imap_stream, 'SUBSCRIBE ' .
                                    sqimap_encode_mailbox_name($mailbox),
-                                   true, $response, $message);
+                                   $debug, $response, $message);
 }
 
 /**
@@ -609,32 +626,43 @@ function sqimap_mailbox_option_list($imap_stream, $show_selected = 0, $folder_sk
  * Returns sorted mailbox lists in several different ways. 
  * See comment on sqimap_mailbox_parse() for info about the returned array.
  */
-function sqimap_mailbox_list($imap_stream) {
+
+
+function sqimap_mailbox_list($imap_stream, $force=false) {
     global $default_folder_prefix;
 
-    if (!isset($boxesnew)) {
+    if (!sqgetGlobalVar('boxesnew',$boxesnew,SQ_SESSION) || $force) {
         global $data_dir, $username, $list_special_folders_first,
                $folder_prefix, $trash_folder, $sent_folder, $draft_folder,
                $move_to_trash, $move_to_sent, $save_as_draft,
-               $delimiter, $noselect_fix_enable;
-
+               $delimiter, $noselect_fix_enable, $imap_server_type;
         $inbox_in_list = false;
         $inbox_subscribed = false;
+        $listsubscribed = sqimap_capability($imap_stream,'LIST-SUBSCRIBED');
 
         require_once(SM_PATH . 'include/load_prefs.php');
 
+
+        if ($listsubscribed) {
+            $lsub = 'LIST (SUBSCRIBED)';
+        } else {
+            $lsub = 'LSUB';
+        } 
+        
         if ($noselect_fix_enable) {
-            $lsub_args = "LSUB \"$folder_prefix\" \"*%\"";
+            
+            $lsub_args = "$lsub \"$folder_prefix\" \"*%\"";
         } else {
-            $lsub_args = "LSUB \"$folder_prefix\" \"*\"";
+            $lsub_args = "$lsub \"$folder_prefix\" \"*\"";
         }
         /* LSUB array */
         $lsub_ary = sqimap_run_command ($imap_stream, $lsub_args,
                                         true, $response, $message);
-        $lsub_ary = compact_mailboxes_response($lsub_ary);
+        $lsub_ary = compact_mailboxes_response($lsub_ary);       
 
         $sorted_lsub_ary = array();
         for ($i = 0, $cnt = count($lsub_ary);$i < $cnt; $i++) {
+
             $temp_mailbox_name = find_mailbox_name($lsub_ary[$i]);
             $sorted_lsub_ary[] = $temp_mailbox_name;
             if (!$inbox_subscribed && strtoupper($temp_mailbox_name) == 'INBOX') {
@@ -652,33 +680,37 @@ function sqimap_mailbox_list($imap_stream) {
          * call to retrieve the flags for the mailbox
            * Note: according RFC2060 an imap server may provide \NoSelect flags in the LSUB response.
            * in other words, we cannot rely on it.
-        */
+         */
         $sorted_list_ary = array();
-        for ($i=0; $i < count($sorted_lsub_ary); $i++) {
+ //       if (!$listsubscribed) {
+          for ($i=0; $i < count($sorted_lsub_ary); $i++) {
             if (substr($sorted_lsub_ary[$i], -1) == $delimiter) {
                 $mbx = substr($sorted_lsub_ary[$i], 0, strlen($sorted_lsub_ary[$i])-1);
             }
             else {
                 $mbx = $sorted_lsub_ary[$i];
             }
-            $mbx = stripslashes($mbx);
+
             $read = sqimap_run_command ($imap_stream, 'LIST "" ' . sqimap_encode_mailbox_name($mbx),
                                         true, $response, $message);
             $read = compact_mailboxes_response($read);
             if (isset($read[0])) {
                 $sorted_list_ary[$i] = $read[0];
             } else {
                 $sorted_list_ary[$i] = '';
             }
-        }
+          }
+ //       }
         /*
          * Just in case they're not subscribed to their inbox,
          * we'll get it for them anyway
          */
         if (!$inbox_subscribed) {
-            $inbox_ary = sqimap_run_command ($imap_stream, 'LIST "" INBOX',
+            $inbox_ary = sqimap_run_command ($imap_stream, 'LIST "" "INBOX"',
                                              true, $response, $message);
-            $sorted_list_ary[] = implode('', compact_mailboxes_response($inbox_ary));
+            $sorted_list_ary[] = implode('',compact_mailboxes_response($inbox_ary));
             $sorted_lsub_ary[] = find_mailbox_name($inbox_ary[0]);
         }
 
@@ -706,15 +738,14 @@ function sqimap_mailbox_list($imap_stream) {
                 }
             }
         }
-
-        /* Rest of the folders */
+       /* Rest of the folders */
         for($k = 0; $k < $cnt; $k++) {
             if (!$used[$k]) {
                 $boxesnew[] = $boxesall[$k];
             }
         }
+        sqsession_register($boxesnew,'boxesnew');
     }
-    
     return $boxesnew;
 }
 
@@ -789,7 +820,7 @@ function sqimap_mailbox_list_all($imap_stream) {
 
 function sqimap_mailbox_tree($imap_stream) {
     global $boxesnew, $default_folder_prefix, $unseen_notify, $unseen_type;
-    if (!isset($boxesnew)) {
+    if (true) {
 
         global $data_dir, $username, $list_special_folders_first,
                $folder_prefix, $delimiter, $trash_folder, $move_to_trash,
@@ -814,13 +845,32 @@ function sqimap_mailbox_tree($imap_stream) {
         for ($i = 0, $cnt = count($lsub_ary); $i < $cnt; $i++) {
             if (preg_match("/^\*\s+LSUB.*\s\"?INBOX\"?[^(\/\.)].*$/i",$lsub_ary[$i])) {
                $lsub_ary[$i] = strtoupper($lsub_ary[$i]);
-                $has_inbox = true;
+                // in case of an unsubscribed inbox an imap server can
+                // return the inbox in the lsub results with a \NoSelect 
+                // flag.
+                if (!preg_match("/\*\s+LSUB\s+\(.*\\\\NoSelect.*\).*/i",$lsub_ary[$i])) {
+                    $has_inbox = true;
+                } else {
+                    // remove the result and request it again  with a list
+                    // response at a later stage.
+                    unset($lsub_ary[$i]);
+                    // re-index the array otherwise the addition of the LIST 
+                    // response will fail in PHP 4.1.2 and probably other older versions
+                    $lsub_ary = array_values($lsub_ary);
+                }
                 break;
             }
         }
 
         if ($has_inbox == false) {
-            $lsub_ary[] = '* LSUB () NIL INBOX';
+            // do a list request for inbox because we should always show
+            // inbox even if the user isn't subscribed to it.
+            $inbox_ary = sqimap_run_command ($imap_stream, 'LIST "" INBOX',
+                                             true, $response, $message);
+            $inbox_ary = compact_mailboxes_response($inbox_ary);
+            if (count($inbox_ary)) {
+                $lsub_ary[] = $inbox_ary[0];
+            }
         }
 
         /*