+ // 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_POST);
+ $copy = get_input_value('_copy', RCUBE_INPUT_POST);
+ $from = get_input_value('_from', RCUBE_INPUT_POST);
+
+ if (!$name)
+ $error = 'managesieve.emptyname';
+ else if (mb_strlen($name)>128)
+ $error = 'managesieve.nametoolong';
+ else if ($from == 'file') {
+ // from file
+ if (is_uploaded_file($_FILES['_file']['tmp_name'])) {
+ $file = file_get_contents($_FILES['_file']['tmp_name']);
+ $file = preg_replace('/\r/', '', $file);
+ // for security don't save script directly
+ // check syntax before, like this...
+ $this->sieve->load_script($file);
+ if (!$this->sieve->save($name)) {
+ $error = 'managesieve.setcreateerror';
+ }
+ }
+ else { // upload failed
+ $err = $_FILES['_file']['error'];
+ $error = true;
+
+ if ($err == UPLOAD_ERR_INI_SIZE || $err == UPLOAD_ERR_FORM_SIZE) {
+ $msg = rcube_label(array('name' => 'filesizeerror',
+ 'vars' => array('size' =>
+ show_bytes(parse_bytes(ini_get('upload_max_filesize'))))));
+ }
+ else {
+ $error = 'fileuploaderror';
+ }
+ }
+ }
+ else if (!$this->sieve->copy($name, $from == 'set' ? $copy : '')) {
+ $error = 'managesieve.setcreateerror';
+ }
+
+ if (!$error) {
+ $this->rc->output->show_message('managesieve.setcreated', 'confirmation');
+ $this->rc->output->command('parent.managesieve_reload', $name);
+ } else if ($msg) {
+ $this->rc->output->command('display_message', $msg, 'error');
+ } 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'];
+ $subject = $_POST['_action_subject'];
+ $flags = $_POST['_action_flags'];
+
+ // 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 if (preg_match('/^(value|count)-/', $type) && !preg_match('/[0-9]+/', $target))
+ $this->errors['tests'][$i]['target'] = $this->gettext('forbiddenchars');
+ }
+ }
+ 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 ($sizetarget == '')
+ $this->errors['tests'][$i]['sizetarget'] = $this->gettext('cannotbeempty');
+ else if (!preg_match('/^[0-9]+(K|M|G)*$/i', $sizetarget))
+ $this->errors['tests'][$i]['sizetarget'] = $this->gettext('forbiddenchars');
+ 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');
+ else if (preg_match('/^(value|count)-/', $type) && !preg_match('/[0-9]+/', $target))
+ $this->errors['tests'][$i]['target'] = $this->gettext('forbiddenchars');
+ }
+ break;
+ }
+ $i++;
+ }
+ }
+
+ $i = 0;
+ // actions
+ foreach($act_types as $idx => $type) {
+ $type = $this->strip_value($type);
+ $target = $this->strip_value($act_targets[$idx]);
+
+ switch ($type) {
+
+ case 'fileinto':
+ case 'fileinto_copy':
+ $mailbox = $this->strip_value($mailboxes[$idx]);
+ $this->form['actions'][$i]['target'] = $this->mod_mailbox($mailbox, 'in');
+ if ($type == 'fileinto_copy') {
+ $type = 'fileinto';
+ $this->form['actions'][$i]['copy'] = true;
+ }
+ 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':
+ case 'redirect_copy':
+ $this->form['actions'][$i]['target'] = $target;
+
+ if ($this->form['actions'][$i]['target'] == '')
+ $this->errors['actions'][$i]['target'] = $this->gettext('cannotbeempty');
+ else if (!check_email($this->form['actions'][$i]['target']))
+ $this->errors['actions'][$i]['target'] = $this->gettext('noemailwarning');
+
+ if ($type == 'redirect_copy') {
+ $type = 'redirect';
+ $this->form['actions'][$i]['copy'] = true;
+ }
+ break;
+
+ case 'addflag':
+ case 'setflag':
+ case 'removeflag':
+ $_target = array();
+ if (empty($flags[$idx])) {
+ $this->errors['actions'][$i]['target'] = $this->gettext('noflagset');
+ }
+ else {
+ foreach ($flags[$idx] as $flag) {
+ $_target[] = $this->strip_value($flag);
+ }
+ }
+ $this->form['actions'][$i]['target'] = $_target;
+ 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]['subject'] = $subject[$idx];
+ $this->form['actions'][$i]['addresses'] = explode(',', $addresses[$idx]);
+// @TODO: vacation :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(!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;
+ }
+
+ $this->form['actions'][$i]['type'] = $type;
+ $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();