From 4ceff8f35375738c73db48e713fe56313794a4a1 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak <alec@alec.pl> Date: Sun, 30 Aug 2015 05:36:06 -0400 Subject: [PATCH] Make optional hidding of folders with name starting with a dot - imap_skip_hidden_folders (#1490468) --- program/lib/Roundcube/rcube_imap.php | 42 +++++++++++++++++++++++++----------------- 1 files changed, 25 insertions(+), 17 deletions(-) diff --git a/program/lib/Roundcube/rcube_imap.php b/program/lib/Roundcube/rcube_imap.php index b8230a7..6ecb8df 100644 --- a/program/lib/Roundcube/rcube_imap.php +++ b/program/lib/Roundcube/rcube_imap.php @@ -2806,42 +2806,47 @@ $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, + $result = $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); + $result = $this->conn->listSubscribed($root, $name); } - if (!is_array($a_folders)) { + if (!is_array($result)) { 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'); + $this->list_folders_update($result, ($list_extended ? 'ext-' : '') . 'subscribed'); + } + + // Remove hidden folders + if ($config->get('imap_skip_hidden_folders')) { + $result = array_filter($result, function($v) { return $v[0] != '.'; }); } if ($list_extended) { // unsubscribe non-existent folders, remove from the list - if (is_array($a_folders) && $name == '*' && !empty($this->conn->data['LIST'])) { - foreach ($a_folders as $idx => $folder) { + if ($name == '*' && !empty($this->conn->data['LIST'])) { + foreach ($result as $idx => $folder) { if (($opts = $this->conn->data['LIST'][$folder]) && in_array_nocase('\\NonExistent', $opts) ) { $this->conn->unsubscribe($folder); - unset($a_folders[$idx]); + unset($result[$idx]); } } } } else { // unsubscribe non-existent folders, remove them from the list - if (is_array($a_folders) && !empty($a_folders) && $name == '*') { + if (!empty($result) && $name == '*') { $existing = $this->list_folders($root, $name); - $nonexisting = array_diff($a_folders, $existing); - $a_folders = array_diff($a_folders, $nonexisting); + $nonexisting = array_diff($result, $existing); + $result = array_diff($result, $nonexisting); foreach ($nonexisting as $folder) { $this->conn->unsubscribe($folder); @@ -2849,7 +2854,7 @@ } } - return $a_folders; + return $result; } /** @@ -2946,6 +2951,11 @@ // #1486796: some server configurations doesn't return folders in all namespaces if ($root == '' && $name == '*' && $config->get('imap_force_ns')) { $this->list_folders_update($result); + } + + // Remove hidden folders + if ($config->get('imap_skip_hidden_folders')) { + $result = array_filter($result, function($v) { return $v[0] != '.'; }); } return $result; @@ -4094,13 +4104,11 @@ $specials = array_merge(array('INBOX'), array_values($this->get_special_folders())); $folders = array(); - // convert names to UTF-8 and skip folders starting with '.' + // convert names to UTF-8 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'); - } + // 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'); } // sort folders -- Gitblit v1.9.1