Allow administrators to configure subfolders of user INBOXes to be treated as special...
[squirrelmail.git] / functions / imap_mailbox.php
index df3692044b27eec2df832502402534d2c0bbe124..d7898efe9cc911e52e46f6867290ec606da1b5d0 100755 (executable)
@@ -5,7 +5,7 @@
  *
  * This implements all functions that manipulate mailboxes
  *
- * @copyright © 1999-2007 The SquirrelMail Project Team
+ * @copyright 1999-2011 The SquirrelMail Project Team
  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  * @version $Id$
  * @package squirrelmail
@@ -110,8 +110,7 @@ function compact_mailboxes_response($ary) {
      */
     for ($i = 0, $iCnt=count($ary); $i < $iCnt; $i++) {
         if (isset($ary[$i + 1]) && substr($ary[$i], -3) == "}\r\n") {
-            if (ereg("^(\\* [A-Z]+.*)\\{[0-9]+\\}([ \n\r\t]*)$",
-                 $ary[$i], $regs)) {
+            if (preg_match('/^(\* [A-Z]+.*)\{[0-9]+\}([ \n\r\t]*)$/', $ary[$i], $regs)) {
                 $ary[$i] = $regs[1] . '"' . addslashes(trim($ary[$i+1])) . '"' . $regs[2];
                 array_splice($ary, $i+1, 2);
             }
@@ -217,8 +216,15 @@ function isBoxBelow( $subbox, $parentbox ) {
  * Defines special mailboxes: given a mailbox name, it checks if this is a
  * "special" one: INBOX, Trash, Sent or Draft.
  *
- * Since 1.2.5 function includes special_mailbox hook.<br>
+ * Since 1.2.5 function includes special_mailbox hook.
+ *
  * Since 1.4.3 hook supports more than one plugin.
+ *
+ * Since 1.4.22/1.5.2, the administrator can add
+ * $subfolders_of_inbox_are_special = TRUE;
+ * to config/config_local.php and all subfolders
+ * of the INBOX will be treated as special.
+ *
  * @param string $box mailbox name
  * @param boolean $include_subs (since 1.5.2) if true, subfolders of system 
  *  folders are special. if false, subfolders are not special mailboxes 
@@ -227,7 +233,9 @@ function isBoxBelow( $subbox, $parentbox ) {
  * @since 1.2.3
  */
 function isSpecialMailbox($box,$include_subs=true) {
-    $ret = ( (strtolower($box) == 'inbox') ||
+    global $subfolders_of_inbox_are_special;
+    $ret = ( ($subfolders_of_inbox_are_special && isInboxMailbox($box,$include_subs)) ||
+             (!$subfolders_of_inbox_are_special && strtolower($box) == 'inbox') ||
              isTrashMailbox($box,$include_subs) || 
              isSentMailbox($box,$include_subs) || 
              isDraftMailbox($box,$include_subs) );
@@ -238,6 +246,23 @@ function isSpecialMailbox($box,$include_subs=true) {
     return $ret;
 }
 
+/**
+ * Detects if mailbox is the Inbox folder or subfolder of the Inbox
+ *
+ * @param string $box The mailbox name to test
+ * @param boolean $include_subs If true, subfolders of system folders
+ *                              are special.  If false, subfolders are
+ *                              not special mailboxes.
+ *
+ * @return boolean Whether this is the Inbox or a child thereof.
+ *
+ * @since 1.4.22
+ */
+function isInboxMailbox($box, $include_subs=TRUE) {
+   return ((strtolower($box) == 'inbox')
+        || ($include_subs && isBoxBelow(strtolower($box), 'inbox')));
+}
+
 /**
  * Detects if mailbox is a Trash folder or subfolder of Trash
  * @param string $box mailbox name
@@ -283,6 +308,34 @@ function isDraftMailbox($box,$include_subs=true) {
             ($include_subs && isBoxBelow($box, $draft_folder)) );
 }
 
+/**
+ * Is the given folder "sent-like" in nature?
+ *
+ * The most obvious use of this is to know what folders you usually
+ * want to show the To field instead of the From field on the mailbox list
+ *
+ * This function returns TRUE if the given folder is the sent
+ * folder (or any of its subfolders) or if it is the draft
+ * folder (or any of its subfolders)
+ *
+ * @param string $mailbox
+ *
+ * @return boolean See explanation above
+ *
+ */
+function handleAsSent($mailbox) {
+    global $handleAsSent_result;
+
+    /* First check if this is the sent or draft folder. */
+    $handleAsSent_result = isSentMailbox($mailbox) || isDraftMailbox($mailbox);
+
+    /* Then check the result of the handleAsSent hook. */
+    do_hook('check_handleAsSent_result', $mailbox);
+
+    /* And return the result. */
+    return $handleAsSent_result;
+}
+
 /**
  * Expunges a mailbox
  *
@@ -485,7 +538,8 @@ function sqimap_mailbox_delete ($imap_stream, $mailbox) {
             // subscribe again
             sqimap_subscribe ($imap_stream, $mailbox);
         } else {
-            do_hook('rename_or_delete_folder', $temp=array(&$mailbox, 'delete', ''));
+            $temp = array(&$mailbox, 'delete', '');
+            do_hook('rename_or_delete_folder', $temp);
             removePref($data_dir, $username, "thread_$mailbox");
             removePref($data_dir, $username, "collapse_folder_$mailbox");
         }
@@ -540,7 +594,8 @@ function sqimap_mailbox_rename( $imap_stream, $old_name, $new_name ) {
         sqimap_subscribe($imap_stream, $new_name.$postfix);
         setPref($data_dir, $username, 'thread_'.$new_name.$postfix, $oldpref_thread);
         setPref($data_dir, $username, 'collapse_folder_'.$new_name.$postfix, $oldpref_collapse);
-        do_hook('rename_or_delete_folder', $temp=array(&$old_name, 'rename', &$new_name));
+        $temp = array(&$old_name, 'rename', &$new_name);
+        do_hook('rename_or_delete_folder', $temp);
         $l = strlen( $old_name ) + 1;
         $p = 'unformatted';
 
@@ -566,7 +621,8 @@ function sqimap_mailbox_rename( $imap_stream, $old_name, $new_name ) {
                 }
                 setPref($data_dir, $username, 'thread_'.$new_sub, $oldpref_thread);
                 setPref($data_dir, $username, 'collapse_folder_'.$new_sub, $oldpref_collapse);
-                do_hook('rename_or_delete_folder', $temp=array(&$box[$p], 'rename', &$new_sub));
+                $temp = array(&$box[$p], 'rename', &$new_sub);
+                do_hook('rename_or_delete_folder', $temp);
             }
         }
     }
@@ -645,8 +701,7 @@ function sqimap_mailbox_parse ($line) {
         $boxesall[$g]['id'] = $g;
 
         $boxesall[$g]['flags'] = array();
-        if (isset($line[$g])) {
-            ereg("\(([^)]*)\)",$line[$g],$regs);
+        if (isset($line[$g]) && preg_match('/\(([^)]*)\)/',$line[$g],$regs) ) {
             /**
              * Since 1.5.1 flags are stored with RFC3501 naming
              * and also the old way for backwards compatibility