private function vacation_post() { if (empty($_POST)) { return; } $date_extension = in_array('date', $this->exts); $regex_extension = in_array('regex', $this->exts); // set user's timezone try { $timezone = new DateTimeZone($this->rc->config->get('timezone', 'GMT')); } catch (Exception $e) { $timezone = new DateTimeZone('GMT'); } $status = rcube_utils::get_input_value('vacation_status', rcube_utils::INPUT_POST); $from = rcube_utils::get_input_value('vacation_from', rcube_utils::INPUT_POST); $subject = rcube_utils::get_input_value('vacation_subject', rcube_utils::INPUT_POST, true); $reason = rcube_utils::get_input_value('vacation_reason', rcube_utils::INPUT_POST, true); $addresses = rcube_utils::get_input_value('vacation_addresses', rcube_utils::INPUT_POST, true); $interval = rcube_utils::get_input_value('vacation_interval', rcube_utils::INPUT_POST); $interval_type = rcube_utils::get_input_value('vacation_interval_type', rcube_utils::INPUT_POST); $date_from = rcube_utils::get_input_value('vacation_datefrom', rcube_utils::INPUT_POST); $date_to = rcube_utils::get_input_value('vacation_dateto', rcube_utils::INPUT_POST); $time_from = rcube_utils::get_input_value('vacation_timefrom', rcube_utils::INPUT_POST); $time_to = rcube_utils::get_input_value('vacation_timeto', rcube_utils::INPUT_POST); $after = rcube_utils::get_input_value('vacation_after', rcube_utils::INPUT_POST); $action = rcube_utils::get_input_value('vacation_action', rcube_utils::INPUT_POST); $target = rcube_utils::get_input_value('action_target', rcube_utils::INPUT_POST, true); $target_domain = rcube_utils::get_input_value('action_domain', rcube_utils::INPUT_POST); $interval_type = $interval_type == 'seconds' ? 'seconds' : 'days'; $vacation_action['type'] = 'vacation'; $vacation_action['reason'] = $this->strip_value(str_replace("\r\n", "\n", $reason)); $vacation_action['subject'] = trim($subject); $vacation_action['from'] = trim($from); $vacation_action['addresses'] = $addresses; $vacation_action[$interval_type] = $interval; $vacation_tests = (array) $this->vacation['tests']; foreach ((array) $vacation_action['addresses'] as $aidx => $address) { $vacation_action['addresses'][$aidx] = $address = trim($address); if (empty($address)) { unset($vacation_action['addresses'][$aidx]); } else { if (!rcube_utils::check_email($address)) { $error = 'noemailwarning'; break; } } } if (!empty($vacation_action['from']) && !rcube_utils::check_email($vacation_action['from'])) { $error = 'noemailwarning'; } if ($vacation_action['reason'] == '') { $error = 'managesieve.emptyvacationbody'; } if ($vacation_action[$interval_type] && !preg_match('/^[0-9]+$/', $vacation_action[$interval_type])) { $error = 'managesieve.forbiddenchars'; } // find and remove existing date/regex/true rules foreach ((array) $vacation_tests as $idx => $t) { if ($t['test'] == 'currentdate' || $t['test'] == 'true' || $t['test'] == 'header' && $t['type'] == 'regex' && $t['arg1'] == 'received') { unset($vacation_tests[$idx]); } } if ($date_extension) { $date_format = $this->rc->config->get('date_format', 'Y-m-d'); foreach (array('date_from', 'date_to') as $var) { $time = ${str_replace('date', 'time', $var)}; $date = rcube_utils::format_datestr(${$var}, $date_format); $date = trim($date . ' ' . $time); if ($date && ($dt = rcube_utils::anytodatetime($date, $timezone))) { if ($time) { $vacation_tests[] = array('test' => 'currentdate', 'part' => 'iso8601', 'type' => 'value-' . ($var == 'date_from' ? 'ge' : 'le'), 'zone' => $dt->format('O'), 'arg' => str_replace('+00:00', 'Z', strtoupper($dt->format('c')))); } else { $vacation_tests[] = array('test' => 'currentdate', 'part' => 'date', 'type' => 'value-' . ($var == 'date_from' ? 'ge' : 'le'), 'zone' => $dt->format('O'), 'arg' => $dt->format('Y-m-d')); } } } } else { if ($regex_extension) { // Add date range rules if range specified if ($date_from && $date_to) { if ($tests = self::build_regexp_tests($date_from, $date_to, $error)) { $vacation_tests = array_merge($vacation_tests, $tests); } } } } if ($action == 'redirect' || $action == 'copy') { if ($target_domain) { $target .= '@' . $target_domain; } if (empty($target) || !rcube_utils::check_email($target)) { $error = 'noemailwarning'; } } if (empty($vacation_tests)) { $vacation_tests = $this->rc->config->get('managesieve_vacation_test', array(array('test' => 'true'))); } if (!$error) { $rule = $this->vacation; $rule['type'] = 'if'; $rule['name'] = $rule['name'] ?: $this->plugin->gettext('vacation'); $rule['disabled'] = $status == 'off'; $rule['tests'] = $vacation_tests; $rule['join'] = $date_extension ? count($vacation_tests) > 1 : false; $rule['actions'] = array($vacation_action); $rule['after'] = $after; if ($action && $action != 'keep') { $rule['actions'][] = array('type' => $action == 'discard' ? 'discard' : 'redirect', 'copy' => $action == 'copy', 'target' => $action != 'discard' ? $target : ''); } if ($this->save_vacation_script($rule)) { $this->rc->output->show_message('managesieve.vacationsaved', 'confirmation'); $this->rc->output->send(); } } $this->rc->output->show_message($error ?: 'managesieve.saveerror', 'error'); $this->rc->output->send(); }
/** * rcube:utils::format_datestr() */ function test_format_datestr() { $test = array(array('abc-555', 'abc', 'abc-555'), array('2013-04-22', 'Y-m-d', '2013-04-22'), array('22/04/2013', 'd/m/Y', '2013-04-22'), array('4.22.2013', 'm.d.Y', '2013-04-22')); foreach ($test as $data) { $result = rcube_utils::format_datestr($data[0], $data[1]); $this->assertSame($data[2], $result, "Error formatting date: " . $data[0]); } }