t7> 6L+P"t{^O'1Z,>PZ}ԲV_UTQKҳ> O)P]Yi %Ϯ:j,S);#&PCeƪ5-  ez2tR L]8m0gWGhGҤ/7.oθX_HeP lϱt,Zz-ءK<;@S[Uľf3}Eo{a}MM +Ieobp/7w8"U CpWiJ]'IcV@fE 'y-ܫ}B=>}} Eo.|f@>?&6FމEr^nθ6hᥟb}KrԶ`E^֣^;K;}'(ȽO1 ^x؊|vlʉ9+ 7 @L*K Ֆϛ٭W(k98\VF'?#b^ MdW)FmO#M?wY):B"xkصrC&u=+ Y *8v)Gh.]Wgs13w36CH]ղTf]3Fց޶Ml"TꎝXh_ў48hqeW6M꿎kι M(cTD`0'ȣ2F0,e6Ixi 3ί nPg:rz-w+,v7p8t&oF*].G ɿ{)ϩwaR62Hm.qCd(<q~6fD,w;}&STDu#\e(@F+xɱ=| ,-2>C0 Uˌ!A+Vł !g۸qRK{Đd7dDnX䰅Iu&kc16DpNB±8O&٠*Q0APEwoy& # 37/";:Kߔդ*{8S.xGJ㩬]麛t9:5aa'5ޔTRR`'S*v~ڻ~\gQW [Sb8y.! U_5ǷX<ﵢ\,'QI !4i%_ ]qT?UA0!73xf `Id7 bA,,g?rSy;:D,ƥUҤk)ҶP6{%rd 3Hse|%N!2H kY K@_ Ùhn@M^@Wti+ ۸q&^?P':<h-sc?>TZWMzd}9[mcSI[<J\:}%C͋s! K%ds|WU"eRMc"̒2͂D`/df~?rQK*>!uJ ]9{f;l @iz6O[k`ٖu]\HRgM]j3iQW3q:}a*_GYG˲Dz<& ~xK+>]&ފ^[nn|Ub RN9$U?5%v&KS$p+>3j>:KFj M-n7Y %[`u5/|9ǕflYReHF`?'LA9ˋHWKJt! /hMH 0ynad=3y⻄d&) dzeAoBcHqwϐ/w8ZB0@SN§6SyK]G6pFV\;`Yb8aij\cΎ~jtAno74Z Er3SVkH5̌,;wI7I;~i\K\+􂹷&FU8"KJuFwl`*Z` Bͷ*1|X;]8fxZ/Qn~82ԩDwgFN5K]OO!ġM}-^/T5']vH$;ʢQ\9Rs<{ׂbf:x5wgFN5K]OĨV$Xd1[MeN%RiX}߂aS6NŃ/!wgFN5K]O?rQK*>wgFN5K]O]l@ uKCL⮎ wgFN5K]O.^b ,<s "2\06ܐ2xS%vB-T(پxPAJ3"Qŷ-wgFN5K]OwgFN5K]OZL!;Y#)* 7.XRf?BQ@kwgFN5K]O>T5?, H8wgFN5K]O 26r_>T5?, H8]l@ uKCL⮎ dp{clJ,RFLh|u'"f/:bmXjN͋znZw- ʃ\v(!VljMw t .f~f7P8o |)ovM{ώMB J/ ZU};Fx!ncp/a4c@‘˹])iEx+f0Ate7: 6M))UeL m{65kb叮XqK!B'-+r?È}:[D~?8|Xdnj]<+ WiYΰ1+/\D(!ýIS]ŧ_cKVP]TwgFN5K]OUA^SkDeYN}G^v6ibjÆXA>?dshz_B"kƽI9TFCwgFN5K]O[do84cF󫤠jI]*9>T5?, H8jI]*9*W3!0(w?rT)Z#fI:nP`b&\}B8Z%Un|Ai7񄱳ZX1ap8(Jb:Us89<0psntCj[}4*7 @t',9+m&슍1\Gjtive or just existing script (in that order) if (!empty($this->active)) { $this->sieve->load($this->script_name = $this->active[0]); } else { $this->sieve->load($this->script_name = $list[0]); } } return $this->sieve->error(); } private function forward_rule() { if ($this->script_name === false || $this->script_name === null || !$this->sieve->load($this->script_name)) { return; } $list = []; $active = in_array($this->script_name, $this->active); // find (first) simple forward rule that can be expressed with the minimal settings foreach ($this->script as $idx => $rule) { if (empty($this->forward) && !empty($rule['actions']) && $rule['actions'][0]['type'] == 'redirect') { $ignore_rule = false; $target = null; $stop_found = false; $action = 'keep'; foreach ($rule['actions'] as $act) { if ($stop_found) { // we might loose information if there rules after the stop $ignore_rule = true; } if ($act['type'] == 'keep') { $action = 'copy'; } else if ($act['type'] == 'stop') { // we might loose information if there are rules after the stop $stop_found = true; } else if ($act['type'] == 'discard') { $action = 'redirect'; } else if ($act['type'] == 'redirect') { if (!empty($target)) { // we cannot use this rule, because there are multiple targets $ignore_rule = true; } else { $action = !empty($act['copy']) ? 'copy' : 'redirect'; $target = $act['target']; } } else { // we cannot use this rule, because there are unknown commands, and we don't want to overwrite them. $ignore_rule = true; } } if (count($rule['tests']) != 1 || $rule['tests'][0]['test'] != "true" || $rule['tests'][0]['not'] != null) { // ignore rules that have special conditions $ignore_rule = true; } if (!$ignore_rule) { $this->forward = array_merge($rule['actions'][0], [ 'idx' => $idx, 'disabled' => $rule['disabled'] || !$active, 'name' => $rule['name'], 'tests' => $rule['tests'], 'action' => $action, 'target' => $target, ]); } } else if ($active) { $list[$idx] = $rule['name']; } } $this->forward['list'] = $list; } private function forward_post() { if (empty($_POST)) { return; } $status = rcube_utils::get_input_string('forward_status', rcube_utils::INPUT_POST); $action = rcube_utils::get_input_string('forward_action', rcube_utils::INPUT_POST); $target = rcube_utils::get_input_string('action_target', rcube_utils::INPUT_POST, true); $target_domain = rcube_utils::get_input_string('action_domain', rcube_utils::INPUT_POST); $date_extension = in_array('date', $this->exts); if ($target_domain) { $target .= '@' . $target_domain; } if (empty($target) || !rcube_utils::check_email($target)) { $error = 'noemailwarning'; } if (empty($this->forward['tests'])) { $forward_tests = (array) $this->rc->config->get('managesieve_forward_test', [['test' => 'true']]); } else { $forward_tests = (array) $this->forward['tests']; } if (empty($error)) { $rule = $this->forward; $rule['type'] = 'if'; $rule['name'] = !empty($rule['name']) ? $rule['name'] : $this->plugin->gettext('forward'); $rule['disabled'] = $status == 'off'; $rule['tests'] = $forward_tests; $rule['join'] = $date_extension ? count($forward_tests) > 1 : false; $rule['actions'] = [[ 'type' => 'redirect', 'copy' => $action == 'copy', 'target' => $target, ]]; if ($this->merge_rule($rule, $this->forward, $this->script_name)) { $this->rc->output->show_message('managesieve.forwardsaved', 'confirmation'); $this->rc->output->send(); } } if (empty($error)) { $error = 'managesieve.saveerror'; } $this->rc->output->show_message($error, 'error'); $this->rc->output->send(); } /** * Independent forward form */ public function forward_form($attrib) { // build FORM tag $form_id = !empty($attrib['id']) ? $attrib['id'] : 'form'; $out = $this->rc->output->request_form([ 'id' => $form_id, 'name' => $form_id, 'method' => 'post', 'task' => 'settings', 'action' => 'plugin.managesieve-forward', 'noclose' => true ] + $attrib ); // form elements $status = new html_select(['name' => 'forward_status', 'id' => 'forward_status', 'class' => 'custom-select']); $action = new html_select(['name' => 'forward_action', 'id' => 'forward_action', 'class' => 'custom-select']); $status->add($this->plugin->gettext('forward.on'), 'on'); $status->add($this->plugin->gettext('forward.off'), 'off'); if (in_array('copy', $this->exts)) { $action->add($this->plugin->gettext('forward.copy'), 'copy'); } $action->add($this->plugin->gettext('forward.redirect'), 'redirect'); // force domain selection in redirect email input $domains = (array) $this->rc->config->get('managesieve_domains'); $redirect = !empty($this->forward['action']) && ($this->forward['action'] == 'redirect' || $this->forward['action'] == 'copy'); if (!empty($domains)) { sort($domains); $domain_select = new html_select(['name' => 'action_domain', 'id' => 'action_domain', 'class' => 'custom-select']); $domain_select->add(array_combine($domains, $domains)); if ($redirect && !empty($this->forward['target'])) { $parts = explode('@', $this->forward['target']); if (!empty($parts)) { $this->forward['domain'] = array_pop($parts); $this->forward['target'] = implode('@', $parts); } } } // redirect target $action_target = '' . '' . (!empty($domain_select) ? ' @ ' . $domain_select->show(!empty($this->forward['domain']) ? $this->forward['domain'] : null) : '') . ''; // Message tab $table = new html_table(['cols' => 2]); $table->add('title', html::label('forward_action', $this->plugin->gettext('forward.action'))); $table->add('forward input-group input-group-combo', $action->show(!empty($this->forward['action']) ? $this->forward['action'] : null) . ' ' . $action_target ); $table->add('title', html::label('forward_status', $this->plugin->gettext('forward.status'))); $table->add(null, $status->show(!isset($this->forward['disabled']) || $this->forward['disabled'] ? 'off' : 'on')); $out .= $table->show($attrib); $out .= ''; $this->rc->output->add_gui_object('sieveform', $form_id); return $out; } /** * API: get forward rule * * @return array forward rule information */ public function get_forward() { $this->exts = $this->sieve->get_extensions(); $this->init_script(); $this->forward_rule(); $forward = [ 'supported' => $this->exts, 'enabled' => empty($this->forward['disabled']), 'action' => $this->forward['action'], 'target' => $this->forward['target'], ]; return $forward; } /** * API: set forward rule * * @param array $forward forward rule information (see self::get_forward()) * * @return bool True on success, False on failure */ public function set_forward($data) { $this->exts = $this->sieve->get_extensions(); $this->error = false; $this->init_script(); $this->forward_rule(); $date_extension = in_array('date', $this->exts); if ($data['action'] == 'redirect' || $data['action'] == 'copy') { if (empty($data['target']) || !rcube_utils::check_email($data['target'])) { $this->error = "Invalid address in action target: " . $data['target']; return false; } } else if ($data['action']) { $this->error = "Unsupported forward action: " . $data['action']; return false; } if (empty($forward_tests)) { $forward_tests = (array) $this->rc->config->get('managesieve_forward_test', [['test' => 'true']]); } $rule = $this->forward; $rule['type'] = 'if'; $rule['name'] = !empty($rule['name']) ? $rule['name'] : 'Out-of-Office'; $rule['disabled'] = isset($data['enabled']) && !$data['enabled']; $rule['tests'] = $forward_tests; $rule['join'] = $date_extension ? count($forward_tests) > 1 : false; $rule['actions'] = [[ 'type' => 'redirect', 'copy' => $data['action'] == 'copy', 'target' => $data['target'], ]]; return $this->merge_rule($rule, $this->forward, $this->script_name); } /** * API: connect to managesieve server */ public function connect($username, $password) { $error = parent::connect($username, $password); if ($error) { return $error; } return $this->load_script(); } /** * API: Returns last error * * @return string Error message */ public function get_error() { return $this->error; } }