Aleksander Machniak
2014-07-30 5b592d17ef078ebb101b47402dc6c3381249ba78
program/lib/Roundcube/rcube_imap.php
@@ -110,13 +110,13 @@
    /**
     * Connect to an IMAP server
     *
     * @param  string   $host    Host to connect
     * @param  string   $user    Username for IMAP account
     * @param  string   $pass    Password for IMAP account
     * @param  integer  $port    Port to connect to
     * @param  string   $use_ssl SSL schema (either ssl or tls) or null if plain connection
     * @param string  $host    Host to connect
     * @param string  $user    Username for IMAP account
     * @param string  $pass    Password for IMAP account
     * @param integer $port    Port to connect to
     * @param string  $use_ssl SSL schema (either ssl or tls) or null if plain connection
     *
     * @return boolean  TRUE on success, FALSE on failure
     * @return boolean True on success, False on failure
     */
    public function connect($host, $user, $pass, $port=143, $use_ssl=null)
    {
@@ -761,7 +761,7 @@
        $page = $page ? $page : $this->list_page;
        // use saved message set
        if ($this->search_string && $folder == $this->folder) {
        if ($this->search_string) {
            return $this->list_search_messages($folder, $page, $slice);
        }
@@ -1848,7 +1848,7 @@
            $this->struct_charset = $this->structure_charset($structure);
        }
        $headers->ctype = strtolower($headers->ctype);
        $headers->ctype = @strtolower($headers->ctype);
        // Here we can recognize malformed BODYSTRUCTURE and
        // 1. [@TODO] parse the message in other way to create our own message structure
@@ -2990,7 +2990,7 @@
     * @param array  $result  Reference to folders list
     * @param string $type    Listing type (ext-subscribed, subscribed or all)
     */
    private function list_folders_update(&$result, $type = null)
    protected function list_folders_update(&$result, $type = null)
    {
        $namespace = $this->get_namespace();
        $search    = array();
@@ -3067,14 +3067,15 @@
    /**
     * Get mailbox quota information
     * added by Nuny
     *
     * @param string $folder Folder name
     *
     * @return mixed Quota info or False if not supported
     */
    public function get_quota()
    public function get_quota($folder = null)
    {
        if ($this->get_capability('QUOTA') && $this->check_connection()) {
            return $this->conn->getQuota();
            return $this->conn->getQuota($folder);
        }
        return false;
@@ -3297,12 +3298,14 @@
        // request \Subscribed flag in LIST response as performance improvement for folder_exists()
        $folders = $this->conn->listMailboxes('', '*', array('SUBSCRIBED'), array('SPECIAL-USE'));
        foreach ($folders as $folder) {
            if ($flags = $this->conn->data['LIST'][$folder]) {
                foreach ($types as $type) {
                    if (in_array($type, $flags)) {
                        $type           = strtolower(substr($type, 1));
                        $special[$type] = $folder;
        if (!empty($folders)) {
            foreach ($folders as $folder) {
                if ($flags = $this->conn->data['LIST'][$folder]) {
                    foreach ($types as $type) {
                        if (in_array($type, $flags)) {
                            $type           = strtolower(substr($type, 1));
                            $special[$type] = $folder;
                        }
                    }
                }
            }
@@ -4142,19 +4145,15 @@
     */
    public function sort_folder_list($a_folders, $skip_default = false)
    {
        $delimiter = $this->get_hierarchy_delimiter();
        $specials  = array_merge(array('INBOX'), array_values($this->get_special_folders()));
        $folders   = array_flip($a_folders);
        $folders   = array();
        // convert names to UTF-8 and skip folders starting with '.'
        foreach ($a_folders as $folder) {
            if ($folder[0] != '.') {
                // for better performance skip encoding conversion
                // if the string does not look like UTF7-IMAP
                $folders[$folder] = strpos($folder, '+') === false ? $folder : rcube_charset::convert($folder, 'UTF7-IMAP');
            }
            else {
                unset($folders[$idx]);
                $folders[$folder] = strpos($folder, '&') === false ? $folder : rcube_charset::convert($folder, 'UTF7-IMAP');
            }
        }
@@ -4170,29 +4169,37 @@
        // force the type of folder name variable (#1485527)
        $folders  = array_map('strval', $folders);
        $out      = array();
        // finally we must put special folders on top and rebuild the list
        // to move their subfolders where they belong...
        $specials = array_unique(array_intersect($specials, $folders));
        $head     = array();
        $folders  = array_merge($specials, array_diff($folders, $specials));
        // place default folders on top
        foreach ($specials as $special) {
            $prefix = $special . $delimiter;
        $this->sort_folder_specials(null, $folders, $specials, $out);
            foreach ($folders as $idx => $folder) {
                if ($folder === $special) {
                    $head[] = $special;
                    unset($folders[$idx]);
                }
                // put subfolders of default folders on their place...
                else if (strpos($folder, $prefix) === 0) {
                    $head[] = $folder;
                    unset($folders[$idx]);
        return $out;
    }
    /**
     * Recursive function to put subfolders of special folders in place
     */
    protected function sort_folder_specials($folder, &$list, &$specials, &$out)
    {
        while (list($key, $name) = each($list)) {
            if ($folder === null || strpos($name, $folder.$this->delimiter) === 0) {
                $out[] = $name;
                unset($list[$key]);
                if (!empty($specials) && ($found = array_search($name, $specials)) !== false) {
                    unset($specials[$found]);
                    $this->sort_folder_specials($name, $list, $specials, $out);
                }
            }
        }
        return array_merge($head, $folders);
        reset($list);
    }
    /**
     * Callback for uasort() that implements correct
@@ -4200,9 +4207,8 @@
     */
    protected function sort_folder_comparator($str1, $str2)
    {
        $delimiter = $this->get_hierarchy_delimiter();
        $path1     = explode($delimiter, $str1);
        $path2     = explode($delimiter, $str2);
        $path1 = explode($this->delimiter, $str1);
        $path2 = explode($this->delimiter, $str2);
        foreach ($path1 as $idx => $folder1) {
            $folder2 = $path2[$idx];