change default reply citation site, it's better to have by default an
[squirrelmail.git] / functions / imap_mailbox.php
index 01482bec9d525c77afaf75c835f242b68ccc60a8..24e85cd8dee99da45529840905b3bb9c96ebb022 100755 (executable)
@@ -3,7 +3,7 @@
 /**
  * imap_mailbox.php
  *
- * Copyright (c) 1999-2004 The SquirrelMail Project Team
+ * Copyright (c) 1999-2005 The SquirrelMail Project Team
  * Licensed under the GNU GPL. For full terms see the file COPYING.
  *
  * This impliments all functions that manipulate mailboxes
@@ -170,14 +170,11 @@ function isBoxBelow( $subbox, $parentbox ) {
       return false;
     }
     /* check for delimiter */
-        if (!substr($parentbox,-1) == $delimiter) {
-            $parentbox.=$delimiter;
-        }
-        if (substr($subbox,0,strlen($parentbox)) == $parentbox) {
-            return true;
-        } else {
-            return false;
-        }
+    if (substr($parentbox,-1) != $delimiter) {
+        $parentbox .= $delimiter;
+    }
+
+    return (substr($subbox,0,strlen($parentbox)) == $parentbox);
 }
 
 /**
@@ -344,6 +341,7 @@ function sqimap_mailbox_delete ($imap_stream, $mailbox) {
     } else {
         do_hook_function('rename_or_delete_folder', $args = array($mailbox, 'delete', ''));
         removePref($data_dir, $username, "thread_$mailbox");
+        removePref($data_dir, $username, "collapse_folder_$mailbox");
     }
 }
 
@@ -374,15 +372,18 @@ function sqimap_mailbox_rename( $imap_stream, $old_name, $new_name ) {
             $postfix = '';
         }
 
-        $boxesall = sqimap_mailbox_list($imap_stream);
+        $boxesall = sqimap_mailbox_list_all($imap_stream);
         $cmd = 'RENAME ' . sqimap_encode_mailbox_name($old_name) .
                      ' ' . sqimap_encode_mailbox_name($new_name);
         $data = sqimap_run_command($imap_stream, $cmd, true, $response, $message);
         sqimap_unsubscribe($imap_stream, $old_name.$postfix);
-        $oldpref = getPref($data_dir, $username, 'thread_'.$old_name.$postfix);
+        $oldpref_thread = getPref($data_dir, $username, 'thread_'.$old_name.$postfix);
+        $oldpref_collapse = getPref($data_dir, $username, 'collapse_folder_'.$old_name.$postfix);
         removePref($data_dir, $username, 'thread_'.$old_name.$postfix);
+        removePref($data_dir, $username, 'collapse_folder_'.$old_name.$postfix);
         sqimap_subscribe($imap_stream, $new_name.$postfix);
-        setPref($data_dir, $username, 'thread_'.$new_name.$postfix, $oldpref);
+        setPref($data_dir, $username, 'thread_'.$new_name.$postfix, $oldpref_thread);
+        setPref($data_dir, $username, 'collapse_folder_'.$new_name.$postfix, $oldpref_collapse);
         do_hook_function('rename_or_delete_folder',$args = array($old_name, 'rename', $new_name));
         $l = strlen( $old_name ) + 1;
         $p = 'unformatted';
@@ -390,16 +391,25 @@ function sqimap_mailbox_rename( $imap_stream, $old_name, $new_name ) {
         foreach ($boxesall as $box) {
             if (substr($box[$p], 0, $l) == $old_name . $delimiter) {
                 $new_sub = $new_name . $delimiter . substr($box[$p], $l);
+                /* With Cyrus IMAPd >= 2.0 rename is recursive, so don't check for errors here */
                 if ($imap_server_type == 'cyrus') {
                     $cmd = 'RENAME "' . $box[$p] . '" "' . $new_sub . '"';
-                    $data = sqimap_run_command($imap_stream, $cmd, true,
+                    $data = sqimap_run_command($imap_stream, $cmd, false,
                                                $response, $message);
                 }
-                sqimap_unsubscribe($imap_stream, $box[$p]);
-                $oldpref = getPref($data_dir, $username, 'thread_'.$box[$p]);
+                $was_subscribed = sqimap_mailbox_is_subscribed($imap_stream, $box[$p]);
+                if ( $was_subscribed ) {
+                    sqimap_unsubscribe($imap_stream, $box[$p]);
+                }
+                $oldpref_thread = getPref($data_dir, $username, 'thread_'.$box[$p]);
+                $oldpref_collapse = getPref($data_dir, $username, 'collapse_folder_'.$box[$p]);
                 removePref($data_dir, $username, 'thread_'.$box[$p]);
-                sqimap_subscribe($imap_stream, $new_sub);
-                setPref($data_dir, $username, 'thread_'.$new_sub, $oldpref);
+                removePref($data_dir, $username, 'collapse_folder_'.$box[$p]);
+                if ( $was_subscribed ) {
+                    sqimap_subscribe($imap_stream, $new_sub);
+                }
+                setPref($data_dir, $username, 'thread_'.$new_sub, $oldpref_thread);
+                setPref($data_dir, $username, 'collapse_folder_'.$new_sub, $oldpref_collapse);
                 do_hook_function('rename_or_delete_folder',
                                  $args = array($box[$p], 'rename', $new_sub));
             }
@@ -555,29 +565,31 @@ 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.
+ * @param resource $imap_stream imap connection resource
+ * @param boolean $force force update of mailbox listing. available since 1.4.2 and 1.5.0
+ * @return array list of mailboxes
  */
-
-
 function sqimap_mailbox_list($imap_stream, $force=false) {
     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, $imap_server_type;
+               $delimiter, $noselect_fix_enable, $imap_server_type,
+               $show_only_subscribed_folders;
         $inbox_subscribed = false;
         $listsubscribed = sqimap_capability($imap_stream,'LIST-SUBSCRIBED');
 
         require_once(SM_PATH . 'include/load_prefs.php');
 
-
-        if ($listsubscribed) {
+        if (!$show_only_subscribed_folders) {
+            $lsub = 'LIST';
+        } elseif ($listsubscribed) {
             $lsub = 'LIST (SUBSCRIBED)';
         } else {
             $lsub = 'LSUB';
         }
 
         if ($noselect_fix_enable) {
-
             $lsub_args = "$lsub \"$folder_prefix\" \"*%\"";
         } else {
             $lsub_args = "$lsub \"$folder_prefix\" \"*\"";
@@ -665,7 +677,17 @@ function sqimap_mailbox_list($imap_stream, $force=false) {
                 }
             }
         }
-       /* Rest of the folders */
+
+        /* Find INBOX's children */
+        for($k = 0; $k < $cnt; ++$k) {
+            if (!$used[$k] && isBoxBelow(strtolower($boxesall[$k]['unformatted']), 'inbox') && 
+            strtolower($boxesall[$k]['unformatted']) != 'inbox') {
+                $boxesnew[] = $boxesall[$k];
+                $used[$k] = true;
+            }   
+        }
+        
+        /* Rest of the folders */
         for($k = 0; $k < $cnt; $k++) {
             if (!$used[$k]) {
                 $boxesnew[] = $boxesall[$k];
@@ -749,15 +771,21 @@ function sqimap_mailbox_tree($imap_stream) {
     if (true) {
         global $data_dir, $username, $list_special_folders_first,
                $folder_prefix, $delimiter, $trash_folder, $move_to_trash,
-               $imap_server_type;
+               $imap_server_type, $show_only_subscribed_folders;
 
         $noselect = false;
         $noinferiors = false;
 
         require_once(SM_PATH . 'include/load_prefs.php');
 
+        if ($show_only_subscribed_folders) {
+            $lsub_cmd = 'LSUB';
+        } else {
+            $lsub_cmd = 'LIST';
+        }
+
         /* LSUB array */
-        $lsub_ary = sqimap_run_command ($imap_stream, "LSUB \"$folder_prefix\" \"*\"",
+        $lsub_ary = sqimap_run_command ($imap_stream, "$lsub_cmd \"$folder_prefix\" \"*\"",
                                         true, $response, $message);
         $lsub_ary = compact_mailboxes_response($lsub_ary);
 
@@ -765,12 +793,12 @@ function sqimap_mailbox_tree($imap_stream) {
         $has_inbox = false;
 
         for ($i = 0, $cnt = count($lsub_ary); $i < $cnt; $i++) {
-            if (preg_match("/^\*\s+LSUB.*\s\"?INBOX\"?[^(\/\.)].*$/i",$lsub_ary[$i])) {
+            if (preg_match("/^\*\s+$lsub_cmd.*\s\"?INBOX\"?[^(\/\.)].*$/i",$lsub_ary[$i])) {
                 $lsub_ary[$i] = strtoupper($lsub_ary[$i]);
                 // 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])) {
+                if (!preg_match("/\*\s+$lsub_cmd\s+\(.*\\\\NoSelect.*\).*/i",$lsub_ary[$i])) {
                     $has_inbox = true;
                 } else {
                     // remove the result and request it again  with a list
@@ -787,7 +815,7 @@ function sqimap_mailbox_tree($imap_stream) {
         if ($has_inbox == false) {
             // 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',
+            $inbox_ary = sqimap_run_command ($imap_stream, 'LIST "" "INBOX"',
                                              true, $response, $message);
             $inbox_ary = compact_mailboxes_response($inbox_ary);
             if (count($inbox_ary)) {
@@ -1050,4 +1078,4 @@ function sqimap_get_status_mbx_tree($imap_stream,&$mbx_tree) {
     }
 }
 
-?>
\ No newline at end of file
+?>