X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;ds=sidebyside;f=functions%2Fimap_mailbox.php;h=5f42748fc14fa5781f6ffb3a9b75b61a06a96081;hb=6b6c2e0605175300c0b4597f7e62348bb8bbf3b2;hp=4e496bd4e9d34377978c8e65c85c2f5c28ab5035;hpb=78bc908d4b41bc0c707237e8449fce2dc22e54c6;p=squirrelmail.git diff --git a/functions/imap_mailbox.php b/functions/imap_mailbox.php index 4e496bd4..5f42748f 100755 --- a/functions/imap_mailbox.php +++ b/functions/imap_mailbox.php @@ -22,15 +22,16 @@ class mailboxes { function addMbx($mbx, $delimiter, $start, $specialfirst) { $ary = explode($delimiter, $mbx->mailboxname_full); - $mbx_parent = &$this; + $mbx_parent =& $this; for ($i = $start, $c = count($ary)-1; $i < $c; $i++) { - $mbx_childs = &$mbx_parent->mbxs; + $mbx_childs =& $mbx_parent->mbxs; $found = false; if ($mbx_childs) { foreach ($mbx_childs as $key => $parent) { if ($parent->mailboxname_sub == $ary[$i]) { - $mbx_parent = &$mbx_parent->mbxs[$key]; + $mbx_parent =& $mbx_parent->mbxs[$key]; $found = true; + break; } } } @@ -83,7 +84,7 @@ function find_mailbox_name ($mailbox) { } function check_is_noselect ($lsub_line) { - return preg_match("/^\* LSUB \([^\)]*\\Noselect[^\)]*\)/i", $lsub_line); + return preg_match("/^\* (LSUB|LIST) \([^\)]*\\Noselect[^\)]*\)/i", $lsub_line); } /** @@ -706,7 +707,8 @@ function sqimap_mailbox_tree($imap_stream) { if (!isset($boxesnew)) { global $data_dir, $username, $list_special_folders_first, - $folder_prefix, $delimiter, $trash_folder, $move_to_trash; + $folder_prefix, $delimiter, $trash_folder, $move_to_trash, + $imap_server_type; $inbox_in_list = false; @@ -718,11 +720,11 @@ function sqimap_mailbox_tree($imap_stream) { $lsub_ary = sqimap_run_command ($imap_stream, "LSUB \"$folder_prefix\" \"*\"", true, $response, $message); - + /* Check to see if we have an INBOX */ $has_inbox = false; for ($i = 0, $cnt = count($lsub_ary); $i < $cnt; $i++) { - if (preg_match("/^\*\s+LSUB\s+\((.*)\)\s+\"(.{1})\"\s+\"INBOX\".*$/",$lsub_ary[$i])) { + if (preg_match("/^\*\s+LSUB\s+(.*)\"?INBOX\"?[^(\/\.)].*$/",$lsub_ary[$i])) { $has_inbox = true; break; } @@ -730,8 +732,13 @@ function sqimap_mailbox_tree($imap_stream) { if ($has_inbox == false) { $lsub_ibx = sqimap_run_command( $imap_stream, "LSUB \"\" \"INBOX\"", true, $response, $message ); - if (isset($lsub_ibx[0])) { - if (preg_match("/^\*\s+LSUB\s+\((.*)\)\s+\"(.{1})\"\s+\"INBOX\".*$/",$lsub_ibx[0])) { + if (isset($lsub_ibx[0]) && (preg_match("/^\*\s+LSUB\s+(.*)\"?INBOX\"?[^(\/\.)].*$/",$lsub_ibx[0]))) { + $lsub_ary[] = $lsub_ibx[0]; + } else { + $lsub_ibx = sqimap_run_command( $imap_stream, "LIST \"\" \"INBOX\"", true, $response, $message ); + if (preg_match("/^\*\s+LIST\s+(.*)\"?INBOX\"?[^(\/\.)].*$/",$lsub_ibx[0])) { + sqimap_run_command( $imap_stream, "SUBSCRIBE \"INBOX\"", true, $response, $message ); + $lsub_ibx[0] = str_replace("LIST","LSUB",$lsub_ibx[0]); $lsub_ary[] = $lsub_ibx[0]; } } @@ -743,6 +750,7 @@ function sqimap_mailbox_tree($imap_stream) { */ $sorted_lsub_ary = array(); $cnt = count($lsub_ary); + for ($i = 0; $i < $cnt; $i++) { /* * Workaround for EIMS @@ -756,6 +764,14 @@ function sqimap_mailbox_tree($imap_stream) { } $mbx = find_mailbox_name($lsub_ary[$i]); + + // Force a list for UW as it returns \NoSelect in LIST and not LSUB // + if ($imap_server_type == "uw") { + $tmp_str = sqimap_run_command( $imap_stream , "LIST \"\" \"$mbx\"" , true, $response, $message ); + if (isset($tmp_str[0])) { + $lsub_ary[$i] = $tmp_str[0]; + } + } $noselect = check_is_noselect($lsub_ary[$i]); if (substr($mbx, -1) == $delimiter) { $mbx = substr($mbx, 0, strlen($mbx) - 1); @@ -797,7 +813,7 @@ function sqimap_fill_mailbox_tree($mbx_ary, $mbxs=false) { 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; + $delimiter, $imap_server_type; $special_folders = array ('INBOX', $sent_folder, $draft_folder, $trash_folder); @@ -807,7 +823,8 @@ function sqimap_fill_mailbox_tree($mbx_ary, $mbxs=false) { $trail_del = false; $start = 0; - if (isset($folder_prefix) && $folder_prefix != '') { + + if (isset($folder_prefix) && ($folder_prefix != '')) { $start = substr_count($folder_prefix,$delimiter); if (strrpos($folder_prefix, $delimiter) == (strlen($folder_prefix)-1)) { $trail_del = true; @@ -828,11 +845,6 @@ function sqimap_fill_mailbox_tree($mbx_ary, $mbxs=false) { $mailbox = $mbx_ary[$i]['mbx']; switch ($mailbox) { case 'INBOX': - // $mailboxes IS the INBOX, change $mbx to refer to $mailboxes - // for unread count, attribute setting, etc. - unset($mbx); - $mbx =& $mailboxes; - $mbx->is_inbox = true; $mbx->is_special = true; break; @@ -867,12 +879,21 @@ function sqimap_fill_mailbox_tree($mbx_ary, $mbxs=false) { } $mbx->mailboxname_full = $mbx_ary[$i]['mbx']; - // Don't add INBOX to itself - if ( $mailbox != 'INBOX' ) - $mailboxes->addMbx($mbx, $delimiter, $start, $list_special_folders_first); + $mailboxes->addMbx($mbx, $delimiter, $start, $list_special_folders_first); } } + sqimap_utf7_decode_mbx_tree($mailboxes); return $mailboxes; } +function sqimap_utf7_decode_mbx_tree(&$mbx_tree) { + $mbx_tree->mailboxname_sub=imap_utf7_decode_local($mbx_tree->mailboxname_sub); + if ($mbx_tree->mbxs) { + $iCnt = count($mbx_tree->mbxs); + for ($i=0;$i<$iCnt;++$i) { + $mbxs_tree->mbxs[$i] = sqimap_utf7_decode_mbx_tree($mbx_tree->mbxs[$i]); + } + } +} + ?>