diff options
author | alecpl <alec@alec.pl> | 2011-11-15 08:23:24 +0000 |
---|---|---|
committer | alecpl <alec@alec.pl> | 2011-11-15 08:23:24 +0000 |
commit | 89dcf540719af6fc7161c45d5bc11e171afa3697 (patch) | |
tree | 3fe30daf0195e6650a04440c1717be75aeff1213 /program/include | |
parent | 485c69d8123b076dc6543a7b8e7623476199b6a4 (diff) |
- Fix listing of folders in hidden namespaces (#1486796)
Diffstat (limited to 'program/include')
-rw-r--r-- | program/include/rcube_imap.php | 70 |
1 files changed, 67 insertions, 3 deletions
diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php index 6f2e3d8db..4fe39e1ac 100644 --- a/program/include/rcube_imap.php +++ b/program/include/rcube_imap.php @@ -3004,14 +3004,14 @@ class rcube_imap /** - * Private method for mailbox listing + * Private method for mailbox listing (LSUB) * * @param string $root Optional root folder * @param string $name Optional name pattern * @param mixed $filter Optional filter * @param string $rights Optional ACL requirements * - * @return array List of mailboxes/folders + * @return array List of subscribed folders * @see rcube_imap::list_mailboxes() * @access private */ @@ -3114,7 +3114,7 @@ class rcube_imap } else { // retrieve list of folders from IMAP server - $a_mboxes = $this->conn->listMailboxes($root, $name); + $a_mboxes = $this->_list_unsubscribed($root, $name); } if (!is_array($a_mboxes)) { @@ -3149,6 +3149,70 @@ class rcube_imap /** + * Private method for mailbox listing (LIST) + * + * @param string $root Optional root folder + * @param string $name Optional name pattern + * + * @return array List of folders + * @see rcube_imap::list_unsubscribed() + */ + private function _list_unsubscribed($root='', $name='*') + { + $result = $this->conn->listMailboxes($root, $name); + + if (!is_array($result)) { + return array(); + } + + // #1486796: some server configurations doesn't + // return folders in all namespaces, we'll try to detect that situation + // and ask for these namespaces separately + if ($root == '' && $name = '*') { + $delim = $this->get_hierarchy_delimiter(); + $namespace = $this->get_namespace(); + $search = array(); + + // build list of namespace prefixes + foreach ((array)$namespace as $ns) { + if (is_array($ns)) { + foreach ($ns as $ns_data) { + if ($len = strlen($ns_data[0])) { + $search = array('len' => $len, 'prefix' => $ns_data[0]); + } + } + } + } + + if (!empty($search)) { + // go through all folders detecting namespace usage + foreach ($list as $folder) { + foreach ($search as $idx => $s) { + if ($s['prefix'] == substr($folder, 0, $s['len'])) { + unset($search[$idx]); + } + } + if (empty($search)) { + break; + } + } + + // get folders in hidden namespaces and add to the result + foreach ($search as $s) { + $list = $this->conn->listMailboxes($s['prefix'], $name); + + if (!empty($list)) { + $result = array_merge($result, $list); + } + } + } + } + + return $result; + } + + + /** * Filter the given list of folders according to access rights */ private function filter_rights($a_folders, $rights) |