X-Git-Url: https://vcs.fsf.org/?p=squirrelmail.git;a=blobdiff_plain;f=functions%2Fimap_mailbox.php;h=985d4d54a54f50f8c84307ebd7a38493be566b02;hp=96ad5238e636609e6c661f4acabbed24199c8c92;hb=3a634ed1d9902d54edf6921ee3c1b1c5e7b40db8;hpb=30460a05016c7e066ad7b28df7788539e4054a99 diff --git a/functions/imap_mailbox.php b/functions/imap_mailbox.php index 96ad5238..985d4d54 100755 --- a/functions/imap_mailbox.php +++ b/functions/imap_mailbox.php @@ -5,7 +5,7 @@ * * This implements all functions that manipulate mailboxes * - * @copyright 1999-2009 The SquirrelMail Project Team + * @copyright 1999-2016 The SquirrelMail Project Team * @license http://opensource.org/licenses/gpl-license.php GNU Public License * @version $Id$ * @package squirrelmail @@ -216,8 +216,16 @@ 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.
+ * Since 1.2.5 function includes special_mailbox hook. + * * 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 + * 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 @@ -226,7 +234,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) ); @@ -237,6 +247,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 @@ -405,7 +432,7 @@ 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(); @@ -629,7 +656,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]; @@ -757,7 +787,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('&nbsp;&nbsp;', '. ', htmlspecialchars($boxes_part['formatted'])); + $box2 = str_replace('&nbsp;&nbsp;', '. ', sm_encode_html_special_chars($boxes_part['formatted'])); } break; case SMPREF_MAILBOX_SELECT_INDENTED: @@ -771,16 +801,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),'  '); $box2 = $pad . _("Drafts"); } else { - $box2 = str_replace('&nbsp;&nbsp;', '  ', htmlspecialchars($boxes_part['formatted'])); + $box2 = str_replace('&nbsp;&nbsp;', '  ', sm_encode_html_special_chars($boxes_part['formatted'])); } break; default: /* default, long names, style = 0 */ - $box2 = str_replace(' ', ' ', htmlspecialchars(imap_utf7_decode_local($boxes_part['unformatted-disp']))); + $box2 = str_replace(' ', ' ', 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; } } @@ -816,12 +846,12 @@ 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))) { + if (strtolower($value) == strtolower(sm_encode_html_special_chars($val))) { $sel = true; } } @@ -1061,7 +1091,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; @@ -1090,7 +1122,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; @@ -1099,7 +1133,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; @@ -1114,7 +1150,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]; }