Aleksander Machniak
2014-11-20 0b36d151572e050b51d82e7429fee847ebb33e22
program/include/rcmail.php
@@ -106,21 +106,23 @@
        // reset some session parameters when changing task
        if ($this->task != 'utils') {
            // we reset list page when switching to another task
            // but only to the main task interface - empty action (#1489076)
            // but only to the main task interface - empty action (#1489076, #1490116)
            // this will prevent from unintentional page reset on cross-task requests
            if ($this->session && $_SESSION['task'] != $this->task && empty($this->action)) {
                $this->session->remove('page');
            }
            // set current task to session
            $_SESSION['task'] = $this->task;
                // set current task to session
                $_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');
        }
    }
@@ -427,9 +434,12 @@
            $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',
            'refreshing', 'windowopenerror');
            'refreshing', 'windowopenerror', 'uploadingmany');
        return $this->output;
    }
@@ -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'])) {
@@ -1771,7 +1802,7 @@
            $error = 'errorreadonly';
        }
        else if ($res_code == rcube_storage::OVERQUOTA) {
            $error = 'errorroverquota';
            $error = 'erroroverquota';
        }
        else if ($err_code && ($err_str = $this->storage->get_error_str())) {
            // try to detect access rights problem and display appropriate message
@@ -1927,13 +1958,32 @@
        }
        if (!empty($params['total'])) {
            $params['percent'] = round($status['current']/$status['total']*100);
            $total = $this->show_bytes($params['total'], $unit);
            switch ($unit) {
            case 'GB':
                $gb      = $params['current']/1073741824;
                $current = sprintf($gb >= 10 ? "%d" : "%.1f", $gb);
                break;
            case 'MB':
                $mb      = $params['current']/1048576;
                $current = sprintf($mb >= 10 ? "%d" : "%.1f", $mb);
                break;
            case 'KB':
                $current = round($params['current']/1024);
                break;
            case 'B':
            default:
                $current = $params['current'];
                break;
            }
            $params['percent'] = round($params['current']/$params['total']*100);
            $params['text']    = $this->gettext(array(
                'name' => 'uploadprogress',
                'vars' => array(
                    'percent' => $params['percent'] . '%',
                    'current' => $this->show_bytes($params['current']),
                    'total'   => $this->show_bytes($params['total'])
                    'current' => $current,
                    'total'   => $total
                )
            ));
        }
@@ -2119,25 +2169,30 @@
    /**
     * Create a human readable string for a number of bytes
     *
     * @param int Number of bytes
     * @param int    Number of bytes
     * @param string Size unit
     *
     * @return string Byte string
     */
    public function show_bytes($bytes)
    public function show_bytes($bytes, &$unit = null)
    {
        if ($bytes >= 1073741824) {
            $gb  = $bytes/1073741824;
            $str = sprintf($gb>=10 ? "%d " : "%.1f ", $gb) . $this->gettext('GB');
            $unit = 'GB';
            $gb   = $bytes/1073741824;
            $str  = sprintf($gb >= 10 ? "%d " : "%.1f ", $gb) . $this->gettext($unit);
        }
        else if ($bytes >= 1048576) {
            $mb  = $bytes/1048576;
            $str = sprintf($mb>=10 ? "%d " : "%.1f ", $mb) . $this->gettext('MB');
            $unit = 'MB';
            $mb   = $bytes/1048576;
            $str  = sprintf($mb >= 10 ? "%d " : "%.1f ", $mb) . $this->gettext($unit);
        }
        else if ($bytes >= 1024) {
            $str = sprintf("%d ",  round($bytes/1024)) . $this->gettext('KB');
            $unit = 'KB';
            $str  = sprintf("%d ",  round($bytes/1024)) . $this->gettext($unit);
        }
        else {
            $str = sprintf('%d ', $bytes) . $this->gettext('B');
            $unit = 'B';
            $str  = sprintf('%d ', $bytes) . $this->gettext();
        }
        return $str;
@@ -2170,11 +2225,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 +2248,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 +2262,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;
                }
            }
        }