From 8b5038befcccc29bdf8ea1f0f5745277e87e072f Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Mon, 29 Sep 2014 05:22:38 -0400
Subject: [PATCH] Fix handling of smart list inputs

---
 program/include/rcmail.php |   83 +++++++++++++++++++++++++++++++----------
 1 files changed, 62 insertions(+), 21 deletions(-)

diff --git a/program/include/rcmail.php b/program/include/rcmail.php
index 54d0d88..e1a6276 100644
--- a/program/include/rcmail.php
+++ b/program/include/rcmail.php
@@ -116,11 +116,13 @@
             $_SESSION['task'] = $this->task;
         }
 
-        // init output class
-        if (!empty($_REQUEST['_remote']))
+        // init output class (not in CLI mode)
+        if (!empty($_REQUEST['_remote'])) {
             $GLOBALS['OUTPUT'] = $this->json_init();
-        else
+        }
+        else if ($_SERVER['REMOTE_ADDR']) {
             $GLOBALS['OUTPUT'] = $this->load_gui(!empty($_REQUEST['_framed']));
+        }
 
         // load plugins
         $this->plugins->init($this, $this->task);
@@ -147,8 +149,13 @@
         $this->task      = $task;
         $this->comm_path = $this->url(array('task' => $this->task));
 
+        if (!empty($_REQUEST['_framed'])) {
+            $this->comm_path .= '&_framed=1';
+        }
+
         if ($this->output) {
             $this->output->set_env('task', $this->task);
+            $this->output->set_env('comm_path', $this->comm_path);
         }
     }
 
@@ -168,7 +175,7 @@
         setlocale(LC_ALL, $lang . '.utf8', $lang . '.UTF-8', 'en_US.utf8', 'en_US.UTF-8');
 
         // workaround for http://bugs.php.net/bug.php?id=18556
-        if (version_compare(PHP_VERSION, '5.5.0', '<') && in_array($lang, array('tr_TR', 'ku', 'az_AZ'))) {
+        if (PHP_VERSION_ID < 50500 && in_array($lang, array('tr_TR', 'ku', 'az_AZ'))) {
             setlocale(LC_CTYPE, 'en_US.utf8', 'en_US.UTF-8');
         }
     }
@@ -426,6 +433,9 @@
         if ($this->user && $this->user->ID) {
             $this->output->set_env('user_id', $this->user->get_hash());
         }
+
+        // set compose mode for all tasks (message compose step can be triggered from everywhere)
+        $this->output->set_env('compose_extwin', $this->config->get('compose_extwin',false));
 
         // add some basic labels to client
         $this->output->add_label('loading', 'servererror', 'connerror', 'requesttimedout',
@@ -786,11 +796,13 @@
     /**
      * Build a valid URL to this instance of Roundcube
      *
-     * @param mixed Either a string with the action or url parameters as key-value pairs
+     * @param mixed   Either a string with the action or url parameters as key-value pairs
+     * @param boolean Build an URL absolute to document root
+     * @param boolean Create fully qualified URL including http(s):// and hostname
      *
      * @return string Valid application URL
      */
-    public function url($p)
+    public function url($p, $absolute = false, $full = false)
     {
         if (!is_array($p)) {
             if (strpos($p, 'http') === 0) {
@@ -800,14 +812,15 @@
             $p = array('_action' => @func_get_arg(0));
         }
 
-        $task = $p['_task'] ? $p['_task'] : ($p['task'] ? $p['task'] : $this->task);
-        $p['_task'] = $task;
-        unset($p['task']);
+        $pre = array();
+        $task = $p['_task'] ?: ($p['task'] ?: $this->task);
+        $pre['_task'] = $task;
+        unset($p['task'], $p['_task']);
 
-        $url  = './' . $this->filename;
+        $url  = $this->filename;
         $delm = '?';
 
-        foreach (array_reverse($p) as $key => $val) {
+        foreach (array_merge($pre, $p) as $key => $val) {
             if ($val !== '' && $val !== null) {
                 $par  = $key[0] == '_' ? $key : '_'.$key;
                 $url .= $delm.urlencode($par).'='.urlencode($val);
@@ -815,7 +828,24 @@
             }
         }
 
-        return $url;
+        if ($absolute || $full) {
+            // add base path to this Roundcube installation
+            $base_path = preg_replace('![^/]+$!', '', strval($_SERVER['SCRIPT_NAME']));
+            if ($base_path == '') $base_path = '/';
+            $prefix = $base_path;
+
+            // prepend protocol://hostname:port
+            if ($full) {
+                $prefix = rcube_utils::resolve_url($prefix);
+            }
+
+            $prefix = rtrim($prefix, '/') . '/';
+        }
+        else {
+            $prefix = './';
+        }
+
+        return $prefix . $url;
     }
 
     /**
@@ -1678,13 +1708,14 @@
     }
 
 
-    public function quota_content($attrib = null)
+    public function quota_content($attrib = null, $folder = null)
     {
-        $quota = $this->storage->get_quota();
+        $quota = $this->storage->get_quota($folder);
         $quota = $this->plugins->exec_hook('quota', $quota);
 
         $quota_result = (array) $quota;
-        $quota_result['type'] = isset($_SESSION['quota_display']) ? $_SESSION['quota_display'] : '';
+        $quota_result['type']   = isset($_SESSION['quota_display']) ? $_SESSION['quota_display'] : '';
+        $quota_result['folder'] = $folder !== null && $folder !== '' ? $folder : 'INBOX';
 
         if ($quota['total'] > 0) {
             if (!isset($quota['percent'])) {
@@ -2170,11 +2201,13 @@
     /**
      * Returns message UID(s) and IMAP folder(s) from GET/POST data
      *
-     * @param  string UID value to decode
-     * @param  string Default mailbox value (if not encoded in UIDs)
+     * @param string UID value to decode
+     * @param string Default mailbox value (if not encoded in UIDs)
+     * @param bool   Will be set to True if multi-folder request
+     *
      * @return array  List of message UIDs per folder
      */
-    public static function get_uids($uids = null, $mbox = null)
+    public static function get_uids($uids = null, $mbox = null, &$is_multifolder = false)
     {
         // message UID (or comma-separated list of IDs) is provided in
         // the form of <ID>-<MBOX>[,<ID>-<MBOX>]*
@@ -2191,6 +2224,7 @@
 
         // special case: *
         if ($_uid == '*' && is_object($_SESSION['search'][1]) && $_SESSION['search'][1]->multi) {
+            $is_multifolder = true;
             // extract the full list of UIDs per folder from the search set
             foreach ($_SESSION['search'][1]->sets as $subset) {
                 $mbox = $subset->get_parameters('MAILBOX');
@@ -2204,12 +2238,19 @@
             // create a per-folder UIDs array
             foreach ((array)$_uid as $uid) {
                 list($uid, $mbox) = explode('-', $uid, 2);
-                if (!strlen($mbox))
+                if (!strlen($mbox)) {
                     $mbox = $_mbox;
-                if ($uid == '*')
+                }
+                else {
+                    $is_multifolder = true;
+                }
+
+                if ($uid == '*') {
                     $result[$mbox] = $uid;
-                else
+                }
+                else {
                     $result[$mbox][] = $uid;
+                }
             }
         }
 

--
Gitblit v1.9.1