From 4af76d20cafcd456bf3ce0fcb17b25a888c45160 Mon Sep 17 00:00:00 2001
From: Thomas <thomas@roundcube.net>
Date: Mon, 21 Oct 2013 15:14:46 -0400
Subject: [PATCH] Bump version

---
 program/steps/settings/folders.inc |  104 +++++++++++++++++++++++++++++-----------------------
 1 files changed, 58 insertions(+), 46 deletions(-)

diff --git a/program/steps/settings/folders.inc b/program/steps/settings/folders.inc
index 6fc72d9..778d93c 100644
--- a/program/steps/settings/folders.inc
+++ b/program/steps/settings/folders.inc
@@ -18,9 +18,6 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  | Author: Aleksander Machniak <alec@alec.pl>                            |
  +-----------------------------------------------------------------------+
-
- $Id$
-
 */
 
 // WARNING: folder names in UI are encoded with RCMAIL_CHARSET
@@ -47,8 +44,8 @@
 
         if ($result) {
             // Handle subscription of protected folder (#1487656)
-            if ($CONFIG['protect_default_folders'] == true
-                && in_array($mbox, $CONFIG['default_folders'])
+            if ($RCMAIL->config->get('protect_default_folders')
+                && in_array($mbox, (array)$RCMAIL->config->get('default_folders'))
             ) {
                 $OUTPUT->command('disable_subscription', $mbox);
             }
@@ -87,6 +84,11 @@
         }
         else {
             $deleted = $plugin['result'];
+        }
+
+        // #1488692: update session
+        if ($deleted && $_SESSION['mbox'] === $mbox) {
+            $RCMAIL->session->remove('mbox');
         }
     }
 
@@ -186,7 +188,7 @@
 // build table with all folders listed by server
 function rcube_subscription_form($attrib)
 {
-    global $RCMAIL, $CONFIG, $OUTPUT;
+    global $RCMAIL, $OUTPUT;
 
     list($form_start, $form_end) = get_form_tags($attrib, 'folders');
     unset($attrib['form']);
@@ -214,6 +216,9 @@
     $a_js_folders   = array();
     $seen           = array();
     $list_folders   = array();
+
+    $default_folders = (array) $RCMAIL->config->get('default_folders');
+    $protect_default = $RCMAIL->config->get('protect_default_folders');
 
     // pre-process folders list
     foreach ($a_unsubscribed as $i => $folder) {
@@ -274,7 +279,7 @@
         $idx        = $i + 1;
         $sub_key    = array_search($folder['id'], $a_subscribed);
         $subscribed = $sub_key !== false;
-        $protected  = ($CONFIG['protect_default_folders'] == true && in_array($folder['id'], $CONFIG['default_folders']));
+        $protected  = $protect_default && in_array($folder['id'], $default_folders);
         $noselect   = false;
         $classes    = array($i%2 ? 'even' : 'odd');
 
@@ -294,40 +299,44 @@
 
         $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) {
-                if (is_array($ns)) {
-                    foreach ($ns as $item) {
-                        if ($item[0] === $fname) {
-                            $disabled = true;
-                            break 2;
+        // Below we will disable subscription option for "virtual" folders
+        // according to namespaces, but only if they aren't already subscribed.
+        // User should be able to unsubscribe from the folder
+        // even if it doesn't exists or is not accessible (OTRS:1000059)
+        if (!$subscribed && !$disabled && !empty($namespace) && $folder['virtual']) {
+            // check if the folder is a namespace prefix, then disable subscription option on it
+            if (!$disabled && $folder['level'] == 0) {
+                $fname = $folder['id'] . $delimiter;
+                foreach ($namespace as $ns) {
+                    if (is_array($ns)) {
+                        foreach ($ns as $item) {
+                            if ($item[0] === $fname) {
+                                $disabled = true;
+                                break 2;
+                            }
                         }
                     }
                 }
             }
-        }
-        // check if the folder is an other users virtual-root folder, then disable subscription option on it
-        if (!$disabled && $folder['virtual'] && $folder['level'] == 1
-            && !empty($namespace) && !empty($namespace['other'])
-        ) {
-            $parts = explode($delimiter, $folder['id']);
-            $fname = $parts[0] . $delimiter;
-            foreach ($namespace['other'] as $item) {
-                if ($item[0] === $fname) {
-                    $disabled = true;
-                    break;
+            // check if the folder is an other users virtual-root folder, then disable subscription option on it
+            if (!$disabled && $folder['level'] == 1 && !empty($namespace['other'])) {
+                $parts = explode($delimiter, $folder['id']);
+                $fname = $parts[0] . $delimiter;
+                foreach ($namespace['other'] as $item) {
+                    if ($item[0] === $fname) {
+                        $disabled = true;
+                        break;
+                    }
                 }
             }
-        }
-        // check if the folder is shared, then disable subscription option on it
-        if (!$disabled && $folder['virtual'] && !empty($namespace)) {
-            $tmp_ns = array_merge((array)$namespace['other'], (array)$namespace['shared']);
-            foreach ($tmp_ns as $item) {
-                if (strpos($folder['id'], $item[0]) === 0) {
-                    $disabled = true;
-                    break;
+            // check if the folder is shared, then disable subscription option on it (if not subscribed already)
+            if (!$disabled) {
+                $tmp_ns = array_merge((array)$namespace['other'], (array)$namespace['shared']);
+                foreach ($tmp_ns as $item) {
+                    if (strpos($folder['id'], $item[0]) === 0) {
+                        $disabled = true;
+                        break;
+                    }
                 }
             }
         }
@@ -340,14 +349,14 @@
             array('value' => $folder_utf8, 'disabled' => $disabled ? 'disabled' : '')));
 
         $a_js_folders['rcmrow'.$idx] = array($folder_utf8,
-            Q($display_folder), $protected || $folder['virtual']);
+            $display_folder, $protected || $folder['virtual']);
     }
 
     $RCMAIL->plugins->exec_hook('folders_list', array('table' => $table));
 
     $OUTPUT->add_gui_object('subscriptionlist', $attrib['id']);
     $OUTPUT->set_env('subscriptionrows', $a_js_folders);
-    $OUTPUT->set_env('defaultfolders', $CONFIG['default_folders']);
+    $OUTPUT->set_env('defaultfolders', $default_folders);
     $OUTPUT->set_env('delimiter', $delimiter);
 
     return $form_start . $table->show($attrib) . $form_end;
@@ -360,12 +369,7 @@
     if (!$attrib['id'])
         $attrib['id'] = 'rcmfolderframe';
 
-    $attrib['name'] = $attrib['id'];
-
-    $OUTPUT->set_env('contentframe', $attrib['name']);
-    $OUTPUT->set_env('blankpage', $attrib['src'] ? $OUTPUT->abs_url($attrib['src']) : 'program/blank.gif');
-
-    return html::iframe($attrib);
+    return $OUTPUT->frame($attrib, true);
 }
 
 function rcmail_rename_folder($oldname, $newname)
@@ -393,14 +397,19 @@
         foreach ($a_threaded as $key => $val) {
             if ($key == $oldname) {
                 unset($a_threaded[$key]);
-    	        $a_threaded[$newname] = true;
+                $a_threaded[$newname] = true;
             }
             else if (preg_match($oldprefix, $key)) {
                 unset($a_threaded[$key]);
-	            $a_threaded[preg_replace($oldprefix, $newname.$delimiter, $key)] = true;
+                $a_threaded[preg_replace($oldprefix, $newname.$delimiter, $key)] = true;
             }
         }
         $RCMAIL->user->save_prefs(array('message_threading' => $a_threaded));
+
+        // #1488692: update session
+        if ($_SESSION['mbox'] === $oldname) {
+            $_SESSION['mbox'] = $newname;
+        }
 
         return true;
     }
@@ -411,7 +420,10 @@
 
 $OUTPUT->set_pagetitle(rcube_label('folders'));
 $OUTPUT->include_script('list.js');
-$OUTPUT->set_env('quota', $STORAGE->get_capability('QUOTA'));
+$OUTPUT->set_env('prefix_ns', $STORAGE->get_namespace('prefix'));
+if ($STORAGE->get_capability('QUOTA')) {
+    $OUTPUT->set_env('quota', true);
+}
 
 // add some labels to client
 $OUTPUT->add_label('deletefolderconfirm', 'purgefolderconfirm', 'folderdeleting',

--
Gitblit v1.9.1