X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=functions%2Fimap_mailbox.php;h=9b2f2b84a54d6ce7da38cbb7cad3fc5d195edf5e;hb=adc3ea746a7853859d1e17cf60550992ccba011a;hp=944ea90545cbbc3435035f11beaddc1287b4da9e;hpb=701e7beed3baca980039f978c6d536dd91cae775;p=squirrelmail.git diff --git a/functions/imap_mailbox.php b/functions/imap_mailbox.php index 944ea905..9b2f2b84 100755 --- a/functions/imap_mailbox.php +++ b/functions/imap_mailbox.php @@ -5,7 +5,7 @@ * * This implements all functions that manipulate mailboxes * - * @copyright 1999-2014 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 @@ -410,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; } @@ -439,7 +447,7 @@ function sqimap_mailbox_select ($imap_stream, $mailbox) { } $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)) { @@ -456,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)) { @@ -656,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]; @@ -1088,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; @@ -1117,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; @@ -1126,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; @@ -1141,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]; }