- Fix folder subscription checking (#1486684)

- Fix INBOX appears (sometimes) twice in mailbox list (#1486672)
release-0.6
alecpl 15 years ago
parent e2402ef99a
commit f0485adef1

@ -1,6 +1,8 @@
CHANGELOG RoundCube Webmail 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 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) - Fix DB Schema checking when some db_table_* options are not set (#1486654)

@ -640,7 +640,7 @@ class rcmail
else { else {
raise_error(array( raise_error(array(
'code' => 600, 'type' => 'php', 'code' => 600, 'type' => 'php',
'file' => __FILE__, 'line' => __LINE__, 'file' => __FILE__, 'line' => __LINE__,
'message' => "Failed to create a user record. Maybe aborted by a plugin?" 'message' => "Failed to create a user record. Maybe aborted by a plugin?"
), true, false); ), true, false);
} }

@ -2482,10 +2482,10 @@ class rcube_imap
$a_out = array(); $a_out = array();
$a_mboxes = $this->_list_mailboxes($root, $filter); $a_mboxes = $this->_list_mailboxes($root, $filter);
foreach ($a_mboxes as $mbox_row) { foreach ($a_mboxes as $idx => $mbox_row) {
$name = $this->mod_mailbox($mbox_row, 'out'); if ($name = $this->mod_mailbox($mbox_row, 'out'))
if (strlen($name))
$a_out[] = $name; $a_out[] = $name;
unset($a_mboxes[$idx]);
} }
// INBOX should always be available // INBOX should always be available
@ -2554,11 +2554,16 @@ class rcube_imap
$a_mboxes = $this->conn->listMailboxes($this->mod_mailbox($root), '*'); $a_mboxes = $this->conn->listMailboxes($this->mod_mailbox($root), '*');
// modify names with root dir // 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')) if ($name = $this->mod_mailbox($mbox_name, 'out'))
$a_folders[] = $name; $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 // filter folders and sort them
$a_folders = $this->_sort_mailbox_list($a_folders); $a_folders = $this->_sort_mailbox_list($a_folders);
return $a_folders; return $a_folders;
@ -2708,7 +2713,7 @@ class rcube_imap
foreach ($a_mboxes as $mbox_name) { foreach ($a_mboxes as $mbox_name) {
$mailbox = $this->mod_mailbox($mbox_name); $mailbox = $this->mod_mailbox($mbox_name);
$sub_mboxes = $this->conn->listMailboxes($this->mod_mailbox(''), $sub_mboxes = $this->conn->listMailboxes($this->mod_mailbox(''),
$mbox_name . $this->delimiter . '*'); $mbox_name . $this->delimiter . '*');
// unsubscribe mailbox before deleting // unsubscribe mailbox before deleting
$this->conn->unsubscribe($mailbox); $this->conn->unsubscribe($mailbox);
@ -2770,13 +2775,13 @@ class rcube_imap
return true; return true;
if ($subscription) { if ($subscription) {
if ($a_folders = $this->conn->listSubscribed($this->mod_mailbox(''), $mbox_name)) $a_folders = $this->conn->listSubscribed($this->mod_mailbox(''), $mbox_name);
return true;
} }
else { else {
$a_folders = $this->conn->listMailboxes($this->mod_mailbox(''), $mbox_name); $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; return true;
} }
} }

@ -1611,6 +1611,16 @@ class rcube_imap_generic
} }
function listMailboxes($ref, $mailbox) function listMailboxes($ref, $mailbox)
{
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)) { if (empty($mailbox)) {
$mailbox = '*'; $mailbox = '*';
@ -1620,109 +1630,48 @@ class rcube_imap_generic
$ref = $this->rootdir; $ref = $this->rootdir;
} }
if ($subscribed) {
$key = 'lsb';
$command = 'LSUB';
}
else {
$key = 'lmb';
$command = 'LIST';
}
// send command // send command
if (!$this->putLine("lmb LIST \"". $this->escape($ref) ."\" \"". $this->escape($mailbox) ."\"")) { if (!$this->putLine($key." ".$command." \"". $this->escape($ref) ."\" \"". $this->escape($mailbox) ."\"")) {
$this->error = "Couldn't send $command command";
return false; return false;
} }
$i = 0;
// get folder list // get folder list
do { do {
$line = $this->readLine(500); $line = $this->readLine(500);
$line = $this->multLine($line, true); $line = $this->multLine($line, true);
$a = explode(' ', $line);
$a = explode(' ', $line); if (($line[0] == '*') && ($a[1] == $command)) {
if (($line[0] == '*') && ($a[1] == 'LIST')) {
$line = rtrim($line); $line = rtrim($line);
// split one line // split one line
$a = rcube_explode_quoted_string(' ', $line); $a = rcube_explode_quoted_string(' ', $line);
// last string is folder name // last string is folder name
$folders[$i] = preg_replace(array('/^"/', '/"$/'), '', $this->unEscape($a[count($a)-1])); $folders[] = preg_replace(array('/^"/', '/"$/'), '', $this->unEscape($a[count($a)-1]));
// second from last is delimiter // second from last is delimiter
$delim = trim($a[count($a)-2], '"'); $delim = trim($a[count($a)-2], '"');
// is it a container?
$i++;
} }
} while (!$this->startsWith($line, 'lmb', true)); } while (!$this->startsWith($line, $key, true));
if (is_array($folders)) { 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; return $folders;
} else if ($this->parseResult($line) == 0) { } else if ($this->parseResult($line) == 0) {
return array('INBOX'); return array();
} }
$this->error = $line; $this->error = $line;
return false; return false;
} }
function listSubscribed($ref, $mailbox)
{
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;
}
$i = 0;
// get folder list
do {
$line = $this->readLine(500);
$line = $this->multLine($line, true);
$a = explode(' ', $line);
if (($line[0] == '*') && ($a[1] == 'LSUB' || $a[1] == 'LIST')) {
$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;
}
// second from last is delimiter
$delim = trim($a[count($a)-2], '"');
// is it a container?
$i++;
}
} while (!$this->startsWith($line, 'lsb', 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;
}
$this->error = $line;
return false;
}
function fetchMIMEHeaders($mailbox, $id, $parts, $mime=true) function fetchMIMEHeaders($mailbox, $id, $parts, $mime=true)
{ {
if (!$this->select($mailbox)) { if (!$this->select($mailbox)) {

Loading…
Cancel
Save