alecpl
2011-11-15 89dcf540719af6fc7161c45d5bc11e171afa3697
- Fix listing of folders in hidden namespaces (#1486796)


2 files modified
71 ■■■■■ changed files
CHANGELOG 1 ●●●● patch | view | raw | blame | history
program/include/rcube_imap.php 70 ●●●●● patch | view | raw | blame | history
CHANGELOG
@@ -1,6 +1,7 @@
CHANGELOG Roundcube Webmail
===========================
- Fix listing of folders in hidden namespaces (#1486796)
- Don't consider \Noselect flag when building folders tree (#1488004)
- Fix sorting autocomplete results (#1488084)
- Add option to set session name (#1486433)
program/include/rcube_imap.php
@@ -3004,14 +3004,14 @@
    /**
     * 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 @@
        }
        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 @@
    /**
     * 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)