summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Machniak <alec@alec.pl>2012-05-21 17:53:58 +0200
committerAleksander Machniak <alec@alec.pl>2012-05-21 17:53:58 +0200
commit9a2de8411ecb66e3df2fae5e65f0251b7c25173f (patch)
treeb408046bf6312026017ef1ee9dd5d268d6ae641c
parent799d72b8233897b7ca1bb1db81662ddd3e9912c5 (diff)
parent3c5489ba7547c88ba0f82b6ea0574d1a7185f416 (diff)
Merge branch 'courier-fix'
Conflicts: CHANGELOG
-rw-r--r--CHANGELOG1
-rw-r--r--config/main.inc.php.dist4
-rw-r--r--plugins/subscriptions_option/package.xml4
-rw-r--r--plugins/subscriptions_option/subscriptions_option.php7
-rw-r--r--program/include/rcube_imap.php110
5 files changed, 78 insertions, 48 deletions
diff --git a/CHANGELOG b/CHANGELOG
index b455c2539..da2b7b9b1 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
CHANGELOG Roundcube Webmail
===========================
+- Fix listing shared folders on Courier IMAP (#1488466)
- Fix issue where draft auto-save wasn't executed after some inactivity time
- Add vCard import from multiple files at once (#1488015)
- Roundcube Framework:
diff --git a/config/main.inc.php.dist b/config/main.inc.php.dist
index f5f42d7fb..e0fa933bf 100644
--- a/config/main.inc.php.dist
+++ b/config/main.inc.php.dist
@@ -106,6 +106,10 @@ $rcmail_config['imap_force_caps'] = false;
// Enable this option to force LSUB command usage instead.
$rcmail_config['imap_force_lsub'] = false;
+// Some server configurations (e.g. Courier) doesn't list folders in all namespaces
+// Enable this option to force listing of folders in all namespaces
+$rcmail_config['imap_force_ns'] = false;
+
// IMAP connection timeout, in seconds. Default: 0 (no limit)
$rcmail_config['imap_timeout'] = 0;
diff --git a/plugins/subscriptions_option/package.xml b/plugins/subscriptions_option/package.xml
index 1ecabf711..79d44f8c2 100644
--- a/plugins/subscriptions_option/package.xml
+++ b/plugins/subscriptions_option/package.xml
@@ -23,9 +23,9 @@
<email>ziba@umich.edu</email>
<active>yes</active>
</developer>
- <date>2012-03-05</date>
+ <date>2012-05-21</date>
<version>
- <release>1.2</release>
+ <release>1.3</release>
<api>1.1</api>
</version>
<stability>
diff --git a/plugins/subscriptions_option/subscriptions_option.php b/plugins/subscriptions_option/subscriptions_option.php
index 28f826263..8b27afbdc 100644
--- a/plugins/subscriptions_option/subscriptions_option.php
+++ b/plugins/subscriptions_option/subscriptions_option.php
@@ -74,12 +74,9 @@ class subscriptions_option extends rcube_plugin
function mailboxes_list($args)
{
- $rcmail = rcmail::get_instance();
+ $rcmail = rcmail::get_instance();
if (!$rcmail->config->get('use_subscriptions', true)) {
- $storage = $rcmail->get_storage();
- if ($storage->check_connection()) {
- $args['folders'] = $storage->conn->listMailboxes($args['root'], $args['name']);
- }
+ $args['folders'] = $rcmail->get_storage()->list_folders_direct();
}
return $args;
}
diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php
index f02c52aeb..b966aa348 100644
--- a/program/include/rcube_imap.php
+++ b/program/include/rcube_imap.php
@@ -2524,11 +2524,27 @@ class rcube_imap extends rcube_storage
// Server supports LIST-EXTENDED, we can use selection options
// #1486225: Some dovecot versions returns wrong result using LIST-EXTENDED
- if (!$config->get('imap_force_lsub') && $this->get_capability('LIST-EXTENDED')) {
+ $list_extended = !$config->get('imap_force_lsub') && $this->get_capability('LIST-EXTENDED');
+ if ($list_extended) {
// This will also set folder options, LSUB doesn't do that
$a_folders = $this->conn->listMailboxes($root, $name,
NULL, array('SUBSCRIBED'));
+ }
+ else {
+ // retrieve list of folders from IMAP server using LSUB
+ $a_folders = $this->conn->listSubscribed($root, $name);
+ }
+
+ if (!is_array($a_folders)) {
+ return array();
+ }
+ // #1486796: some server configurations doesn't return folders in all namespaces
+ if ($root == '' && $name == '*' && $config->get('imap_force_ns')) {
+ $this->list_folders_update($a_folders, ($list_extended ? 'ext-' : '') . 'subscribed');
+ }
+
+ if ($list_extended) {
// unsubscribe non-existent folders, remove from the list
// we can do this only when LIST response is available
if (is_array($a_folders) && $name == '*' && !empty($this->conn->data['LIST'])) {
@@ -2542,10 +2558,7 @@ class rcube_imap extends rcube_storage
}
}
}
- // retrieve list of folders from IMAP server using LSUB
else {
- $a_folders = $this->conn->listSubscribed($root, $name);
-
// unsubscribe non-existent folders, remove them from the list,
// we can do this only when LIST response is available
if (is_array($a_folders) && $name == '*' && !empty($this->conn->data['LIST'])) {
@@ -2563,10 +2576,6 @@ class rcube_imap extends rcube_storage
}
}
- if (!is_array($a_folders) || !sizeof($a_folders)) {
- $a_folders = array();
- }
-
return $a_folders;
}
@@ -2661,50 +2670,69 @@ class rcube_imap extends rcube_storage
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 (strlen($ns_data[0])) {
- $search[] = $ns_data[0];
- }
+ // #1486796: some server configurations doesn't return folders in all namespaces
+ if ($root == '' && $name == '*' && $config->get('imap_force_ns')) {
+ $this->list_folders_update($result);
+ }
+
+ return $result;
+ }
+
+
+ /**
+ * Fix folders list by adding folders from other namespaces.
+ * Needed on some servers eg. Courier IMAP
+ *
+ * @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)
+ {
+ $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 (strlen($ns_data[0])) {
+ $search[] = $ns_data[0];
}
}
}
+ }
- if (!empty($search)) {
- // go through all folders detecting namespace usage
- foreach ($result as $folder) {
- foreach ($search as $idx => $prefix) {
- if (strpos($folder, $prefix) === 0) {
- unset($search[$idx]);
- }
- }
- if (empty($search)) {
- break;
+ if (!empty($search)) {
+ // go through all folders detecting namespace usage
+ foreach ($result as $folder) {
+ foreach ($search as $idx => $prefix) {
+ if (strpos($folder, $prefix) === 0) {
+ unset($search[$idx]);
}
}
+ if (empty($search)) {
+ break;
+ }
+ }
- // get folders in hidden namespaces and add to the result
- foreach ($search as $prefix) {
- $list = $this->conn->listMailboxes($prefix, $name);
+ // get folders in hidden namespaces and add to the result
+ foreach ($search as $prefix) {
+ if ($type == 'ext-subscribed') {
+ $list = $this->conn->listMailboxes('', $prefix . '*', null, array('SUBSCRIBED'));
+ }
+ else if ($type == 'subscribed') {
+ $list = $this->conn->listSubscribed('', $prefix . '*');
+ }
+ else {
+ $list = $this->conn->listMailboxes('', $prefix . '*');
+ }
- if (!empty($list)) {
- $result = array_merge($result, $list);
- }
+ if (!empty($list)) {
+ $result = array_merge($result, $list);
}
}
}
-
- return $result;
}