Minor cleanups
[squirrelmail.git] / functions / imap_mailbox.php
index 865d9f36e1b2379ce1c0dcc9df5f39cffa5bbbb9..4faef27bd36a3fef123a1ac50f000a1a665ffcae 100755 (executable)
@@ -8,8 +8,9 @@
  *
  * This impliments all functions that manipulate mailboxes
  *
  *
  * This impliments all functions that manipulate mailboxes
  *
- * $Id$
+ * @version $Id$
  * @package squirrelmail
  * @package squirrelmail
+ * @subpackage imap
  */
 
 /** UTF7 support */
  */
 
 /** UTF7 support */
@@ -19,12 +20,12 @@ global $boxesnew;
 
 /**
  * Mailboxes class
 
 /**
  * Mailboxes class
- * 
- * FIXME. This class should be extracted and placed in a separate file that 
+ *
+ * FIXME. This class should be extracted and placed in a separate file that
  * can be included before we start the session. That makes caching of the tree
  * can be included before we start the session. That makes caching of the tree
- * possible. On a refresh mailboxes from left_main.php the only function that 
- * should be called is the sqimap_get_status_mbx_tree. In case of subscribe 
- * / rename / delete / new we have to create methods for adding/changing the 
+ * possible. On a refresh mailboxes from left_main.php the only function that
+ * should be called is the sqimap_get_status_mbx_tree. In case of subscribe
+ * / rename / delete / new we have to create methods for adding/changing the
  * mailbox in the mbx_tree without the need for a refresh.
  * @package squirrelmail
 */
  * mailbox in the mbx_tree without the need for a refresh.
  * @package squirrelmail
 */
@@ -32,7 +33,7 @@ global $boxesnew;
 class mailboxes {
     var $mailboxname_full = '', $mailboxname_sub= '', $is_noselect = false, $is_noinferiors = false,
         $is_special = false, $is_root = false, $is_inbox = false, $is_sent = false,
 class mailboxes {
     var $mailboxname_full = '', $mailboxname_sub= '', $is_noselect = false, $is_noinferiors = false,
         $is_special = false, $is_root = false, $is_inbox = false, $is_sent = false,
-        $is_trash = false, $is_draft = false,  $mbxs = array(), 
+        $is_trash = false, $is_draft = false,  $mbxs = array(),
         $unseen = false, $total = false;
 
     function addMbx($mbx, $delimiter, $start, $specialfirst) {
         $unseen = false, $total = false;
 
     function addMbx($mbx, $delimiter, $start, $specialfirst) {
@@ -85,14 +86,14 @@ function sortSpecialMbx($a, $b) {
     } else {
         $bcmp = '2' . $b->mailboxname_full;
     }
     } else {
         $bcmp = '2' . $b->mailboxname_full;
     }
-    return strnatcasecmp($acmp, $bcmp);        
+    return strnatcasecmp($acmp, $bcmp);
 }
 
 function compact_mailboxes_response($ary)
 {
     /*
      * Workaround for mailboxes returned as literal
 }
 
 function compact_mailboxes_response($ary)
 {
     /*
      * Workaround for mailboxes returned as literal
-     * FIXME : Doesn't work if the mailbox name is multiple lines 
+     * FIXME : Doesn't work if the mailbox name is multiple lines
      * (larger then fgets buffer)
      */
     for ($i = 0, $iCnt=count($ary); $i < $iCnt; $i++) {
      * (larger then fgets buffer)
      */
     for ($i = 0, $iCnt=count($ary); $i < $iCnt; $i++) {
@@ -156,13 +157,13 @@ function readMailboxParent($haystack, $needle) {
     return( $ret );
 }
 
     return( $ret );
 }
 
-/** 
+/**
  * Check if $subbox is below the specified $parentbox
  */
 function isBoxBelow( $subbox, $parentbox ) {
     global $delimiter;
  * Check if $subbox is below the specified $parentbox
  */
 function isBoxBelow( $subbox, $parentbox ) {
     global $delimiter;
-    /* 
-     * Eliminate the obvious mismatch, where the 
+    /*
+     * Eliminate the obvious mismatch, where the
      * subfolder path is shorter than that of the potential parent
      */
     if ( strlen($subbox) < strlen($parentbox) ) {
      * subfolder path is shorter than that of the potential parent
      */
     if ( strlen($subbox) < strlen($parentbox) ) {
@@ -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='') {
  * 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;
     if ($id) {
         if (is_array($id)) {
             $id = sqimap_message_list_squisher($id);
         }
         $id = ' '.$id;
-        $uid = $uid_support;
+       $uid = TRUE;
     } else {
         $uid = false;
     }
     } else {
         $uid = false;
     }
@@ -248,58 +248,6 @@ function sqimap_mailbox_expunge ($imap_stream, $mailbox, $handle_errors = true,
     return $cnt;
 }
 
     return $cnt;
 }
 
-/**
- * Expunge specified message, updated $msgs and $msort
- * 
- * Until Marc and I come up with a better way to maintain 
- * these stupid arrays, we'll use this wrapper function to 
- * remove the message with the matching UID .. the order
- * won't be changed - the array element for the message
- * will just be removed.
- */
-function sqimap_mailbox_expunge_dmn($message_id)
-{
-    global $msgs, $msort, $sort, $imapConnection, 
-           $mailbox, $uid_support, $mbx_response, $auto_expunge, 
-           $sort, $allow_server_sort, $thread_sort_messages, $allow_thread_sort,
-           $username, $data_dir;
-
-    // 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); 
-    }
-
-    for ($i = 0; $i < count($msort); $i++) {
-        if ($msgs[$i]['ID'] == $message_id) {
-            break;   
-        }
-    }
-
-    unset($msgs[$i]);
-    unset($msort[$i]);
-
-    $msgs = array_values($msgs);
-    $msort = array_values($msort);
-
-    sqsession_register($msgs, 'msgs');
-    sqsession_register($msort, 'msort');
-
-    if ($auto_expunge) {
-         sqimap_mailbox_expunge($imapConnection, $mailbox, true);
-    }
-
-    // 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);
-    }
-
-}
-
 /**
  * Checks whether or not the specified mailbox exists
  */
 /**
  * Checks whether or not the specified mailbox exists
  */
@@ -316,8 +264,6 @@ function sqimap_mailbox_exists ($imap_stream, $mailbox) {
  * Selects a mailbox
  */
 function sqimap_mailbox_select ($imap_stream, $mailbox) {
  * Selects a mailbox
  */
 function sqimap_mailbox_select ($imap_stream, $mailbox) {
-    global $auto_expunge;
-
     if ($mailbox == 'None') {
         return;
     }
     if ($mailbox == 'None') {
         return;
     }
@@ -333,20 +279,20 @@ function sqimap_mailbox_select ($imap_stream, $mailbox) {
         } else {
             if (preg_match("/PERMANENTFLAGS(.*)/i",$read[$i], $regs)) {
                 $regs[1]=trim(preg_replace (  array ("/\(/","/\)/","/\]/") ,'', $regs[1])) ;
         } else {
             if (preg_match("/PERMANENTFLAGS(.*)/i",$read[$i], $regs)) {
                 $regs[1]=trim(preg_replace (  array ("/\(/","/\)/","/\]/") ,'', $regs[1])) ;
-                $result['PERMANENTFLAGS'] = $regs[1];
+                $result['PERMANENTFLAGS'] = explode(' ',strtolower($regs[1]));
             } else if (preg_match("/FLAGS(.*)/i",$read[$i], $regs)) {
                 $regs[1]=trim(preg_replace (  array ("/\(/","/\)/") ,'', $regs[1])) ;
             } else if (preg_match("/FLAGS(.*)/i",$read[$i], $regs)) {
                 $regs[1]=trim(preg_replace (  array ("/\(/","/\)/") ,'', $regs[1])) ;
-                $result['FLAGS'] = $regs[1];
+                $result['FLAGS'] = explode(' ',strtolower($regs[1]));
             }
         }
     }
             }
         }
     }
+    if (!isset($result['PERMANENTFLAGS'])) {
+        $result['PERMANENTFLAGS'] = $result['FLAGS'];
+    }
     if (preg_match('/^\[(.+)\]/',$message, $regs)) {
     if (preg_match('/^\[(.+)\]/',$message, $regs)) {
-        $result['RIGHTS']=$regs[1];
+        $result['RIGHTS']=strtoupper($regs[1]);
     }
 
     }
 
-    if ($auto_expunge) {
-        $tmp = sqimap_run_command($imap_stream, 'EXPUNGE', false, $a, $b);
-    }
     return $result;
 }
 
     return $result;
 }
 
@@ -368,10 +314,10 @@ function sqimap_mailbox_create ($imap_stream, $mailbox, $type) {
 /**
  * Subscribes to an existing folder.
  */
 /**
  * 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),
     $read_ary = sqimap_run_command($imap_stream, 'SUBSCRIBE ' .
                                    sqimap_encode_mailbox_name($mailbox),
-                                   true, $response, $message);
+                                   $debug, $response, $message);
 }
 
 /**
 }
 
 /**
@@ -524,7 +470,7 @@ function sqimap_mailbox_parse ($line, $line_lsub) {
         $boxesall[$g]['flags'] = array();
         if (isset($line[$g])) {
             ereg("\(([^)]*)\)",$line[$g],$regs);
         $boxesall[$g]['flags'] = array();
         if (isset($line[$g])) {
             ereg("\(([^)]*)\)",$line[$g],$regs);
-            // FIXME Flags do contain the \ character. \NoSelect \NoInferiors 
+            // FIXME Flags do contain the \ character. \NoSelect \NoInferiors
             // and $MDNSent <= last one doesn't have the \
             // It's better to follow RFC3501 instead of using our own naming.
             $flags = trim(strtolower(str_replace('\\', '',$regs[1])));
             // and $MDNSent <= last one doesn't have the \
             // It's better to follow RFC3501 instead of using our own naming.
             $flags = trim(strtolower(str_replace('\\', '',$regs[1])));
@@ -539,7 +485,7 @@ function sqimap_mailbox_parse ($line, $line_lsub) {
 /**
  * Returns list of options (to be echoed into select statement
  * based on available mailboxes and separators
 /**
  * Returns list of options (to be echoed into select statement
  * based on available mailboxes and separators
- * Caller should surround options with <SELECT..> </SELECT> and
+ * Caller should surround options with <select ...> </select> and
  * any formatting.
  *   $imap_stream - $imapConnection to query for mailboxes
  *   $show_selected - array containing list of mailboxes to pre-select (0 if none)
  * any formatting.
  *   $imap_stream - $imapConnection to query for mailboxes
  *   $show_selected - array containing list of mailboxes to pre-select (0 if none)
@@ -554,7 +500,7 @@ function sqimap_mailbox_parse ($line, $line_lsub) {
  *                 \NoSelect and \NoInferiors
  *   $use_long_format - override folder display preference and always show full folder name.
  */
  *                 \NoSelect and \NoInferiors
  *   $use_long_format - override folder display preference and always show full folder name.
  */
-function sqimap_mailbox_option_list($imap_stream, $show_selected = 0, $folder_skip = 0, $boxes = 0, 
+function sqimap_mailbox_option_list($imap_stream, $show_selected = 0, $folder_skip = 0, $boxes = 0,
                                     $flag = 'noselect', $use_long_format = false ) {
     global $username, $data_dir;
     $mbox_options = '';
                                     $flag = 'noselect', $use_long_format = false ) {
     global $username, $data_dir;
     $mbox_options = '';
@@ -569,19 +515,20 @@ function sqimap_mailbox_option_list($imap_stream, $show_selected = 0, $folder_sk
     }
 
     foreach ($boxes as $boxes_part) {
     }
 
     foreach ($boxes as $boxes_part) {
-        if ($flag == NULL || !in_array($flag, $boxes_part['flags'])) {
+        if ($flag == NULL || (is_array($boxes_part['flags'])
+                      && !in_array($flag, $boxes_part['flags']))) {
             $box = $boxes_part['unformatted'];
 
             if ($folder_skip != 0 && in_array($box, $folder_skip) ) {
                 continue;
             }
             $box = $boxes_part['unformatted'];
 
             if ($folder_skip != 0 && in_array($box, $folder_skip) ) {
                 continue;
             }
-            $lowerbox = strtolower($box); 
+            $lowerbox = strtolower($box);
             // mailboxes are casesensitive => inbox.sent != inbox.Sent
             // nevermind, to many dependencies this should be fixed!
             // mailboxes are casesensitive => inbox.sent != inbox.Sent
             // nevermind, to many dependencies this should be fixed!
-         
+
             if (strtolower($box) == 'inbox') { // inbox is special and not casesensitive
                 $box2 = _("INBOX");
             if (strtolower($box) == 'inbox') { // inbox is special and not casesensitive
                 $box2 = _("INBOX");
-            } else { 
+            } else {
                 switch ($shorten_box_names)
                 {
                   case 2:   /* delimited, style = 2 */
                 switch ($shorten_box_names)
                 {
                   case 2:   /* delimited, style = 2 */
@@ -596,9 +543,9 @@ function sqimap_mailbox_option_list($imap_stream, $show_selected = 0, $folder_sk
                 }
             }
             if ($show_selected != 0 && in_array($lowerbox, $show_selected) ) {
                 }
             }
             if ($show_selected != 0 && in_array($lowerbox, $show_selected) ) {
-                $mbox_options .= '<OPTION VALUE="' . htmlspecialchars($box) .'" SELECTED>'.$box2.'</OPTION>' . "\n";
+                $mbox_options .= '<option value="' . htmlspecialchars($box) .'" selected="selected">'.$box2.'</option>' . "\n";
             } else {
             } else {
-                $mbox_options .= '<OPTION VALUE="' . htmlspecialchars($box) .'">'.$box2.'</OPTION>' . "\n";
+                $mbox_options .= '<option value="' . htmlspecialchars($box) .'">'.$box2.'</option>' . "\n";
             }
         }
     }
             }
         }
     }
@@ -606,27 +553,37 @@ function sqimap_mailbox_option_list($imap_stream, $show_selected = 0, $folder_sk
 }
 
 /**
 }
 
 /**
- * Returns sorted mailbox lists in several different ways. 
+ * Returns sorted mailbox lists in several different ways.
  * See comment on sqimap_mailbox_parse() for info about the returned array.
  */
  * 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;
 
     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,
         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;
         $inbox_in_list = false;
         $inbox_subscribed = false;
+        $listsubscribed = sqimap_capability($imap_stream,'LIST-SUBSCRIBED');
 
         require_once(SM_PATH . 'include/load_prefs.php');
 
 
         require_once(SM_PATH . 'include/load_prefs.php');
 
+
+        if ($listsubscribed) {
+            $lsub = 'LIST (SUBSCRIBED)';
+        } else {
+            $lsub = 'LSUB';
+        }
+
         if ($noselect_fix_enable) {
         if ($noselect_fix_enable) {
-            $lsub_args = "LSUB \"$folder_prefix\" \"*%\"";
+
+            $lsub_args = "$lsub \"$folder_prefix\" \"*%\"";
         } else {
         } else {
-            $lsub_args = "LSUB \"$folder_prefix\" \"*\"";
+            $lsub_args = "$lsub \"$folder_prefix\" \"*\"";
         }
         /* LSUB array */
         $lsub_ary = sqimap_run_command ($imap_stream, $lsub_args,
         }
         /* LSUB array */
         $lsub_ary = sqimap_run_command ($imap_stream, $lsub_args,
@@ -635,6 +592,7 @@ function sqimap_mailbox_list($imap_stream) {
 
         $sorted_lsub_ary = array();
         for ($i = 0, $cnt = count($lsub_ary);$i < $cnt; $i++) {
 
         $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') {
             $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 +610,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.
          * 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();
         $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];
             }
             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 = sqimap_run_command ($imap_stream, 'LIST "" ' . sqimap_encode_mailbox_name($mbx),
                                         true, $response, $message);
+
             $read = compact_mailboxes_response($read);
             $read = compact_mailboxes_response($read);
+
             if (isset($read[0])) {
                 $sorted_list_ary[$i] = $read[0];
             } else {
                 $sorted_list_ary[$i] = '';
             }
             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) {
         /*
          * 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);
                                              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]);
         }
 
             $sorted_lsub_ary[] = find_mailbox_name($inbox_ary[0]);
         }
 
@@ -706,15 +668,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];
             }
         }
         for($k = 0; $k < $cnt; $k++) {
             if (!$used[$k]) {
                 $boxesnew[] = $boxesall[$k];
             }
         }
+        sqsession_register($boxesnew,'boxesnew');
     }
     }
-    
     return $boxesnew;
 }
 
     return $boxesnew;
 }
 
@@ -789,7 +750,7 @@ function sqimap_mailbox_list_all($imap_stream) {
 
 function sqimap_mailbox_tree($imap_stream) {
     global $boxesnew, $default_folder_prefix, $unseen_notify, $unseen_type;
 
 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,
 
         global $data_dir, $username, $list_special_folders_first,
                $folder_prefix, $delimiter, $trash_folder, $move_to_trash,
@@ -812,19 +773,38 @@ function sqimap_mailbox_tree($imap_stream) {
         $has_inbox = false;
 
         for ($i = 0, $cnt = count($lsub_ary); $i < $cnt; $i++) {
         $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.*\s\"?INBOX\"?[^(\/\.)].*$/i",$lsub_ary[$i])) {
                $lsub_ary[$i] = strtoupper($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) {
                 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];
+            }
         }
 
         /*
         }
 
         /*
-         * Section about removing the last element was removed 
+         * Section about removing the last element was removed
          * We don't return "* OK" anymore from sqimap_read_data
          */
 
          * We don't return "* OK" anymore from sqimap_read_data
          */
 
@@ -834,14 +814,14 @@ function sqimap_mailbox_tree($imap_stream) {
             $mbx = find_mailbox_name($lsub_ary[$i]);
 
             // only do the noselect test if !uw, is checked later. FIX ME see conf.pl setting
             $mbx = find_mailbox_name($lsub_ary[$i]);
 
             // only do the noselect test if !uw, is checked later. FIX ME see conf.pl setting
-            if ($imap_server_type != "uw") {                
+            if ($imap_server_type != "uw") {
                 $noselect = check_is_noselect($lsub_ary[$i]);
                 $noinferiors = check_is_noinferiors($lsub_ary[$i]);
             }
             if (substr($mbx, -1) == $delimiter) {
                 $mbx = substr($mbx, 0, strlen($mbx) - 1);
             }
                 $noselect = check_is_noselect($lsub_ary[$i]);
                 $noinferiors = check_is_noinferiors($lsub_ary[$i]);
             }
             if (substr($mbx, -1) == $delimiter) {
                 $mbx = substr($mbx, 0, strlen($mbx) - 1);
             }
-            $sorted_lsub_ary[] = array ('mbx' => $mbx, 'noselect' => $noselect, 'noinferiors' => $noinferiors); 
+            $sorted_lsub_ary[] = array ('mbx' => $mbx, 'noselect' => $noselect, 'noinferiors' => $noinferiors);
         }
         // FIX ME this requires a config setting inside conf.pl instead of checking on server type
         if ($imap_server_type == "uw") {
         }
         // FIX ME this requires a config setting inside conf.pl instead of checking on server type
         if ($imap_server_type == "uw") {
@@ -852,7 +832,7 @@ function sqimap_mailbox_tree($imap_stream) {
                $mbx = stripslashes($aMbx['mbx']);
                sqimap_prepare_pipelined_query('LIST "" ' . sqimap_encode_mailbox_name($mbx), $tag, $aQuery, false);
                $aTag[$tag] = $mbx;
                $mbx = stripslashes($aMbx['mbx']);
                sqimap_prepare_pipelined_query('LIST "" ' . sqimap_encode_mailbox_name($mbx), $tag, $aQuery, false);
                $aTag[$tag] = $mbx;
-           } 
+           }
            $sorted_lsub_ary = array();
            // execute all the queries at once
            $aResponse = sqimap_run_pipelined_command ($imap_stream, $aQuery, false, $aServerResponse, $aServerMessage);
            $sorted_lsub_ary = array();
            // execute all the queries at once
            $aResponse = sqimap_run_pipelined_command ($imap_stream, $aQuery, false, $aServerResponse, $aServerMessage);
@@ -908,7 +888,7 @@ function sqimap_fill_mailbox_tree($mbx_ary, $mbxs=false,$imap_stream) {
             $mbx = new mailboxes();
             $mailbox = $mbx_ary[$i]['mbx'];
 
             $mbx = new mailboxes();
             $mailbox = $mbx_ary[$i]['mbx'];
 
-            /* 
+            /*
                 sent subfolders messes up using existing code as subfolders
                 were marked, but the parents were ordered somewhere else in
                 the list, despite having "special folders at top" option set.
                 sent subfolders messes up using existing code as subfolders
                 were marked, but the parents were ordered somewhere else in
                 the list, despite having "special folders at top" option set.
@@ -951,7 +931,7 @@ function sqimap_fill_mailbox_tree($mbx_ary, $mbxs=false,$imap_stream) {
             $mbx->is_special |= ($mbx->is_draft = isDraftMailbox($mailbox));
             if (!$mbx->is_special)
                 $mbx->is_special = boolean_hook_function('special_mailbox', $mailbox, 1);
             $mbx->is_special |= ($mbx->is_draft = isDraftMailbox($mailbox));
             if (!$mbx->is_special)
                 $mbx->is_special = boolean_hook_function('special_mailbox', $mailbox, 1);
-            
+
             if (isset($mbx_ary[$i]['unseen'])) {
                 $mbx->unseen = $mbx_ary[$i]['unseen'];
             }
             if (isset($mbx_ary[$i]['unseen'])) {
                 $mbx->unseen = $mbx_ary[$i]['unseen'];
             }
@@ -979,7 +959,7 @@ function sqimap_fill_mailbox_tree($mbx_ary, $mbxs=false,$imap_stream) {
 }
 
 function sqimap_utf7_decode_mbx_tree(&$mbx_tree) {
 }
 
 function sqimap_utf7_decode_mbx_tree(&$mbx_tree) {
-   if (strtoupper($mbx_tree->mailboxname_sub) == 'INBOX')
+   if (strtoupper($mbx_tree->mailboxname_full) == 'INBOX')
        $mbx_tree->mailboxname_sub = _("INBOX");
    else
        $mbx_tree->mailboxname_sub = imap_utf7_decode_local($mbx_tree->mailboxname_sub);
        $mbx_tree->mailboxname_sub = _("INBOX");
    else
        $mbx_tree->mailboxname_sub = imap_utf7_decode_local($mbx_tree->mailboxname_sub);
@@ -1001,7 +981,7 @@ function sqimap_tree_to_ref_array(&$mbx_tree,&$aMbxs) {
          sqimap_tree_to_ref_array($mbx_tree->mbxs[$i],$aMbxs);
       }
    }
          sqimap_tree_to_ref_array($mbx_tree->mbxs[$i],$aMbxs);
       }
    }
-} 
+}
 
 function sqimap_get_status_mbx_tree($imap_stream,&$mbx_tree) {
     global $unseen_notify, $unseen_type, $trash_folder,$move_to_trash;
 
 function sqimap_get_status_mbx_tree($imap_stream,&$mbx_tree) {
     global $unseen_notify, $unseen_type, $trash_folder,$move_to_trash;
@@ -1053,7 +1033,7 @@ function sqimap_get_status_mbx_tree($imap_stream,&$mbx_tree) {
             $oMbx =& $aMbxs[$i];
             if (strtoupper($oMbx->mailboxname_full) == 'INBOX' ||
                ($move_to_trash && $oMbx->mailboxname_full == $trash_folder)) {
             $oMbx =& $aMbxs[$i];
             if (strtoupper($oMbx->mailboxname_full) == 'INBOX' ||
                ($move_to_trash && $oMbx->mailboxname_full == $trash_folder)) {
-                 if ($unseen_type == 2 || 
+                 if ($unseen_type == 2 ||
                    ($oMbx->mailboxname_full == $trash_folder && $move_to_trash)) {
                     $aStatus = sqimap_status_messages($imap_stream,$oMbx->mailboxname_full);
                     $oMbx->unseen = $aStatus['UNSEEN'];
                    ($oMbx->mailboxname_full == $trash_folder && $move_to_trash)) {
                     $aStatus = sqimap_status_messages($imap_stream,$oMbx->mailboxname_full);
                     $oMbx->unseen = $aStatus['UNSEEN'];
@@ -1072,7 +1052,7 @@ function sqimap_get_status_mbx_tree($imap_stream,&$mbx_tree) {
                 }
             }
         }
                 }
             }
         }
-    }       
-} 
+    }
+}
 
 
-?>
+?>
\ No newline at end of file