From 63a3dc5fde5a3ceed4f03c19c5015aab19050bee Mon Sep 17 00:00:00 2001 From: till Date: Sat, 20 Mar 2010 14:20:01 +0000 Subject: moved plugins --- plugins/managesieve/managesieve.php | 1042 ----------------------------------- 1 file changed, 1042 deletions(-) delete mode 100644 plugins/managesieve/managesieve.php (limited to 'plugins/managesieve/managesieve.php') diff --git a/plugins/managesieve/managesieve.php b/plugins/managesieve/managesieve.php deleted file mode 100644 index 4c50616b1..000000000 --- a/plugins/managesieve/managesieve.php +++ /dev/null @@ -1,1042 +0,0 @@ - - * - * Configuration (see config.inc.php.dist) - * - * $Id$ - */ - -class managesieve extends rcube_plugin -{ - public $task = 'settings'; - - private $rc; - private $sieve; - private $errors; - private $form; - private $script = array(); - private $exts = array(); - private $headers = array( - 'subject' => 'Subject', - 'sender' => 'From', - 'recipient' => 'To', - ); - - function init() - { - // add Tab label/title - $this->add_texts('localization/', array('filters','managefilters')); - - // register actions - $this->register_action('plugin.managesieve', array($this, 'managesieve_actions')); - $this->register_action('plugin.managesieve-save', array($this, 'managesieve_save')); - - // include main js script - $this->include_script('managesieve.js'); - } - - function managesieve_start() - { - $this->rc = rcmail::get_instance(); - $this->load_config(); - - // 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'); - require_once($this->home . '/lib/rcube_sieve.php'); - - $host = str_replace('%h', $_SESSION['imap_host'], $this->rc->config->get('managesieve_host', 'localhost')); - $port = $this->rc->config->get('managesieve_port', 2000); - - // try to connect to managesieve server and to fetch the script - $this->sieve = new rcube_sieve($_SESSION['username'], - $this->rc->decrypt($_SESSION['password']), - $host, $port, - $this->rc->config->get('managesieve_usetls', false), - $this->rc->config->get('managesieve_disabled_extensions'), - $this->rc->config->get('managesieve_debug', false) - ); - - 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 ($script_name) - $this->sieve->load($script_name); - - $error = $this->sieve->error(); - } - - // finally set script objects - if ($error) - { - switch ($error) { - case SIEVE_ERROR_CONNECTION: - case SIEVE_ERROR_LOGIN: - $this->rc->output->show_message('managesieve.filterconnerror', 'error'); - break; - default: - $this->rc->output->show_message('managesieve.filterunknownerror', 'error'); - break; - } - - raise_error(array('code' => 403, 'type' => 'php', 'message' => "Unable to connect to managesieve on $host:$port"), true, false); - - // to disable 'Add filter' button set env variable - $this->rc->output->set_env('filterconnerror', true); - $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_actions() - { - // Init plugin and handle managesieve connection - $error = $this->managesieve_start(); - - // Handle user requests - if ($action = get_input_value('_act', RCUBE_INPUT_GPC)) - { - $fid = (int) get_input_value('_fid', RCUBE_INPUT_GET); - - if ($action=='up' && !$error) - { - if ($fid && isset($this->script[$fid]) && isset($this->script[$fid-1])) - { - if ($this->sieve->script->update_rule($fid, $this->script[$fid-1]) !== false - && $this->sieve->script->update_rule($fid-1, $this->script[$fid]) !== false) - $result = $this->sieve->save(); - - if ($result) { -// $this->rc->output->show_message('managesieve.filtersaved', 'confirmation'); - $this->rc->output->command('managesieve_updatelist', 'up', '', $fid); - } else - $this->rc->output->show_message('managesieve.filtersaveerror', 'error'); - } - } - else if ($action=='down' && !$error) - { - if (isset($this->script[$fid]) && isset($this->script[$fid+1])) - { - if ($this->sieve->script->update_rule($fid, $this->script[$fid+1]) !== false - && $this->sieve->script->update_rule($fid+1, $this->script[$fid]) !== false) - $result = $this->sieve->save(); - - if ($result === true) { -// $this->rc->output->show_message('managesieve.filtersaved', 'confirmation'); - $this->rc->output->command('managesieve_updatelist', 'down', '', $fid); - } else { - $this->rc->output->show_message('managesieve.filtersaveerror', 'error'); - } - } - } - else if ($action=='delete' && !$error) - { - if (isset($this->script[$fid])) - { - if ($this->sieve->script->delete_rule($fid)) - $result = $this->sieve->save(); - - 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'); - $this->rc->session->remove('managesieve_current'); - } else { - $this->rc->output->show_message('managesieve.setdeleteerror', 'error'); - } - } - elseif ($action=='ruleadd') - { - $rid = get_input_value('_rid', RCUBE_INPUT_GPC); - $id = $this->genid(); - $content = $this->rule_div($fid, $id, false); - - $this->rc->output->command('managesieve_rulefill', $content, $id, $rid); - } - elseif ($action=='actionadd') - { - $aid = get_input_value('_aid', RCUBE_INPUT_GPC); - $id = $this->genid(); - $content = $this->action_div($fid, $id, false); - - $this->rc->output->command('managesieve_actionfill', $content, $id, $aid); - } - - $this->rc->output->send(); - } - - $this->managesieve_send(); - } - - function managesieve_save() - { - // Init plugin and handle managesieve connection - $error = $this->managesieve_start(); - - // 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); -// $this->rc->session->remove('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, true)); - $fid = trim(get_input_value('_fid', RCUBE_INPUT_POST)); - $join = trim(get_input_value('_join', RCUBE_INPUT_POST)); - - // and arrays - $headers = $_POST['_header']; - $cust_headers = $_POST['_custom_header']; - $ops = $_POST['_rule_op']; - $sizeops = $_POST['_rule_size_op']; - $sizeitems = $_POST['_rule_size_item']; - $sizetargets = $_POST['_rule_size_target']; - $targets = $_POST['_rule_target']; - $act_types = $_POST['_action_type']; - $mailboxes = $_POST['_action_mailbox']; - $act_targets = $_POST['_action_target']; - $area_targets = $_POST['_action_target_area']; - $reasons = $_POST['_action_reason']; - $addresses = $_POST['_action_addresses']; - $days = $_POST['_action_days']; - - // we need a "hack" for radiobuttons - foreach ($sizeitems as $item) - $items[] = $item; - - $this->form['disabled'] = $_POST['_disabled'] ? true : false; - $this->form['join'] = $join=='allof' ? true : false; - $this->form['name'] = $name; - $this->form['tests'] = array(); - $this->form['actions'] = array(); - - if ($name == '') - $this->errors['name'] = $this->gettext('cannotbeempty'); - else - foreach($this->script as $idx => $rule) - if($rule['name'] == $name && $idx != $fid) { - $this->errors['name'] = $this->gettext('ruleexist'); - break; - } - - $i = 0; - // rules - if ($join == 'any') - { - $this->form['tests'][0]['test'] = 'true'; - } - else foreach($headers as $idx => $header) - { - $header = $this->strip_value($header); - $target = $this->strip_value($targets[$idx], true); - $op = $this->strip_value($ops[$idx]); - - // normal header - if (in_array($header, $this->headers)) - { - if(preg_match('/^not/', $op)) - $this->form['tests'][$i]['not'] = true; - $type = preg_replace('/^not/', '', $op); - - if ($type == 'exists') - { - $this->form['tests'][$i]['test'] = 'exists'; - $this->form['tests'][$i]['arg'] = $header; - } - else - { - $this->form['tests'][$i]['type'] = $type; - $this->form['tests'][$i]['test'] = 'header'; - $this->form['tests'][$i]['arg1'] = $header; - $this->form['tests'][$i]['arg2'] = $target; - - if ($target == '') - $this->errors['tests'][$i]['target'] = $this->gettext('cannotbeempty'); - } - } - else - switch ($header) - { - case 'size': - $sizeop = $this->strip_value($sizeops[$idx]); - $sizeitem = $this->strip_value($items[$idx]); - $sizetarget = $this->strip_value($sizetargets[$idx]); - - $this->form['tests'][$i]['test'] = 'size'; - $this->form['tests'][$i]['type'] = $sizeop; - $this->form['tests'][$i]['arg'] = $sizetarget.$sizeitem; - - if (!preg_match('/^[0-9]+(K|M|G)*$/i', $sizetarget)) - $this->errors['tests'][$i]['sizetarget'] = $this->gettext('wrongformat'); - break; - case '...': - $cust_header = $headers = $this->strip_value($cust_headers[$idx]); - - if(preg_match('/^not/', $op)) - $this->form['tests'][$i]['not'] = true; - $type = preg_replace('/^not/', '', $op); - - if ($cust_header == '') - $this->errors['tests'][$i]['header'] = $this->gettext('cannotbeempty'); - else { - $headers = preg_split('/[\s,]+/', $cust_header, -1, PREG_SPLIT_NO_EMPTY); - - if (!count($headers)) - $this->errors['tests'][$i]['header'] = $this->gettext('cannotbeempty'); - else { - foreach ($headers as $hr) - if (!preg_match('/^[a-z0-9-]+$/i', $hr)) - $this->errors['tests'][$i]['header'] = $this->gettext('forbiddenchars'); - } - } - - if (empty($this->errors['tests'][$i]['header'])) - $cust_header = (is_array($headers) && count($headers) == 1) ? $headers[0] : $headers; - - if ($type == 'exists') - { - $this->form['tests'][$i]['test'] = 'exists'; - $this->form['tests'][$i]['arg'] = $cust_header; - } - else - { - $this->form['tests'][$i]['test'] = 'header'; - $this->form['tests'][$i]['type'] = $type; - $this->form['tests'][$i]['arg1'] = $cust_header; - $this->form['tests'][$i]['arg2'] = $target; - - if ($target == '') - $this->errors['tests'][$i]['target'] = $this->gettext('cannotbeempty'); - } - break; - } - $i++; - } - - $i = 0; - // actions - foreach($act_types as $idx => $type) - { - $type = $this->strip_value($type); - $target = $this->strip_value($act_targets[$idx]); - - $this->form['actions'][$i]['type'] = $type; - - switch ($type) - { - case 'fileinto': - $mailbox = $this->strip_value($mailboxes[$idx]); - $this->form['actions'][$i]['target'] = $mailbox; - break; - case 'reject': - case 'ereject': - $target = $this->strip_value($area_targets[$idx]); - $this->form['actions'][$i]['target'] = str_replace("\r\n", "\n", $target); - - // if ($target == '') -// $this->errors['actions'][$i]['targetarea'] = $this->gettext('cannotbeempty'); - break; - case 'redirect': - $this->form['actions'][$i]['target'] = $target; - - if ($this->form['actions'][$i]['target'] == '') - $this->errors['actions'][$i]['target'] = $this->gettext('cannotbeempty'); - else if (!$this->check_email($this->form['actions'][$i]['target'])) - $this->errors['actions'][$i]['target'] = $this->gettext('noemailwarning'); - break; - case 'vacation': - $reason = $this->strip_value($reasons[$idx]); - $this->form['actions'][$i]['reason'] = str_replace("\r\n", "\n", $reason); - $this->form['actions'][$i]['days'] = $days[$idx]; - $this->form['actions'][$i]['addresses'] = explode(',', $addresses[$idx]); -// @TODO: vacation :subject, :mime, :from, :handle - - if ($this->form['actions'][$i]['addresses']) { - foreach($this->form['actions'][$i]['addresses'] as $aidx => $address) { - $address = trim($address); - if (!$address) - unset($this->form['actions'][$i]['addresses'][$aidx]); - else if(!$this->check_email($address)) { - $this->errors['actions'][$i]['addresses'] = $this->gettext('noemailwarning'); - break; - } else - $this->form['actions'][$i]['addresses'][$aidx] = $address; - } - } - - if ($this->form['actions'][$i]['reason'] == '') - $this->errors['actions'][$i]['reason'] = $this->gettext('cannotbeempty'); - if ($this->form['actions'][$i]['days'] && !preg_match('/^[0-9]+$/', $this->form['actions'][$i]['days'])) - $this->errors['actions'][$i]['days'] = $this->gettext('forbiddenchars'); - break; - } - - $i++; - } - - if (!$this->errors) - { - // zapis skryptu - if (!isset($this->script[$fid])) { - $fid = $this->sieve->script->add_rule($this->form); - $new = true; - } else - $fid = $this->sieve->script->update_rule($fid, $this->form); - - if ($fid !== false) - $save = $this->sieve->save(); - - if ($save && $fid !== false) - { - $this->rc->output->show_message('managesieve.filtersaved', 'confirmation'); - $this->rc->output->add_script( - sprintf("rcmail.managesieve_updatelist('%s', '%s', %d, %d);", - isset($new) ? 'add' : 'update', Q($this->form['name']), $fid, $this->form['disabled']), - 'foot'); - } - else - { - $this->rc->output->show_message('managesieve.filtersaveerror', 'error'); -// $this->rc->output->send(); - } - } - } - - $this->managesieve_send(); - } - - private function managesieve_send() - { - // Handle form action - 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'); - } - } - - // return the filters list as HTML table - function filters_list($attrib) - { - // add id to message list table if not specified - if (!strlen($attrib['id'])) - $attrib['id'] = 'rcmfilterslist'; - - // define list of cols to be displayed - $a_show_cols = array('managesieve.filtername'); - - foreach($this->script as $idx => $filter) - $result[] = array( - 'managesieve.filtername' => $filter['name'], - 'id' => $idx, - 'class' => $filter['disabled'] ? 'disabled' : '', - ); - - // create XHTML table - $out = rcube_table_output($attrib, $result, $a_show_cols, 'id'); - - // set client env - $this->rc->output->add_gui_object('filterslist', $attrib['id']); - $this->rc->output->include_script('list.js'); - - // add some labels to client - $this->rc->output->add_label('managesieve.filterdeleteconfirm'); - - return $out; - } - - // return the filters list as error_class($id, 'test', 'header') - .' value="' .Q($custom). '" size="20" /> ' . "\n"; - - // matching type select (operator) - $select_op = new html_select(array('name' => "_rule_op[]", 'id' => 'rule_op'.$id, - 'style' => 'display:' .($rule['test']!='size' ? 'inline' : 'none'), 'onchange' => 'rule_op_select('.$id.')')); - $select_op->add(Q($this->gettext('filtercontains')), 'contains'); - $select_op->add(Q($this->gettext('filternotcontains')), 'notcontains'); - $select_op->add(Q($this->gettext('filteris')), 'is'); - $select_op->add(Q($this->gettext('filterisnot')), 'notis'); - $select_op->add(Q($this->gettext('filterexists')), 'exists'); - $select_op->add(Q($this->gettext('filternotexists')), 'notexists'); -// $select_op->add(Q($this->gettext('filtermatches')), 'matches'); -// $select_op->add(Q($this->gettext('filternotmatches')), 'notmatches'); - - // target input (TODO: lists) - - if ($rule['test'] == 'header') - { - $out .= $select_op->show(($rule['not'] ? 'not' : '').$rule['type']); - $target = $rule['arg2']; - } - elseif ($rule['test'] == 'size') - { - $out .= $select_op->show(); - if(preg_match('/^([0-9]+)(K|M|G)*$/', $rule['arg'], $matches)) - { - $sizetarget = $matches[1]; - $sizeitem = $matches[2]; - } - } - else - { - $out .= $select_op->show(($rule['not'] ? 'not' : '').$rule['test']); - $target = ''; - } - - $out .= 'error_class($id, 'test', 'target') - . ' style="display:' . ($rule['test']!='size' && $rule['test'] != 'exists' ? 'inline' : 'none') . '" />'."\n"; - - $select_size_op = new html_select(array('name' => "_rule_size_op[]", 'id' => 'rule_size_op'.$id)); - $select_size_op->add(Q($this->gettext('filterunder')), 'under'); - $select_size_op->add(Q($this->gettext('filterover')), 'over'); - - $out .= '
'; - $out .= $select_size_op->show($rule['test']=='size' ? $rule['type'] : ''); - $out .= 'error_class($id, 'test', 'sizetarget') .' /> - B - kB - MB - GB'; - $out .= '
'; - $out .= ''; - - // add/del buttons - $out .= ''; - $out .= ' '; - $out .= ''; - $out .= ''; - - $out .= $div ? "\n" : ''; - - return $out; - } - - function action_div($fid, $id, $div=true) - { - $action = isset($this->form) ? $this->form['actions'][$id] : $this->script[$fid]['actions'][$id]; - $rows_num = isset($this->form) ? sizeof($this->form['actions']) : sizeof($this->script[$fid]['actions']); - - $out = $div ? '
'."\n" : ''; - - $out .= ''; - - // actions target inputs - $out .= ''; - - // add/del buttons - $out .= ''; - - $out .= '
'; - - // action select - $select_action = new html_select(array('name' => "_action_type[]", 'id' => 'action_type'.$id, - 'onchange' => 'action_type_select(' .$id .')')); - if (in_array('fileinto', $this->exts)) - $select_action->add(Q($this->gettext('messagemoveto')), 'fileinto'); - $select_action->add(Q($this->gettext('messageredirect')), 'redirect'); - if (in_array('reject', $this->exts)) - $select_action->add(Q($this->gettext('messagediscard')), 'reject'); - elseif (in_array('ereject', $this->exts)) - $select_action->add(Q($this->gettext('messagediscard')), 'ereject'); - if (in_array('vacation', $this->exts)) - $select_action->add(Q($this->gettext('messagereply')), 'vacation'); - $select_action->add(Q($this->gettext('messagedelete')), 'discard'); - $select_action->add(Q($this->gettext('rulestop')), 'stop'); - - $out .= $select_action->show($action['type']); - $out .= ''; - // shared targets - $out .= 'error_class($id, 'action', 'target') .' />'; - $out .= '\n"; - - // vacation - $out .= '
'; - $out .= ''. Q($this->gettext('vacationreason')) .'
' - .'\n"; - $out .= '
' .Q($this->gettext('vacationaddresses')) . '
' - .'error_class($id, 'action', 'addresses') .' />'; - $out .= '
' . Q($this->gettext('vacationdays')) . '
' - .'error_class($id, 'action', 'days') .' />'; - $out .= '
'; - - // mailbox select - $out .= ''; - $out .= '
'; - $out .= ' '; - $out .= ''; - $out .= '
'; - - $out .= $div ? "
\n" : ''; - - return $out; - } - - private function genid() - { - $result = intval(rcube_timer()); - return $result; - } - - private function strip_value($str, $allow_html=false) - { - if (!$allow_html) - $str = strip_tags($str); - - return trim($str); - } - - private function error_class($id, $type, $target, $name_only=false) - { - // TODO: tooltips - if ($type == 'test' && isset($this->errors['tests'][$id][$target])) - return ($name_only ? 'error' : ' class="error"'); - elseif ($type == 'action' && isset($this->errors['actions'][$id][$target])) - return ($name_only ? 'error' : ' class="error"'); - - return ''; - } - - private function check_email($email) - { - if (function_exists('check_email')); - return check_email($email); - - // Check for invalid characters - if (preg_match('/[\x00-\x1F\x7F-\xFF]/', $email)) - return false; - - // Check that there's one @ symbol, and that the lengths are right - if (!preg_match('/^[^@]{1,64}@[^@]{1,255}$/', $email)) - return false; - - // Split it into sections to make life easier - $email_array = explode('@', $email); - - // Check local part - $local_array = explode('.', $email_array[0]); - foreach ($local_array as $local_part) - if (!preg_match('/^(([A-Za-z0-9!#$%&\'*+\/=?^_`{|}~-]+)|("[^"]+"))$/', $local_part)) - return false; - - // Check domain part - if (preg_match('/^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}$/', $email_array[1]) - || preg_match('/^\[(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}\]$/', $email_array[1])) - return true; // If an IP address - else - { // If not an IP address - $domain_array = explode('.', $email_array[1]); - if (sizeof($domain_array) < 2) - return false; // Not enough parts to be a valid domain - - foreach ($domain_array as $domain_part) - if (!preg_match('/^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]))$/', $domain_part)) - return false; - - return true; - } - - return false; - } - - private function mbox_encode($text, $encoding) - { - return rcube_charset_convert($text, 'UTF7-IMAP', $encoding); - } -} - -?> -- cgit v1.2.3