Typo fix
[squirrelmail.git] / functions / imap_mailbox.php
index d7898efe9cc911e52e46f6867290ec606da1b5d0..774d90e39b1f37ea3af4909dcf900198fec419cc 100755 (executable)
@@ -5,7 +5,7 @@
  *
  * This implements all functions that manipulate mailboxes
  *
- * @copyright 1999-2011 The SquirrelMail Project Team
+ * @copyright 1999-2020 The SquirrelMail Project Team
  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  * @version $Id$
  * @package squirrelmail
@@ -220,6 +220,7 @@ function isBoxBelow( $subbox, $parentbox ) {
  *
  * Since 1.4.3 hook supports more than one plugin.
  *
+//FIXME: make $subfolders_of_inbox_are_special a configuration setting in conf.pl and config.php
  * 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
@@ -409,10 +410,18 @@ function sqimap_mailbox_exists ($imap_stream, $mailbox, $mailboxlist=null) {
  * Before 1.3.0 used more arguments and returned data depended on those arguments.
  * @param stream $imap_stream imap connection resource
  * @param string $mailbox mailbox name
+ * @param boolean $handle_errors When TRUE, IMAP errors
+ *                               are handled herein, causing
+ *                               an error to be displayed on
+ *                               screen and execution to stop
+ *                               and when FALSE, error status
+ *                               is returned to the caller
+ *                               (OPTIONAL; default is TRUE)
  * @return array results of select command (on success - permanentflags, flags and rights)
+ *               (on failure (and when $handle_errors is false), empty array)
  * @since 1.0 or older
  */
-function sqimap_mailbox_select ($imap_stream, $mailbox) {
+function sqimap_mailbox_select ($imap_stream, $mailbox, $handle_errors=true) {
     if (empty($mailbox)) {
         return;
     }
@@ -431,14 +440,14 @@ function sqimap_mailbox_select ($imap_stream, $mailbox) {
      */
     if (strstr($mailbox, '../') || substr($mailbox, 0, 1) == '/') {
         global $oTemplate;
-        error_box(sprintf(_("Invalid mailbox name: %s"),htmlspecialchars($mailbox)));
+        error_box(sprintf(_("Invalid mailbox name: %s"),sm_encode_html_special_chars($mailbox)));
         sqimap_logout($imap_stream);
         $oTemplate->display('footer.tpl');
         die();
     }
 
     $read = sqimap_run_command($imap_stream, 'SELECT ' . sqimap_encode_mailbox_name($mailbox),
-                               true, $response, $message);
+                               $handle_errors, $response, $message);
     $result = array();
     for ($i = 0, $cnt = count($read); $i < $cnt; $i++) {
         if (preg_match('/^\*\s+OK\s\[(\w+)\s(\w+)\]/',$read[$i], $regs)) {
@@ -455,7 +464,7 @@ function sqimap_mailbox_select ($imap_stream, $mailbox) {
             }
         }
     }
-    if (!isset($result['PERMANENTFLAGS'])) {
+    if (!empty($result) && !isset($result['PERMANENTFLAGS'])) {
         $result['PERMANENTFLAGS'] = $result['FLAGS'];
     }
     if (preg_match('/^\[(.+)\]/',$message, $regs)) {
@@ -655,7 +664,10 @@ function sqimap_mailbox_parse ($line) {
     global $folder_prefix, $delimiter;
 
     /* Process each folder line */
-    for ($g = 0, $cnt = count($line); $g < $cnt; ++$g) {
+    ksort($line); // get physical ordering same as alphabetical sort we did before now (might be a better place for this)
+    foreach ($line as $g => $l)
+    // was this but array not guaranteed to be contiguous: for ($g = 0, $cnt = count($line); $g < $cnt; ++$g)
+    {
         /* Store the raw IMAP reply */
         if (isset($line[$g])) {
             $boxesall[$g]['raw'] = $line[$g];
@@ -783,7 +795,7 @@ function sqimap_mailbox_option_array($imap_stream, $folder_skip = 0, $boxes = 0,
                           // i18n: Name of Drafts folder
                           $box2 = $pad . _("Drafts");
                       } else {
-                          $box2 = str_replace('&amp;nbsp;&amp;nbsp;', '.&nbsp;', htmlspecialchars($boxes_part['formatted']));
+                          $box2 = str_replace('&amp;nbsp;&amp;nbsp;', '.&nbsp;', sm_encode_html_special_chars($boxes_part['formatted']));
                       }
                     break;
                   case SMPREF_MAILBOX_SELECT_INDENTED:
@@ -797,16 +809,16 @@ function sqimap_mailbox_option_array($imap_stream, $folder_skip = 0, $boxes = 0,
                           $pad = str_pad('',12 * (count(explode($delimiter,$boxes_part['unformatted-dm']))-1),'&nbsp;&nbsp;');
                           $box2 = $pad . _("Drafts");
                       } else {
-                          $box2 = str_replace('&amp;nbsp;&amp;nbsp;', '&nbsp;&nbsp;', htmlspecialchars($boxes_part['formatted']));
+                          $box2 = str_replace('&amp;nbsp;&amp;nbsp;', '&nbsp;&nbsp;', sm_encode_html_special_chars($boxes_part['formatted']));
                       }
                     break;
                   default:  /* default, long names, style = 0 */
-                    $box2 = str_replace(' ', '&nbsp;', htmlspecialchars(imap_utf7_decode_local($boxes_part['unformatted-disp'])));
+                    $box2 = str_replace(' ', '&nbsp;', sm_encode_html_special_chars(imap_utf7_decode_local($boxes_part['unformatted-disp'])));
                     break;
                 }
             }
             
-            $a[htmlspecialchars($box)] = $box2;
+            $a[sm_encode_html_special_chars($box)] = $box2;
         }
     }
     
@@ -842,13 +854,13 @@ function sqimap_mailbox_option_list($imap_stream, $show_selected = 0, $folder_sk
     
     $str = '';
     foreach ($boxes as $value=>$option) {
-        $lowerbox = strtolower(htmlspecialchars($value));
+        $lowerbox = strtolower(sm_encode_html_special_chars($value));
         $sel = false;
         if ($show_selected != 0) {
-            reset($show_selected);
-            while (!$sel && (list($x, $val) = each($show_selected))) {
-                if (strtolower($value) == strtolower(htmlspecialchars($val))) {
+            foreach ($show_selected as $val) {
+                if (strtolower($value) == strtolower(sm_encode_html_special_chars($val))) {
                     $sel = true;
+                    break;
                 }
             }
         }
@@ -1087,7 +1099,9 @@ function sqimap_get_mailboxes($imap_stream,$force=false,$show_only_subscribed=tr
     $cnt = count($boxesall);
     $used = array_pad($used,$cnt,false);
     $has_inbox = false;
-    for($k = 0; $k < $cnt; ++$k) {
+    foreach ($boxesall as $k => $b)
+    // was this but array not guaranteed to be contiguous: for($k = 0; $k < $cnt; ++$k)
+    {
         if (strtoupper($boxesall[$k]['unformatted']) == 'INBOX') {
             $boxesnew[] = $boxesall[$k];
             $used[$k] = true;
@@ -1116,7 +1130,9 @@ function sqimap_get_mailboxes($imap_stream,$force=false,$show_only_subscribed=tr
 
     /* List special folders and their subfolders, if requested. */
     if ($list_special_folders_first) {
-        for($k = 0; $k < $cnt; ++$k) {
+        foreach ($boxesall as $k => $b)
+        // was this but array not guaranteed to be contiguous: for($k = 0; $k < $cnt; ++$k)
+        {
             if (!$used[$k] && isSpecialMailbox($boxesall[$k]['unformatted'])) {
                 $boxesnew[] = $boxesall[$k];
                 $used[$k]   = true;
@@ -1125,7 +1141,9 @@ function sqimap_get_mailboxes($imap_stream,$force=false,$show_only_subscribed=tr
     }
 
     /* Find INBOX's children */
-    for($k = 0; $k < $cnt; ++$k) {
+    foreach ($boxesall as $k => $b)
+    // was this but array not guaranteed to be contiguous: for($k = 0; $k < $cnt; ++$k)
+    {
         $isboxbelow=isBoxBelow(strtoupper($boxesall[$k]['unformatted']),'INBOX');
         if (strtoupper($boxesall[$k]['unformatted']) == 'INBOX') {
             $is_inbox=1;
@@ -1140,7 +1158,9 @@ function sqimap_get_mailboxes($imap_stream,$force=false,$show_only_subscribed=tr
     }
 
     /* Rest of the folders */
-    for($k = 0; $k < $cnt; $k++) {
+    foreach ($boxesall as $k => $b)
+    // was this but array not guaranteed to be contiguous: for($k = 0; $k < $cnt; ++$k)
+    {
         if (!$used[$k]) {
             $boxesnew[] = $boxesall[$k];
         }