alecpl
2010-04-28 f0485adef1cd9b0d65bcbdd25bc546a2dff4095b
- Fix folder subscription checking (#1486684)
- Fix INBOX appears (sometimes) twice in mailbox list (#1486672)


4 files modified
122 ■■■■■ changed files
CHANGELOG 2 ●●●●● patch | view | raw | blame | history
program/include/rcmail.php patch | view | raw | blame | history
program/include/rcube_imap.php 19 ●●●●● patch | view | raw | blame | history
program/include/rcube_imap_generic.php 101 ●●●● patch | view | raw | blame | history
CHANGELOG
@@ -1,6 +1,8 @@
CHANGELOG RoundCube Webmail
===========================
- Fix folder subscription checking (#1486684)
- Fix INBOX appears (sometimes) twice in mailbox list (#1486672)
- Fix listing of attachments of some types e.g. "x-epoc/x-sisx-app" (#1486653)
- Fix DB Schema checking when some db_table_* options are not set (#1486654)
program/include/rcmail.php
program/include/rcube_imap.php
@@ -2482,10 +2482,10 @@
        $a_out = array();
        $a_mboxes = $this->_list_mailboxes($root, $filter);
        foreach ($a_mboxes as $mbox_row) {
            $name = $this->mod_mailbox($mbox_row, 'out');
            if (strlen($name))
        foreach ($a_mboxes as $idx => $mbox_row) {
            if ($name = $this->mod_mailbox($mbox_row, 'out'))
                $a_out[] = $name;
            unset($a_mboxes[$idx]);
        }
        // INBOX should always be available
@@ -2554,10 +2554,15 @@
        $a_mboxes = $this->conn->listMailboxes($this->mod_mailbox($root), '*');
        // modify names with root dir
        foreach ($a_mboxes as $mbox_name) {
        foreach ($a_mboxes as $idx => $mbox_name) {
            if ($name = $this->mod_mailbox($mbox_name, 'out'))
                $a_folders[] = $name;
            unset($a_mboxes[$idx]);
        }
        // INBOX should always be available
        if (!in_array('INBOX', $a_folders))
            array_unshift($a_folders, 'INBOX');
        // filter folders and sort them
        $a_folders = $this->_sort_mailbox_list($a_folders);
@@ -2770,13 +2775,13 @@
                return true;
            if ($subscription) {
                if ($a_folders = $this->conn->listSubscribed($this->mod_mailbox(''), $mbox_name))
                    return true;
                $a_folders = $this->conn->listSubscribed($this->mod_mailbox(''), $mbox_name);
            }
            else {
                $a_folders = $this->conn->listMailboxes($this->mod_mailbox(''), $mbox_name);
            }
    
            if (is_array($a_folders) && in_array($this->mod_mailbox($mbox_name), $a_folders))
            if (is_array($a_folders) && in_array($this->mod_mailbox($mbox_name), $a_folders)) {
                return true;
            }
        }
program/include/rcube_imap_generic.php
@@ -1612,75 +1612,38 @@
    function listMailboxes($ref, $mailbox)
    {
        if (empty($mailbox)) {
            $mailbox = '*';
        }
        if (empty($ref) && $this->rootdir) {
            $ref = $this->rootdir;
        }
        // send command
        if (!$this->putLine("lmb LIST \"". $this->escape($ref) ."\" \"". $this->escape($mailbox) ."\"")) {
            return false;
        }
        $i = 0;
        // get folder list
        do {
            $line = $this->readLine(500);
            $line = $this->multLine($line, true);
            $a = explode(' ', $line);
            if (($line[0] == '*') && ($a[1] == 'LIST')) {
                $line = rtrim($line);
                // split one line
                $a = rcube_explode_quoted_string(' ', $line);
                // last string is folder name
                $folders[$i] = preg_replace(array('/^"/', '/"$/'), '', $this->unEscape($a[count($a)-1]));
                // second from last is delimiter
                $delim = trim($a[count($a)-2], '"');
                // is it a container?
                $i++;
            }
        } while (!$this->startsWith($line, 'lmb', true));
        if (is_array($folders)) {
            if (!empty($ref)) {
                // if rootdir was specified, make sure it's the first element
                // some IMAP servers (i.e. Courier) won't return it
                if ($ref[strlen($ref)-1]==$delim)
                    $ref = substr($ref, 0, strlen($ref)-1);
                if ($folders[0]!=$ref)
                    array_unshift($folders, $ref);
            }
            return $folders;
        } else if ($this->parseResult($line) == 0) {
            return array('INBOX');
        }
        $this->error = $line;
        return false;
        return $this->_listMailboxes($ref, $mailbox, false);
    }
    function listSubscribed($ref, $mailbox)
    {
        return $this->_listMailboxes($ref, $mailbox, true);
    }
    private function _listMailboxes($ref, $mailbox, $subscribed=false)
    {
        if (empty($mailbox)) {
            $mailbox = '*';
        }
        if (empty($ref) && $this->rootdir) {
            $ref = $this->rootdir;
        }
        $folders = array();
        // send command
        if (!$this->putLine('lsb LSUB "'. $this->escape($ref) . '" "' . $this->escape($mailbox).'"')) {
            $this->error = "Couldn't send LSUB command";
            return false;
        if ($subscribed) {
            $key     = 'lsb';
            $command = 'LSUB';
        }
        else {
            $key     = 'lmb';
            $command = 'LIST';
        }
    
        $i = 0;
        // send command
        if (!$this->putLine($key." ".$command." \"". $this->escape($ref) ."\" \"". $this->escape($mailbox) ."\"")) {
            $this->error = "Couldn't send $command command";
            return false;
        }
    
        // get folder list
        do {
@@ -1688,37 +1651,23 @@
            $line = $this->multLine($line, true);
            $a    = explode(' ', $line);
        
            if (($line[0] == '*') && ($a[1] == 'LSUB' || $a[1] == 'LIST')) {
            if (($line[0] == '*') && ($a[1] == $command)) {
                $line = rtrim($line);
                // split one line
                $a = rcube_explode_quoted_string(' ', $line);
                // last string is folder name
                $folder = preg_replace(array('/^"/', '/"$/'), '', $this->UnEscape($a[count($a)-1]));
                // @TODO: do we need this check???
                if (!in_array($folder, $folders)) {
                    $folders[$i] = $folder;
                }
                $folders[] = preg_replace(array('/^"/', '/"$/'), '', $this->unEscape($a[count($a)-1]));
                // second from last is delimiter
                $delim = trim($a[count($a)-2], '"');
                // is it a container?
                $i++;
            }
        } while (!$this->startsWith($line, 'lsb', true));
        } while (!$this->startsWith($line, $key, true));
        if (is_array($folders)) {
            if (!empty($ref)) {
                // if rootdir was specified, make sure it's the first element
                // some IMAP servers (i.e. Courier) won't return it
                if ($ref[strlen($ref)-1]==$delim) {
                    $ref = substr($ref, 0, strlen($ref)-1);
                }
                if ($folders[0]!=$ref) {
                    array_unshift($folders, $ref);
                }
            }
            return $folders;
        } else if ($this->parseResult($line) == 0) {
            return array();
        }
        $this->error = $line;
        return false;
    }