From 67975b99efc14e98181f659568ce9306d0a91cd1 Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Fri, 17 Jun 2011 04:03:07 -0400
Subject: [PATCH] - Improved namespace roots handling in folder manager

---
 CHANGELOG                              |    1 +
 program/steps/settings/edit_folder.inc |    4 ++--
 program/steps/settings/folders.inc     |   17 ++++++++++++++++-
 program/steps/settings/func.inc        |   19 +++++++++++++++++--
 program/steps/settings/save_folder.inc |    1 +
 5 files changed, 37 insertions(+), 5 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 19a73b2..42a2305 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
 CHANGELOG Roundcube Webmail
 ===========================
 
+- Improved namespace roots handling in folder manager
 - Added searching in all addressbook sources
 - Added addressbook source selection in contacts import
 - Implement LDAPv3 Virtual List View (VLV) for paged results listing
diff --git a/program/steps/settings/edit_folder.inc b/program/steps/settings/edit_folder.inc
index 0bc7ab6..093b8df 100644
--- a/program/steps/settings/edit_folder.inc
+++ b/program/steps/settings/edit_folder.inc
@@ -135,7 +135,7 @@
     );
 
     // Settings: threading
-    if ($threading_supported && !$options['noselect']) {
+    if ($threading_supported && !$options['noselect'] && !$options['is_root']) {
         $select = new html_select(array('name' => '_viewmode', 'id' => '_listmode'));
         $select->add(rcube_label('list'), 0);
         $select->add(rcube_label('threads'), 1);
@@ -192,7 +192,7 @@
             'content' => array()
         );
 
-        if (!$options['noselect']) {
+        if (!$options['noselect'] && !$options['is_root']) {
             $msgcount = $RCMAIL->imap->messagecount($mbox_imap, 'ALL', true, false);
 
             // Size
diff --git a/program/steps/settings/folders.inc b/program/steps/settings/folders.inc
index c84f616..ed1fb79 100644
--- a/program/steps/settings/folders.inc
+++ b/program/steps/settings/folders.inc
@@ -179,7 +179,7 @@
 
     list($form_start, $form_end) = get_form_tags($attrib, 'folders');
     unset($attrib['form']);
-  
+
     if (!$attrib['id'])
         $attrib['id'] = 'rcmSubscriptionlist';
 
@@ -197,6 +197,7 @@
     $a_unsubscribed = $IMAP->list_unsubscribed();
     $a_subscribed   = $IMAP->list_mailboxes();
     $delimiter      = $IMAP->get_hierarchy_delimiter();
+    $namespace      = $IMAP->get_namespace();
     $a_js_folders   = array();
     $seen           = array();
     $list_folders   = array();
@@ -253,6 +254,7 @@
         $idx        = $i + 1;
         $subscribed = in_array($folder['id'], $a_subscribed);
         $protected  = ($CONFIG['protect_default_folders'] == true && in_array($folder['id'], $CONFIG['default_imap_folders']));
+        $noselect   = false;
         $classes    = array($i%2 ? 'even' : 'odd');
 
         $folder_js      = Q($folder['id']);
@@ -271,6 +273,19 @@
 
         $disabled = (($protected && $subscribed) || $noselect);
 
+        // check if the folder is a namespace prefix, then disable subscription option on it
+        if (!$disabled && $folder['virtual'] && $folder['level'] == 0 && !empty($namespace)) {
+            $fname = $folder['id'] . $delimiter;
+            foreach ($namespace as $ns) {
+                foreach ($ns as $item) {
+                    if ($item[0] === $fname) {
+                        $disabled = true;
+                        break;
+                    }
+                }
+            }
+        }
+
         $table->add_row(array('id' => 'rcmrow'.$idx, 'class' => join(' ', $classes),
             'foldername' => $folder['id']));
 
diff --git a/program/steps/settings/func.inc b/program/steps/settings/func.inc
index de9da28..72e2783 100644
--- a/program/steps/settings/func.inc
+++ b/program/steps/settings/func.inc
@@ -790,14 +790,29 @@
 
     $acl             = $RCMAIL->imap->get_capability('ACL');
     $default_folders = (array) $RCMAIL->config->get('default_imap_folders');
+    $delimiter       = $RCMAIL->imap->get_hierarchy_delimiter();
+    $namespace       = $RCMAIL->imap->get_namespace();
     $options         = array();
+
+    // check if the folder is a namespace prefix
+    if (!empty($namespace)) {
+        $mbox = $mailbox . $delimiter;
+        foreach ($namespace as $ns) {
+            foreach ($ns as $item) {
+                if ($item[0] === $mbox) {
+                    $options['is_root'] = true;
+                    break;
+                }
+            }
+        }
+    }
 
     $options['name']      = $mailbox;
     $options['options']   = $RCMAIL->imap->mailbox_options($mailbox, true);
     $options['namespace'] = $RCMAIL->imap->mailbox_namespace($mailbox);
-    $options['rights']    = $acl ? (array)$RCMAIL->imap->my_rights($mailbox) : array();
+    $options['rights']    = $acl && !$options['is_root'] ? (array)$RCMAIL->imap->my_rights($mailbox) : array();
     $options['special']   = in_array($mailbox, $default_folders);
-    $options['protected'] = $options['special'] && $RCMAIL->config->get('protect_default_folders');
+    $options['protected'] = $options['is_root'] || ($options['special'] && $RCMAIL->config->get('protect_default_folders'));
 
     if (is_array($options['options'])) {
         foreach ($options['options'] as $opt) {
diff --git a/program/steps/settings/save_folder.inc b/program/steps/settings/save_folder.inc
index 5467113..f0aae7c 100644
--- a/program/steps/settings/save_folder.inc
+++ b/program/steps/settings/save_folder.inc
@@ -72,6 +72,7 @@
     $folder['name']     = $name_imap;
     $folder['oldname']  = $old_imap;
     $folder['class']    = '';
+    $folder['options']  = $options;
     $folder['settings'] = array(
         // List view mode: 0-list, 1-threads
         'view_mode'   => (int) get_input_value('_viewmode', RCUBE_INPUT_POST),

--
Gitblit v1.9.1