Aleksander Machniak
2013-02-17 ee393929a6c4ed165b47a0ae5ae0e87b6da999fb
plugins/managesieve/managesieve.php
@@ -7,13 +7,13 @@
 * It's clickable interface which operates on text scripts and communicates
 * with server using managesieve protocol. Adds Filters tab in Settings.
 *
 * @version 5.0
 * @version @package_version@
 * @author Aleksander Machniak <alec@alec.pl>
 *
 * Configuration (see config.inc.php.dist)
 *
 * Copyright (C) 2008-2011, The Roundcube Dev Team
 * Copyright (C) 2011, Kolab Systems AG
 * Copyright (C) 2008-2012, The Roundcube Dev Team
 * Copyright (C) 2011-2012, Kolab Systems AG
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2
@@ -62,8 +62,9 @@
        "x-beenthere",
    );
    const VERSION = '5.2';
    const VERSION  = '6.1';
    const PROGNAME = 'Roundcube (Managesieve)';
    const PORT     = 4190;
    function init()
@@ -199,18 +200,33 @@
        $include_path .= ini_get('include_path');
        set_include_path($include_path);
        $host = rcube_parse_host($this->rc->config->get('managesieve_host', 'localhost'));
        $port = $this->rc->config->get('managesieve_port', 2000);
        // Get connection parameters
        $host = $this->rc->config->get('managesieve_host', 'localhost');
        $port = $this->rc->config->get('managesieve_port');
        $tls  = $this->rc->config->get('managesieve_usetls', false);
        $host = rcube_parse_host($host);
        $host = rcube_idn_to_ascii($host);
        // remove tls:// prefix, set TLS flag
        if (($host = preg_replace('|^tls://|i', '', $host, 1, $cnt)) && $cnt) {
            $tls = true;
        }
        if (empty($port)) {
            $port = getservbyname('sieve', 'tcp');
            if (empty($port)) {
                $port = self::PORT;
            }
        }
        $plugin = $this->rc->plugins->exec_hook('managesieve_connect', array(
            'user'      => $_SESSION['username'],
            'password'  => $this->rc->decrypt($_SESSION['password']),
            'host'      => $host,
            'port'      => $port,
            'usetls'    => $tls,
            'auth_type' => $this->rc->config->get('managesieve_auth_type'),
            'usetls'    => $this->rc->config->get('managesieve_usetls', false),
            'disabled'  => $this->rc->config->get('managesieve_disabled_extensions'),
            'debug'     => $this->rc->config->get('managesieve_debug', false),
            'auth_cid'  => $this->rc->config->get('managesieve_auth_cid'),
@@ -523,9 +539,37 @@
        // Init plugin and handle managesieve connection
        $error = $this->managesieve_start();
        // filters set add action
        if (!empty($_POST['_newset'])) {
        // get request size limits (#1488648)
        $max_post = max(array(
            ini_get('max_input_vars'),
            ini_get('suhosin.request.max_vars'),
            ini_get('suhosin.post.max_vars'),
        ));
        $max_depth = max(array(
            ini_get('suhosin.request.max_array_depth'),
            ini_get('suhosin.post.max_array_depth'),
        ));
        // check request size limit
        if ($max_post && count($_POST, COUNT_RECURSIVE) >= $max_post) {
            rcube::raise_error(array(
                'code' => 500, 'type' => 'php',
                'file' => __FILE__, 'line' => __LINE__,
                'message' => "Request size limit exceeded (one of max_input_vars/suhosin.request.max_vars/suhosin.post.max_vars)"
                ), true, false);
            $this->rc->output->show_message('managesieve.filtersaveerror', 'error');
        }
        // check request depth limits
        else if ($max_depth && count($_POST['_header']) > $max_depth) {
            rcube::raise_error(array(
                'code' => 500, 'type' => 'php',
                'file' => __FILE__, 'line' => __LINE__,
                'message' => "Request size limit exceeded (one of suhosin.request.max_array_depth/suhosin.post.max_array_depth)"
                ), true, false);
            $this->rc->output->show_message('managesieve.filtersaveerror', 'error');
        }
        // filters set add action
        else if (!empty($_POST['_newset'])) {
            $name       = get_input_value('_name', RCUBE_INPUT_POST, true);
            $copy       = get_input_value('_copy', RCUBE_INPUT_POST, true);
            $from       = get_input_value('_from', RCUBE_INPUT_POST);
@@ -791,7 +835,7 @@
                case 'fileinto':
                case 'fileinto_copy':
                    $mailbox = $this->strip_value($mailboxes[$idx]);
                    $mailbox = $this->strip_value($mailboxes[$idx], false, false);
                    $this->form['actions'][$i]['target'] = $this->mod_mailbox($mailbox, 'in');
                    if ($type == 'fileinto_copy') {
                        $type = 'fileinto';
@@ -1050,7 +1094,7 @@
        $this->rc->output->set_env('blankpage', $attrib['src'] ?
        $this->rc->output->abs_url($attrib['src']) : 'program/resources/blank.gif');
        return html::tag('iframe', $attrib);
        return $this->rc->output->frame($attrib);
    }
    function filterset_form($attrib)
@@ -1664,16 +1708,16 @@
    private function genid()
    {
        $result = preg_replace('/[^0-9]/', '', microtime(true));
        return $result;
        return preg_replace('/[^0-9]/', '', microtime(true));
    }
    private function strip_value($str, $allow_html=false)
    private function strip_value($str, $allow_html = false, $trim = true)
    {
        if (!$allow_html)
        if (!$allow_html) {
            $str = strip_tags($str);
        }
        return trim($str);
        return $trim ? trim($str) : $str;
    }
    private function error_class($id, $type, $target, $elem_prefix='')
@@ -1804,6 +1848,12 @@
            if ($active = $this->sieve->get_active()) {
                $this->active = array($active);
            }
            // Hide scripts from config
            $exceptions = $this->rc->config->get('managesieve_filename_exceptions');
            if (!empty($exceptions)) {
                $this->list = array_diff($this->list, (array)$exceptions);
            }
        }
        return $this->list;