- Fix listing of folders in hidden namespaces (#1486796)

pull/1/head
alecpl 13 years ago
parent 485c69d812
commit 89dcf54071

@ -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)

@ -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)) {
@ -3148,6 +3148,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
*/

Loading…
Cancel
Save