diff options
Diffstat (limited to 'program/include/rcube_imap.php')
-rw-r--r-- | program/include/rcube_imap.php | 38 |
1 files changed, 34 insertions, 4 deletions
diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php index 0f5651555..f37cfdaf1 100644 --- a/program/include/rcube_imap.php +++ b/program/include/rcube_imap.php @@ -2917,13 +2917,14 @@ class rcube_imap * @param string $root Optional root folder * @param string $name Optional name pattern * @param string $filter Optional filter + * @param string $rights Optional ACL requirements * * @return array List of mailboxes/folders * @access public */ - function list_mailboxes($root='', $name='*', $filter=null) + function list_mailboxes($root='', $name='*', $filter=null, $rights=null) { - $a_mboxes = $this->_list_mailboxes($root, $name, $filter); + $a_mboxes = $this->_list_mailboxes($root, $name, $filter, $rights); // INBOX should always be available if ((!$filter || $filter == 'mail') && !in_array('INBOX', $a_mboxes)) { @@ -2943,17 +2944,19 @@ class rcube_imap * @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 * @see rcube_imap::list_mailboxes() * @access private */ - private function _list_mailboxes($root='', $name='*', $filter=null) + private function _list_mailboxes($root='', $name='*', $filter=null, $rights=null) { $cache_key = $root.':'.$name; if (!empty($filter)) { $cache_key .= ':'.(is_string($filter) ? $filter : serialize($filter)); } + $cache_key .= ':'.$rights; $cache_key = 'mailboxes.'.md5($cache_key); @@ -3021,6 +3024,11 @@ class rcube_imap $a_folders = array(); } + // filter folders list according to rights requirements + if ($rights && $this->get_capability('ACL')) { + $a_folders = $this->filter_rights($a_folders, $rights); + } + // write mailboxlist to cache $this->update_cache($cache_key, $a_folders); @@ -3034,10 +3042,11 @@ class rcube_imap * @param string $root IMAP root dir * @param string $name Optional name pattern * @param mixed $filter Optional filter + * @param string $rights Optional ACL requirements * * @return array Indexed array with folder names */ - function list_unsubscribed($root='', $name='*', $filter=null) + function list_unsubscribed($root='', $name='*', $filter=null, $rights=null) { // @TODO: caching // Give plugins a chance to provide a list of mailboxes @@ -3061,6 +3070,11 @@ class rcube_imap array_unshift($a_mboxes, 'INBOX'); } + // filter folders list according to rights requirements + if ($rights && $this->get_capability('ACL')) { + $a_folders = $this->filter_rights($a_folders, $rights); + } + // filter folders and sort them $a_mboxes = $this->_sort_mailbox_list($a_mboxes); @@ -3069,6 +3083,22 @@ class rcube_imap /** + * Filter the given list of folders according to access rights + */ + private function filter_rights($a_folders, $rights) + { + $regex = '/('.$rights.')/'; + foreach ($a_folders as $idx => $folder) { + $myrights = join('', (array)$this->my_rights($folder)); + if ($myrights !== null && !preg_match($regex, $myrights)) + unset($a_folders[$idx]); + } + + return $a_folders; + } + + + /** * Get mailbox quota information * added by Nuny * |