summaryrefslogtreecommitdiff
path: root/plugins/managesieve/managesieve.php
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/managesieve/managesieve.php')
-rw-r--r--plugins/managesieve/managesieve.php233
1 files changed, 194 insertions, 39 deletions
diff --git a/plugins/managesieve/managesieve.php b/plugins/managesieve/managesieve.php
index 0c8c492e4..92185e083 100644
--- a/plugins/managesieve/managesieve.php
+++ b/plugins/managesieve/managesieve.php
@@ -7,7 +7,7 @@
* It's clickable interface which operates on text scripts and communicates
* with server using managesieve protocol. Adds Filters tab in Settings.
*
- * @version 1.7
+ * @version 2.0
* @author Aleksander 'A.L.E.C' Machniak <alec@alec.pl>
*
* Configuration (see config.inc.php.dist):
@@ -35,7 +35,7 @@ class managesieve extends rcube_plugin
$this->add_texts('localization/', array('filters','managefilters'));
// register actions
- $this->register_action('plugin.managesieve', array($this, 'managesieve_init'));
+ $this->register_action('plugin.managesieve', array($this, 'managesieve_actions'));
$this->register_action('plugin.managesieve-save', array($this, 'managesieve_save'));
// include main js script
@@ -52,8 +52,10 @@ class managesieve extends rcube_plugin
// register UI objects
$this->rc->output->add_handlers(array(
'filterslist' => array($this, 'filters_list'),
+ 'filtersetslist' => array($this, 'filtersets_list'),
'filterframe' => array($this, 'filter_frame'),
'filterform' => array($this, 'filter_form'),
+ 'filtersetform' => array($this, 'filterset_form'),
));
require_once($this->home . '/lib/Net/Sieve.php');
@@ -65,23 +67,51 @@ class managesieve extends rcube_plugin
str_replace('%h', $_SESSION['imap_host'], $this->rc->config->get('managesieve_host', 'localhost')),
$this->rc->config->get('managesieve_port', 2000),
$this->rc->config->get('managesieve_usetls', false),
- $this->rc->config->get('managesieve_disabled_extensions'));
+ $this->rc->config->get('managesieve_disabled_extensions'),
+ $this->rc->config->get('managesieve_debug', false)
+ );
- $error = $this->sieve->error();
+ if (!($error = $this->sieve->error())) {
+
+ $list = $this->sieve->get_scripts();
+ $active = $this->sieve->get_active();
+ $_SESSION['managesieve_active'] = $active;
+
+ if (!empty($_GET['_sid'])) {
+ $script_name = get_input_value('_sid', RCUBE_INPUT_GET);
+ } else if (!empty($_SESSION['managesieve_current'])) {
+ $script_name = $_SESSION['managesieve_current'];
+ } else {
+ // get active script
+ if ($active) {
+ $script_name = $active;
+ } else if ($list) {
+ $script_name = $list[0];
+ // create a new (initial) script
+ } else {
+ // if script not exists build default script contents
+ $script_file = $this->rc->config->get('managesieve_default');
+ $script_name = 'roundcube';
+ if ($script_file && is_readable($script_file))
+ $content = file_get_contents($script_file);
+
+ // add script and set it active
+ if ($this->sieve->save_script($script_name, $content))
+ if ($this->sieve->activate($script_name))
+ $_SESSION['managesieve_active'] = $script_name;
+ }
+ }
- if ($error == SIEVE_ERROR_NOT_EXISTS)
- {
- // if script not exists build default script contents
- $script_file = $this->rc->config->get('managesieve_default');
- if ($script_file && is_readable($script_file))
- $this->sieve->script->add_text(file_get_contents($script_file));
- // that's not exactly an error
- $error = false;
+ if ($script_name)
+ $this->sieve->load($script_name);
+
+ $error = $this->sieve->error();
}
- elseif ($error)
+
+ // finally set script objects
+ if ($error)
{
- switch ($error)
- {
+ switch ($error) {
case SIEVE_ERROR_CONNECTION:
case SIEVE_ERROR_LOGIN:
$this->rc->output->show_message('managesieve.filterconnerror', 'error');
@@ -90,26 +120,22 @@ class managesieve extends rcube_plugin
$this->rc->output->show_message('managesieve.filterunknownerror', 'error');
break;
}
-
// to disable 'Add filter' button set env variable
$this->rc->output->set_env('filterconnerror', true);
- }
-
- // finally set script objects
- if ($error)
- {
$this->script = array();
}
else
{
$this->script = $this->sieve->script->as_array();
$this->exts = $this->sieve->get_extensions();
+ $this->rc->output->set_env('active_set', $_SESSION['managesieve_active']);
+ $_SESSION['managesieve_current'] = $this->sieve->current;
}
return $error;
}
- function managesieve_init()
+ function managesieve_actions()
{
// Init plugin and handle managesieve connection
$error = $this->managesieve_start();
@@ -134,7 +160,7 @@ class managesieve extends rcube_plugin
$this->rc->output->show_message('managesieve.filtersaveerror', 'error');
}
}
- elseif ($action=='down' && !$error)
+ else if ($action=='down' && !$error)
{
if (isset($this->script[$fid]) && isset($this->script[$fid+1]))
{
@@ -142,27 +168,56 @@ class managesieve extends rcube_plugin
&& $this->sieve->script->update_rule($fid+1, $this->script[$fid]) !== false)
$result = $this->sieve->save();
- if ($result) {
+ if ($result === true) {
// $this->rc->output->show_message('managesieve.filtersaved', 'confirmation');
$this->rc->output->command('managesieve_updatelist', 'down', '', $fid);
- } else
+ } else {
$this->rc->output->show_message('managesieve.filtersaveerror', 'error');
- }
+ }
+ }
}
- elseif ($action=='delete' && !$error)
+ else if ($action=='delete' && !$error)
{
if (isset($this->script[$fid]))
{
if ($this->sieve->script->delete_rule($fid))
$result = $this->sieve->save();
- if (!$result)
- $this->rc->output->show_message('managesieve.filterdeleteerror', 'error');
- else {
+ if ($result === true) {
$this->rc->output->show_message('managesieve.filterdeleted', 'confirmation');
$this->rc->output->command('managesieve_updatelist', 'delete', '', $fid);
+ } else {
+ $this->rc->output->show_message('managesieve.filterdeleteerror', 'error');
}
- }
+ }
+ }
+ else if ($action=='setact' && !$error)
+ {
+ $script_name = get_input_value('_set', RCUBE_INPUT_GPC);
+ $result = $this->sieve->activate($script_name);
+
+ if ($result === true) {
+ $this->rc->output->set_env('active_set', $script_name);
+ $this->rc->output->show_message('managesieve.setactivated', 'confirmation');
+ $this->rc->output->command('enable_command', 'plugin.managesieve-setact', false);
+ $this->rc->output->command('managesieve_reset', $script_name);
+ $_SESSION['managesieve_active'] = $script_name;
+ } else {
+ $this->rc->output->show_message('managesieve.setactivateerror', 'error');
+ }
+ }
+ else if ($action=='setdel' && !$error)
+ {
+ $script_name = get_input_value('_set', RCUBE_INPUT_GPC);
+ $result = $this->sieve->remove($script_name);
+
+ if ($result === true) {
+ $this->rc->output->show_message('managesieve.setdeleted', 'confirmation');
+ $this->rc->output->command('managesieve_reload');
+ rcube_sess_unset('managesieve_current');
+ } else {
+ $this->rc->output->show_message('managesieve.setdeleteerror', 'error');
+ }
}
elseif ($action=='ruleadd')
{
@@ -192,8 +247,29 @@ class managesieve extends rcube_plugin
// Init plugin and handle managesieve connection
$error = $this->managesieve_start();
- // add/edit action
- if (isset($_POST['_name']))
+ // filters set add action
+ if (!empty($_POST['_newset']))
+ {
+ $name = get_input_value('_name', RCUBE_INPUT_GPC);
+ $copy = get_input_value('_copy', RCUBE_INPUT_GPC);
+
+ if (!$name)
+ $error = 'managesieve.emptyname';
+ else if (mb_strlen($name)>128)
+ $error = 'managesieve.nametoolong';
+ else if (!$this->sieve->copy($name, $copy))
+ $error = 'managesieve.setcreateerror';
+
+ if (!$error) {
+ $this->rc->output->show_message('managesieve.setcreated', 'confirmation');
+ $this->rc->output->command('parent.managesieve_reload', $name);
+// rcube_sess_unset('managesieve_current');
+ } else {
+ $this->rc->output->show_message($error, 'error');
+ }
+ }
+ // filter add/edit action
+ else if (isset($_POST['_name']))
{
$name = trim(get_input_value('_name', RCUBE_INPUT_POST));
$fid = trim(get_input_value('_fid', RCUBE_INPUT_POST));
@@ -422,9 +498,12 @@ class managesieve extends rcube_plugin
private function managesieve_send()
{
// Handle form action
- if (isset($_GET['_framed']) || isset($_POST['_framed']))
- $this->rc->output->send('managesieve.managesieveedit');
- else {
+ if (isset($_GET['_framed']) || isset($_POST['_framed'])) {
+ if (isset($_GET['_newset']) || isset($_POST['_newset']))
+ $this->rc->output->send('managesieve.setedit');
+ else
+ $this->rc->output->send('managesieve.filteredit');
+ } else {
$this->rc->output->set_pagetitle($this->gettext('filters'));
$this->rc->output->send('managesieve.managesieve');
}
@@ -451,7 +530,34 @@ class managesieve extends rcube_plugin
$this->rc->output->include_script('list.js');
// add some labels to client
- $this->rc->output->add_label('managesieve.filterconfirmdelete');
+ $this->rc->output->add_label('managesieve.filterdeleteconfirm');
+
+ return $out;
+ }
+
+ // return the filters list as <SELECT>
+ function filtersets_list($attrib)
+ {
+ // add id to message list table if not specified
+ if (!strlen($attrib['id']))
+ $attrib['id'] = 'rcmfiltersetslist';
+
+ $list = $this->sieve->get_scripts();
+ $active = $this->sieve->get_active();
+
+ $select = new html_select(array('name' => '_set', 'id' => $attrib['id'], 'onchange' => 'rcmail.managesieve_set()'));
+
+ asort($list, SORT_LOCALE_STRING);
+
+ foreach($list as $set)
+ $select->add($set . ($set == $active ? ' ('.$this->gettext('active').')' : ''), $set);
+
+ $out = $select->show($this->sieve->current);
+
+ // set client env
+ $this->rc->output->add_gui_object('filtersetslist', $attrib['id']);
+ $this->rc->output->add_label('managesieve.setdeleteconfirm');
+ $this->rc->output->add_label('managesieve.active');
return $out;
}
@@ -465,12 +571,61 @@ class managesieve extends rcube_plugin
$this->rc->output->set_env('contentframe', $attrib['name']);
$this->rc->output->set_env('blankpage', $attrib['src'] ?
- $this->rc->output->abs_url($attrib['src']) : 'program/blank.gif');
+ $this->rc->output->abs_url($attrib['src']) : 'program/blank.gif');
return html::tag('iframe', $attrib);
}
+ function filterset_form($attrib)
+ {
+ if (!$attrib['id'])
+ $attrib['id'] = 'rcmfiltersetform';
+
+ $out = '<form name="filtersetform" action="./" method="post">'."\n";
+
+ $hiddenfields = new html_hiddenfield(array('name' => '_task', 'value' => $this->rc->task));
+ $hiddenfields->add(array('name' => '_action', 'value' => 'plugin.managesieve-save'));
+ $hiddenfields->add(array('name' => '_framed', 'value' => ($_POST['_framed'] || $_GET['_framed'] ? 1 : 0)));
+ $hiddenfields->add(array('name' => '_newset', 'value' => 1));
+
+ $out .= $hiddenfields->show();
+
+ $name = get_input_value('_name', RCUBE_INPUT_GPC);
+ $copy = get_input_value('_copy', RCUBE_INPUT_GPC);
+
+ $table = new html_table(array('cols' => 2));
+
+ // filter set name input
+ $input_name = new html_inputfield(array('name' => '_name', 'id' => '_name', 'size' => 30,
+ 'class' => ($this->errors['name'] ? 'error' : '')));
+
+ $table->add('title', sprintf('<label for="%s"><b>%s:</b></label>', '_name', Q($this->gettext('filtersetname'))));
+ $table->add(null, $input_name->show($name));
+
+ // filters set list
+ $list = $this->sieve->get_scripts();
+ $active = $this->sieve->get_active();
+
+ $select = new html_select(array('name' => '_copy', 'id' => '_copy'));
+
+ asort($list, SORT_LOCALE_STRING);
+
+ $select->add($this->gettext('none'), '');
+ foreach($list as $set)
+ $select->add($set . ($set == $active ? ' ('.$this->gettext('active').')' : ''), $set);
+
+ $table->add('title', '<label>'.$this->gettext('copyfromset').':</label>');
+ $table->add(null, $select->show($copy));
+
+ $out .= $table->show();
+
+ $this->rc->output->add_gui_object('sieveform', 'filtersetform');
+
+ return $out;
+ }
+
+
function filter_form($attrib)
{
if (!$attrib['id'])
@@ -818,7 +973,7 @@ class managesieve extends rcube_plugin
private function check_email($email)
{
- if (function_exists('check_email'));
+ if (function_exists('check_email'));
return check_email($email);
// Check for invalid characters