From 59478e06c25303a790a0840ab2ac30662c4ef781 Mon Sep 17 00:00:00 2001 From: Hugues Hiegel Date: Tue, 5 Aug 2014 16:46:22 +0200 Subject: c'est la merde.. --- plugins/sieverules/config.inc.php.dist | 147 ++ plugins/sieverules/importFilters/avelsieve.php | 54 + plugins/sieverules/importFilters/ingo.php | 52 + plugins/sieverules/include/rcube_sieve.php | 249 +++ plugins/sieverules/include/rcube_sieve_script.php | 969 ++++++++ plugins/sieverules/jquery.maskedinput.js | 7 + plugins/sieverules/lib/Net/Sieve.php | 1 + plugins/sieverules/localization/ca_ES.inc | 168 ++ plugins/sieverules/localization/cs_CZ.inc | 195 ++ plugins/sieverules/localization/de_CH.inc | 192 ++ plugins/sieverules/localization/de_DE.inc | 192 ++ plugins/sieverules/localization/en_GB.inc | 205 ++ plugins/sieverules/localization/en_US.inc | 205 ++ plugins/sieverules/localization/es_AR.inc | 140 ++ plugins/sieverules/localization/es_ES.inc | 185 ++ plugins/sieverules/localization/et_EE.inc | 79 + plugins/sieverules/localization/fi_FI.inc | 186 ++ plugins/sieverules/localization/fr_FR.inc | 185 ++ plugins/sieverules/localization/hu_HU.inc | 171 ++ plugins/sieverules/localization/it_IT.inc | 202 ++ plugins/sieverules/localization/nl_NL.inc | 205 ++ plugins/sieverules/localization/pl_PL.inc | 205 ++ plugins/sieverules/localization/pt_BR.inc | 183 ++ plugins/sieverules/localization/pt_PT.inc | 183 ++ plugins/sieverules/localization/ro_RO.inc | 175 ++ plugins/sieverules/localization/ru_RU.inc | 182 ++ plugins/sieverules/localization/sk_SK.inc | 159 ++ plugins/sieverules/localization/sl_SI.inc | 185 ++ plugins/sieverules/localization/sv_SE.inc | 159 ++ plugins/sieverules/localization/zh_TW.inc | 192 ++ plugins/sieverules/package.xml | 116 + plugins/sieverules/sieverules.js | 1480 +++++++++++++ plugins/sieverules/sieverules.php | 2331 ++++++++++++++++++++ plugins/sieverules/skins/classic/cross.gif | Bin 0 -> 577 bytes plugins/sieverules/skins/classic/help.gif | Bin 0 -> 1024 bytes plugins/sieverules/skins/classic/icons.gif | Bin 0 -> 2017 bytes plugins/sieverules/skins/classic/icons.png | Bin 0 -> 2748 bytes plugins/sieverules/skins/classic/ie6hacks.css | 10 + plugins/sieverules/skins/classic/iehacks.css | 53 + plugins/sieverules/skins/classic/safari.css | 8 + plugins/sieverules/skins/classic/sieverules.css | 406 ++++ plugins/sieverules/skins/classic/tabstyles.css | 3 + .../skins/classic/templates/advancededitor.html | 55 + .../skins/classic/templates/editsieverule.html | 29 + .../skins/classic/templates/setupsieverules.html | 18 + .../skins/classic/templates/sieverules.html | 93 + plugins/sieverules/skins/classic/tick.gif | Bin 0 -> 545 bytes plugins/sieverules/skins/larry/cross.png | Bin 0 -> 342 bytes plugins/sieverules/skins/larry/help.png | Bin 0 -> 475 bytes plugins/sieverules/skins/larry/icons.png | Bin 0 -> 1773 bytes plugins/sieverules/skins/larry/iehacks.css | 53 + plugins/sieverules/skins/larry/listicons.png | Bin 0 -> 1345 bytes plugins/sieverules/skins/larry/safari.css | 8 + plugins/sieverules/skins/larry/sieverules.css | 435 ++++ plugins/sieverules/skins/larry/tabstyles.css | 15 + .../skins/larry/templates/advancededitor.html | 60 + .../skins/larry/templates/editsieverule.html | 30 + .../skins/larry/templates/setupsieverules.html | 27 + .../skins/larry/templates/sieverules.html | 78 + plugins/sieverules/skins/larry/tick.png | Bin 0 -> 284 bytes 60 files changed, 10920 insertions(+) create mode 100644 plugins/sieverules/config.inc.php.dist create mode 100644 plugins/sieverules/importFilters/avelsieve.php create mode 100644 plugins/sieverules/importFilters/ingo.php create mode 100644 plugins/sieverules/include/rcube_sieve.php create mode 100644 plugins/sieverules/include/rcube_sieve_script.php create mode 100644 plugins/sieverules/jquery.maskedinput.js create mode 120000 plugins/sieverules/lib/Net/Sieve.php create mode 100644 plugins/sieverules/localization/ca_ES.inc create mode 100644 plugins/sieverules/localization/cs_CZ.inc create mode 100644 plugins/sieverules/localization/de_CH.inc create mode 100644 plugins/sieverules/localization/de_DE.inc create mode 100644 plugins/sieverules/localization/en_GB.inc create mode 100644 plugins/sieverules/localization/en_US.inc create mode 100644 plugins/sieverules/localization/es_AR.inc create mode 100644 plugins/sieverules/localization/es_ES.inc create mode 100644 plugins/sieverules/localization/et_EE.inc create mode 100644 plugins/sieverules/localization/fi_FI.inc create mode 100644 plugins/sieverules/localization/fr_FR.inc create mode 100644 plugins/sieverules/localization/hu_HU.inc create mode 100644 plugins/sieverules/localization/it_IT.inc create mode 100644 plugins/sieverules/localization/nl_NL.inc create mode 100644 plugins/sieverules/localization/pl_PL.inc create mode 100644 plugins/sieverules/localization/pt_BR.inc create mode 100644 plugins/sieverules/localization/pt_PT.inc create mode 100644 plugins/sieverules/localization/ro_RO.inc create mode 100644 plugins/sieverules/localization/ru_RU.inc create mode 100644 plugins/sieverules/localization/sk_SK.inc create mode 100644 plugins/sieverules/localization/sl_SI.inc create mode 100644 plugins/sieverules/localization/sv_SE.inc create mode 100644 plugins/sieverules/localization/zh_TW.inc create mode 100644 plugins/sieverules/package.xml create mode 100644 plugins/sieverules/sieverules.js create mode 100644 plugins/sieverules/sieverules.php create mode 100644 plugins/sieverules/skins/classic/cross.gif create mode 100644 plugins/sieverules/skins/classic/help.gif create mode 100644 plugins/sieverules/skins/classic/icons.gif create mode 100644 plugins/sieverules/skins/classic/icons.png create mode 100644 plugins/sieverules/skins/classic/ie6hacks.css create mode 100644 plugins/sieverules/skins/classic/iehacks.css create mode 100644 plugins/sieverules/skins/classic/safari.css create mode 100644 plugins/sieverules/skins/classic/sieverules.css create mode 100644 plugins/sieverules/skins/classic/tabstyles.css create mode 100644 plugins/sieverules/skins/classic/templates/advancededitor.html create mode 100644 plugins/sieverules/skins/classic/templates/editsieverule.html create mode 100644 plugins/sieverules/skins/classic/templates/setupsieverules.html create mode 100644 plugins/sieverules/skins/classic/templates/sieverules.html create mode 100644 plugins/sieverules/skins/classic/tick.gif create mode 100644 plugins/sieverules/skins/larry/cross.png create mode 100644 plugins/sieverules/skins/larry/help.png create mode 100644 plugins/sieverules/skins/larry/icons.png create mode 100644 plugins/sieverules/skins/larry/iehacks.css create mode 100644 plugins/sieverules/skins/larry/listicons.png create mode 100644 plugins/sieverules/skins/larry/safari.css create mode 100644 plugins/sieverules/skins/larry/sieverules.css create mode 100644 plugins/sieverules/skins/larry/tabstyles.css create mode 100644 plugins/sieverules/skins/larry/templates/advancededitor.html create mode 100644 plugins/sieverules/skins/larry/templates/editsieverule.html create mode 100644 plugins/sieverules/skins/larry/templates/setupsieverules.html create mode 100644 plugins/sieverules/skins/larry/templates/sieverules.html create mode 100644 plugins/sieverules/skins/larry/tick.png (limited to 'plugins/sieverules') diff --git a/plugins/sieverules/config.inc.php.dist b/plugins/sieverules/config.inc.php.dist new file mode 100644 index 000000000..7d8f48238 --- /dev/null +++ b/plugins/sieverules/config.inc.php.dist @@ -0,0 +1,147 @@ +/sieverules or to syslog +$rcmail_config['sieverules_debug'] = false; + +// authentication method. Can be CRAM-MD5, DIGEST-MD5, PLAIN, LOGIN, EXTERNAL +// or none. Optional, defaults to best method supported by server. +$rcmail_config['sieverules_auth_type'] = null; + +// optional managesieve authentication identifier to be used as authorization proxy, +// authenticate as a different user but act on behalf of the logged in user, +// works with PLAIN and DIGEST-MD5 auth. +$rcmail_config['sieverules_auth_cid'] = null; + +// optional managesieve authentication password to be used for sieverules_auth_cid +$rcmail_config['sieverules_auth_pw'] = null; + +// enable TLS for managesieve server connection +$rcmail_config['sieverules_usetls'] = FALSE; + +// folder delimiter - if your sieve system uses a different folder delimiter to +// your IMAP server set it here, otherwise leave as null to use IMAP delimiter +$rcmail_config['sieverules_folder_delimiter'] = null; + +// Sieve RFC says that we should use UTF-8 encoding for mailbox names, +// but some implementations does not covert UTF-8 to modified UTF-7. +// set to null for default behaviour +$rcmail_config['sieverules_folder_encoding'] = null; + +// include the IMAP root in the folder path when creating the rules +// set to false to never include the IMAP root in the folder path +// set to null for default behaviour +$rcmail_config['sieverules_include_imap_root'] = null; + +// ruleset name +$rcmail_config['sieverules_ruleset_name'] = 'roundcube'; + +// allow multiple actions +$rcmail_config['sieverules_multiple_actions'] = TRUE; + +// allowed actions +$rcmail_config['sieverules_allowed_actions'] = array( + 'fileinto' => TRUE, + 'vacation' => TRUE, + 'reject' => TRUE, + 'redirect' => TRUE, + 'keep' => TRUE, + 'discard' => TRUE, + 'imapflags' => TRUE, + 'notify' => TRUE, + 'stop' => TRUE, + 'editheaderadd' => TRUE, + 'editheaderrem' => TRUE + ); + +// headers listed as examples of "Other headers" +$rcmail_config['sieverules_other_headers'] = array( + 'Reply-To', 'List-Id', 'MailingList', 'Mailing-List', + 'X-ML-Name', 'X-List', 'X-List-Name', 'X-Mailing-List', + 'Resent-From', 'Resent-To', 'X-Mailer', 'X-MailingList', + 'X-Spam-Status', 'X-Priority', 'Importance', 'X-MSMail-Priority', + 'Precedence', 'Return-Path', 'Received', 'Auto-Submitted', + 'X-Spam-Flag', 'X-Spam-Tests', 'Sender', + ); + +// Predefined rules +// each rule should be in it own array - examples provided in README +// 'name' => name of the rule, displayed in the rule type select box +// 'type' => one of: header, address, envelope, size +// 'header' => name of the header to test +// 'operator' => operator to use, for all possible values please see README +// 'extra' => extra information needed for the rule in some cases +// 'target' => value that the header is tested against +$rcmail_config['sieverules_predefined_rules'] = array(); + +// Advanced editor +// allows the user to edit the sieve file directly, without the restrictions of the normal UI +// 0 - Disabled, option not shown in the UI +// 1 - Enabled, option shown in the UI +// 2 - Option shown in the UI and used by default +$rcmail_config['sieverules_adveditor'] = 0; + +// Allow users to use multiple rulesets +$rcmail_config['sieverules_multiplerules'] = FALSE; + +// Default (or global) sieve rule file +$rcmail_config['sieverules_default_file'] = '/etc/dovecot/sieve/default'; + +// Auto load default sieve rule file if no rules exist and no import filters match +$rcmail_config['sieverules_auto_load_default'] = FALSE; + +// Example sieve rule file +$rcmail_config['sieverules_example_file'] = '/etc/dovecot/sieve/example'; + +// Force the :addresses line to always be added to new vacation rules +// Some sieve setups require that the :address part of a vacation rule is always present for the message to be sent +// Cyrus setups need this to option set to true +$rcmail_config['sieverules_force_vacto'] = FALSE; + +// Limit the selection of :addresses available to only those setup in as an identity +// Setting this to false will give the user a textbox to enter in any address(es) they like, rather than a list of checkboxes +$rcmail_config['sieverules_limit_vacto'] = TRUE; + +// Allow users to set the :from option when creating new vacation rules, not all servers support this option +// If your server supports the variables extension users also have an 'auto detect' option which will detect the address to which the message was sent +// Else the user's default identity will be used as the default value +$rcmail_config['sieverules_show_vacfrom'] = FALSE; + +// Allow users to set the :handle option when creating new vacation rules, not all servers support this option +$rcmail_config['sieverules_show_vachandle'] = FALSE; + +// The rule file can be written as one IF/ELSIF statement or as a series of unrelated IF statements +// TRUE - one IF/ELSIF statement (default) +// FALSE - a series of unrelated IF statements +$rcmail_config['sieverules_use_elsif'] = TRUE; + +// Fileinto action options +// 0 - List only subscribed folders +// 1 - List subscribed and unsubscribed folders +// 2 - List subscribed and unsubscribed folders and allow users to enter a folder name (for advanced users only, requires sieve mailbox extension) +$rcmail_config['sieverules_fileinto_options'] = 0; + +// Define the format of the :from option value for vacation and notify actions +// 0 - Use only the email address - :from "user@example.com" +// 1 - Use the name and email address, not all servers support this option - :from "First Last " +$rcmail_config['sieverules_from_format'] = 0; + +// For information on customising the rule file see "The structure of the rule file" in the README +// For information on customising the contents of the drop downs see "Default values for header, operator and flag drop downs" in the README + +?> \ No newline at end of file diff --git a/plugins/sieverules/importFilters/avelsieve.php b/plugins/sieverules/importFilters/avelsieve.php new file mode 100644 index 000000000..c1e3fef9a --- /dev/null +++ b/plugins/sieverules/importFilters/avelsieve.php @@ -0,0 +1,54 @@ + \ No newline at end of file diff --git a/plugins/sieverules/importFilters/ingo.php b/plugins/sieverules/importFilters/ingo.php new file mode 100644 index 000000000..8d85ce6e1 --- /dev/null +++ b/plugins/sieverules/importFilters/ingo.php @@ -0,0 +1,52 @@ + \ No newline at end of file diff --git a/plugins/sieverules/include/rcube_sieve.php b/plugins/sieverules/include/rcube_sieve.php new file mode 100644 index 000000000..a5fd9649a --- /dev/null +++ b/plugins/sieverules/include/rcube_sieve.php @@ -0,0 +1,249 @@ + | + | Modifications by: Philip Weir | + | * Make ruleset name configurable | + | * Added import functions | + +-----------------------------------------------------------------------+ +*/ + +define('SIEVE_ERROR_CONNECTION', 1); +define('SIEVE_ERROR_LOGIN', 2); +define('SIEVE_ERROR_NOT_EXISTS', 3); // script not exists +define('SIEVE_ERROR_INSTALL', 4); // script installation +define('SIEVE_ERROR_ACTIVATE', 5); // script activation +define('SIEVE_ERROR_OTHER', 255); // other/unknown error + +class rcube_sieve +{ + private $sieve; + private $ruleset; + private $importers = array(); + private $elsif; + private $cache = false; + public $error = false; + public $list = array(); + public $script; + + public function __construct($username, $password, $host, $port, $auth_type = NULL, $usetls, $ruleset, $dir, $elsif = true, $auth_cid = NULL, $auth_pw = NULL) + { + $this->sieve = new Net_Sieve(); + + $data = rcube::get_instance()->plugins->exec_hook('sieverules_connect', array( + 'username' => $username, 'password' => $password, 'host' => $host, 'port' => $port, + 'auth_type' => $auth_type, 'usetls' => $usetls, 'ruleset' => $ruleset, 'dir' => $dir, + 'elsif' => $elsif, 'auth_cid' => $auth_cid, 'auth_pw' => $auth_pw)); + + $username = $data['username']; + $password = $data['password']; + $host = $data['host']; + $port = $data['port']; + $auth_type = $data['auth_type']; + $usetls = $data['usetls']; + $ruleset = $data['ruleset']; + $dir = $data['dir']; + $elsif = $data['elsif']; + $auth_cid = $data['auth_cid']; + $auth_pw = $data['auth_pw']; + + if (PEAR::isError($this->sieve->connect($host, $port, NULL, $usetls))) + return $this->_set_error(SIEVE_ERROR_CONNECTION); + + if (!empty($auth_cid)) { + $authz = $username; + $username = $auth_cid; + $password = $auth_pw; + } + + if (PEAR::isError($this->sieve->login($username, $password, $auth_type ? strtoupper($auth_type) : NULL, $authz))) + return $this->_set_error(SIEVE_ERROR_LOGIN); + + $this->ruleset = $ruleset; + $this->elsif = $elsif; + + if ($this->ruleset !== false) { + $this->get_script(); + } + else { + $this->ruleset = $this->get_active(); + $this->get_script(); + } + + // init importers + $dir = slashify(realpath(slashify($dir) . 'importFilters/')); + $handle = opendir($dir); + while ($importer = readdir($handle)) { + if (is_file($dir . $importer) && is_readable($dir . $importer)) { + include($dir . $importer); + + $importer = substr($importer, 0, -4); + $importer = 'srimport_' . $importer; + + if (class_exists($importer, false)) { + $importerClass = new $importer(); + $this->importers[$importer] = $importerClass; + } + } + } + closedir($handle); + } + + public function __destruct() + { + $this->sieve->disconnect(); + } + + public function error() + { + return $this->error ? $this->error : false; + } + + public function save($script = '') + { + if (!$script) + $script = $this->script->as_text(); + + if (!$script) + $script = '/* empty script */'; + + // allow additional actions before ruleset is saved + $data = rcube::get_instance()->plugins->exec_hook('sieverules_save', array( + 'ruleset' => $this->ruleset, 'script' => $script)); + + if ($data['abort']) + return $data['message'] ? $data['message'] : false; + + if (PEAR::isError($this->sieve->installScript($this->ruleset, $data['script']))) + return $this->_set_error(SIEVE_ERROR_INSTALL); + + if ($this->cache) $_SESSION['sieverules_script_cache_' . $this->ruleset] = serialize($this->script); + + return true; + } + + public function get_extensions() + { + if ($this->sieve) { + $ext = $this->sieve->getExtensions(); + $ext = array_map('strtolower', (array) $ext); + return $ext; + } + } + + public function check_import() + { + $result = false; + + foreach ($this->list as $ruleset) { + if ($ruleset == $this->ruleset) + continue; + + $script = $this->sieve->getScript($ruleset); + + foreach ($this->importers as $id => $importer) { + if ($importer->detector($script)) { + $result = array($id, $importer->name, $ruleset); + break; + } + } + } + + return $result; + } + + public function do_import($type, $ruleset) + { + $script = $this->sieve->getScript($ruleset); + $content = $this->importers[$type]->importer($script); + $this->script->import_filters($content); + + if (is_array($content)) + return $this->save(); + else + return $this->save($content); + } + + public function get_script() + { + if (!$this->sieve) + return false; + + if ($this->cache && $_SESSION['sieverules_script_cache']) { + $this->list = unserialize($_SESSION['sieverules_scripts_list']); + $this->script = unserialize($_SESSION['sieverules_script_cache_' . $this->ruleset]); + return; + } + + $this->list = $this->sieve->listScripts(); + + if (PEAR::isError($this->list)) + return $this->_set_error(SIEVE_ERROR_OTHER); + + if (in_array($this->ruleset, $this->list)) { + $script = $this->sieve->getScript($this->ruleset); + + if (PEAR::isError($script)) + return $this->_set_error(SIEVE_ERROR_OTHER); + } + else { + $this->_set_error(SIEVE_ERROR_NOT_EXISTS); + $script = ''; + } + + $data = rcube::get_instance()->plugins->exec_hook('sieverules_load', array( + 'ruleset' => $this->ruleset, 'script' => $script)); + + $this->script = new rcube_sieve_script($data['script'], $this->get_extensions(), $this->elsif); + + if ($this->cache) { + $_SESSION['sieverules_scripts_list'] = serialize($this->list); + $_SESSION['sieverules_script_cache_' . $this->ruleset] = serialize($this->script); + } + } + + public function get_active() + { + return $this->sieve->getActive(); + } + + public function set_active($ruleset) + { + if (PEAR::isError($this->sieve->setActive($ruleset))) + return $this->_set_error(SIEVE_ERROR_ACTIVATE); + + return true; + } + + public function del_script($script) + { + return $this->sieve->removeScript($script); + } + + public function set_ruleset($ruleset) + { + $this->ruleset = $ruleset; + $this->get_script(); + } + + public function set_debug($debug) + { + $this->sieve->setDebug($debug, array($this, 'debug_handler')); + } + + public function debug_handler(&$sieve, $message) + { + rcube::write_log('sieverules', preg_replace('/\r\n$/', '', $message)); + } + + private function _set_error($error) + { + $this->error = $error; + return false; + } +} + +?> \ No newline at end of file diff --git a/plugins/sieverules/include/rcube_sieve_script.php b/plugins/sieverules/include/rcube_sieve_script.php new file mode 100644 index 000000000..2dbd52a28 --- /dev/null +++ b/plugins/sieverules/include/rcube_sieve_script.php @@ -0,0 +1,969 @@ + | + | Modifications by: Philip Weir | + | * Changed name of keys in script array | + | * Added support for address and envelope | + | * Added support for vacation | + | * Added support for disabled rules (written to file as comment) | + | * Added support for regex tests | + | * Added support for imapflags | + | * Added support for relational operators and comparators | + | * Added support for subaddress tests | + | * Added support for notify action | + | * Added support for stop action | + | * Added support for body and copy | + | * Added support for spamtest and virustest | + | * Added support for date | + | * Added support for editheader | + +-----------------------------------------------------------------------+ +*/ + +define('SIEVE_ERROR_BAD_ACTION', 1); +define('SIEVE_ERROR_NOT_FOUND', 2); + +// define constants for sieve file +if (!defined('RCUBE_SIEVE_NEWLINE')) + define('RCUBE_SIEVE_NEWLINE', "\r\n"); + +if (!defined('RCUBE_SIEVE_INDENT')) + define('RCUBE_SIEVE_INDENT', "\t"); + +if (!defined('RCUBE_SIEVE_HEADER')) + define('RCUBE_SIEVE_HEADER', "## Generated by Roundcube Webmail SieveRules Plugin ##"); + +class rcube_sieve_script +{ + private $elsif = true; + private $content = array(); + private $supported = array( + 'fileinto', + 'reject', + 'ereject', + 'vacation', + 'imapflags', + 'imap4flags', + 'notify', + 'enotify', + 'spamtest', + 'virustest', + 'date', + 'editheader' + ); + public $raw = ''; + + public function __construct($script, $ext = array(), $elsif = true) + { + $this->raw = $script; + $this->elsif = $elsif; + + // adjust supported extenstion to match sieve server + $this->supported = array_intersect($this->supported, $ext); + if (in_array('copy', $ext)) + $this->supported = array_merge($this->supported, array('fileinto_copy','redirect_copy')); + + if (in_array('editheader', $ext)) + $this->supported = array_merge($this->supported, array('editheaderadd','editheaderrem')); + + // include standard actions in supported list + $this->supported = array_merge($this->supported, array('redirect','keep','discard','stop')); + + // load script + $this->content = $this->parse_text($script); + } + + public function add_text($script) + { + $content = $this->parse_text($script); + $result = false; + + // check existsing script rules names + foreach ($this->content as $idx => $elem) + $names[$elem['name']] = $idx; + + foreach ($content as $elem) { + if (!isset($names[$elem['name']])) { + array_push($this->content, $elem); + $result = true; + } + } + + return $result; + } + + public function import_filters($content) + { + if (is_array($content)) { + $result = false; + + // check existsing script rules names + foreach ($this->content as $idx => $elem) + $names[$elem['name']] = $idx; + + foreach ($content as $elem) { + if (!isset($names[$elem['name']])) { + array_push($this->content, $elem); + $result = true; + } + } + } + else { + $this->add_text($content); + } + } + + public function add_rule($content, $pos = null) + { + foreach ($content['actions'] as $action) { + if (!in_array($action['type'], $this->supported)) + return SIEVE_ERROR_BAD_ACTION; + } + + if ($pos !== null) + array_splice($this->content, $pos, 0, array($content)); + else + array_push($this->content, $content); + + return true; + } + + public function delete_rule($index) + { + if (isset($this->content[$index])) { + unset($this->content[$index]); + $this->content = array_values($this->content); + return true; + } + + return SIEVE_ERROR_NOT_FOUND; + } + + public function size() + { + return sizeof($this->content); + } + + public function update_rule($index, $content) + { + foreach ($content['actions'] as $action) { + if (!in_array($action['type'], $this->supported)) + return SIEVE_ERROR_BAD_ACTION; + } + + if ($this->content[$index]) { + $this->content[$index] = $content; + return true; + } + + return SIEVE_ERROR_NOT_FOUND; + } + + public function move_rule($source, $destination) + { + $this->add_rule($this->content[$source], $destination); + + if ($source < $destination) + $this->delete_rule($source); + else + $this->delete_rule($source + 1); + } + + public function as_text() + { + $script = ''; + $variables = ''; + $exts = array(); + + // rules + $activeRules = 0; + foreach ($this->content as $rule) { + $tests = array(); + $i = 0; + + if ($rule['disabled'] == 1) { + $script .= '# rule:[' . $rule['name'] . "]" . RCUBE_SIEVE_NEWLINE; + $script .= '# disabledRule:[' . $this->_safe_serial(serialize($rule)) . "]" . RCUBE_SIEVE_NEWLINE; + } + else { + // header + $script .= '# rule:[' . $rule['name'] . "]" . RCUBE_SIEVE_NEWLINE; + + // constraints expressions + foreach ($rule['tests'] as $test) { + $tests[$i] = ''; + + switch ($test['type']) { + case 'size': + $tests[$i] .= ($test['not'] ? 'not ' : ''); + $tests[$i] .= 'size :' . ($test['operator']=='under' ? 'under ' : 'over ') . $test['target']; + break; + case 'virustest': + case 'spamtest': + array_push($exts, $test['type']); + array_push($exts, 'relational'); + array_push($exts, 'comparator-i;ascii-numeric'); + $tests[$i] .= ($test['not'] ? 'not ' : ''); + $tests[$i] .= $test['type'] . ' :value ' . ($test['operator'] == 'eq' ? '"eq" ' : + ($test['operator'] == 'le' ? '"le" ' : '"ge" ')) . + ':comparator "i;ascii-numeric" "' . $test['target'] .'"'; + break; + case 'true': + $tests[$i] .= ($test['not'] ? 'not true' : 'true'); + break; + case 'exists': + $tests[$i] .= ($test['not'] ? 'not ' : ''); + + if (is_array($test['header'])) + $tests[$i] .= 'exists ["' . implode('", "', $this->_escape_string($test['header'])) . '"]'; + else + $tests[$i] .= 'exists "' . $this->_escape_string($test['header']) . '"'; + + break; + case 'envelope': + array_push($exts, 'envelope'); + case 'header': + case 'address': + if ($test['operator'] == 'regex') + array_push($exts, 'regex'); + elseif (substr($test['operator'], 0, 5) == 'count' || substr($test['operator'], 0, 5) == 'value') + array_push($exts, 'relational'); + elseif ($test['operator'] == 'user' || $test['operator'] == 'detail' || $test['operator'] == 'domain') + array_push($exts, 'subaddress'); + + $tests[$i] .= ($test['not'] ? 'not ' : ''); + $tests[$i] .= $test['type']. ' :' . $test['operator']; + + if ($test['comparator'] != '') { + if ($test['comparator'] != 'i;ascii-casemap' && $test['comparator'] != 'i;octet') + array_push($exts, 'comparator-' . $test['comparator']); + + $tests[$i] .= ' :comparator "' . $test['comparator'] . '"'; + } + + if (is_array($test['header'])) + $tests[$i] .= ' ["' . implode('", "', $this->_escape_string($test['header'])) . '"]'; + else + $tests[$i] .= ' "' . $this->_escape_string($test['header']) . '"'; + + if (is_array($test['target'])) + $tests[$i] .= ' ["' . implode('", "', $this->_escape_string($test['target'])) . '"]'; + else + $tests[$i] .= ' "' . $this->_escape_string($test['target']) . '"'; + + break; + case 'body': + array_push($exts, 'body'); + if ($test['operator'] == 'regex') + array_push($exts, 'regex'); + elseif (substr($test['operator'], 0, 5) == 'count' || substr($test['operator'], 0, 5) == 'value') + array_push($exts, 'relational'); + + $tests[$i] .= ($test['not'] ? 'not ' : ''); + $tests[$i] .= $test['type']; + + if ($test['bodypart'] != '') + $tests[$i] .= ' :' . $test['bodypart']; + + if ($test['contentpart'] != '') + $tests[$i] .= ' "'. $test['contentpart'] .'"'; + + $tests[$i] .= ' :' . $test['operator']; + + if ($test['comparator'] != '') { + if ($test['comparator'] != 'i;ascii-casemap' && $test['comparator'] != 'i;octet') + array_push($exts, 'comparator-' . $test['comparator']); + + $tests[$i] .= ' :comparator "' . $test['comparator'] . '"'; + } + + if (is_array($test['target'])) + $tests[$i] .= ' ["' . implode('", "', $this->_escape_string($test['target'])) . '"]'; + else + $tests[$i] .= ' "' . $this->_escape_string($test['target']) . '"'; + + break; + case 'date': + array_push($exts, 'date'); + if ($test['operator'] == 'regex') + array_push($exts, 'regex'); + elseif (substr($test['operator'], 0, 5) == 'count' || substr($test['operator'], 0, 5) == 'value') + array_push($exts, 'relational'); + + $tests[$i] .= ($test['not'] ? 'not ' : ''); + $tests[$i] .= $test['header']; + + $timezone = rcube::get_instance()->config->get('timezone', 'auto'); + if ($timezone != 'auto') { + $tz = new DateTimeZone($timezone); + $date = new DateTime('now', $tz); + $tests[$i] .= ' :zone ' . '"' . $date->format('O') . '"'; + } + + $tests[$i] .= ' :' . $test['operator']; + + if ($test['comparator'] != '') { + if ($test['comparator'] != 'i;ascii-casemap' && $test['comparator'] != 'i;octet') + array_push($exts, 'comparator-' . $test['comparator']); + + $tests[$i] .= ' :comparator "' . $test['comparator'] . '"'; + } + + $tests[$i] .= ' "' . $this->_escape_string($test['datepart']) . '"'; + $tests[$i] .= ' "' . $this->_escape_string($test['target']) . '"'; + + break; + } + + $i++; + } + + $script .= ($activeRules > 0 && $this->elsif ? 'els' : '') . ($rule['join'] ? 'if allof (' : 'if anyof ('); + $activeRules++; + + if (sizeof($tests) > 1) + $script .= implode("," . RCUBE_SIEVE_NEWLINE . RCUBE_SIEVE_INDENT, $tests); + elseif (sizeof($tests)) + $script .= $tests[0]; + else + $script .= 'true'; + + + $script .= ")". RCUBE_SIEVE_NEWLINE ."{" . RCUBE_SIEVE_NEWLINE; + + // action(s) + $actions = ''; + foreach ($rule['actions'] as $action) { + switch ($action['type']) { + case 'fileinto': + case 'fileinto_copy': + array_push($exts, 'fileinto'); + + $args = ''; + if ($action['type'] == 'fileinto_copy') { + array_push($exts, 'copy'); + $args .= ' :copy'; + } + + if ($action['create']) { + array_push($exts, 'mailbox'); + $args .= ' :create'; + } + + // variables support in fileinto by David Warden + if (preg_match('/\$\{\d+\}/', $action['target'])) + array_push($exts, 'variables'); + + $actions .= RCUBE_SIEVE_INDENT . "fileinto" . $args . " \"" . $this->_escape_string($action['target']) . "\";" . RCUBE_SIEVE_NEWLINE; + break; + case 'redirect': + case 'redirect_copy': + $args = ''; + if ($action['type'] == 'redirect_copy') { + array_push($exts, 'copy'); + $args .= ' :copy'; + } + + $tokens = preg_split('/[,;\s]/', $action['target']); + foreach ($tokens as $email) + $actions .= RCUBE_SIEVE_INDENT . "redirect" . $args . " \"" . $this->_escape_string($email) . "\";" . RCUBE_SIEVE_NEWLINE; + break; + case 'reject': + case 'ereject': + array_push($exts, $action['type']); + + if (strpos($action['target'], "\n")!==false) + $actions .= RCUBE_SIEVE_INDENT . $action['type']." text:" . RCUBE_SIEVE_NEWLINE . $action['target'] . RCUBE_SIEVE_NEWLINE . "." . RCUBE_SIEVE_NEWLINE . ";" . RCUBE_SIEVE_NEWLINE; + else + $actions .= RCUBE_SIEVE_INDENT . $action['type']." \"" . $this->_escape_string($action['target']) . "\";" . RCUBE_SIEVE_NEWLINE; + + break; + case 'vacation': + array_push($exts, 'vacation'); + $action['subject'] = $this->_escape_string($action['subject']); + +// // encoding subject header with mb_encode provides better results with asian characters +// if (function_exists("mb_encode_mimeheader")) +// { +// mb_internal_encoding($action['charset']); +// $action['subject'] = mb_encode_mimeheader($action['subject'], $action['charset'], 'Q'); +// mb_internal_encoding(RCUBE_CHARSET); +// } + + // detect original recipient + if ($action['from'] == 'auto' && strpos($variables, 'set "from"') === false) { + array_push($exts, 'variables'); + + $variables .= 'set "from" "";' . RCUBE_SIEVE_NEWLINE; + $variables .= 'if header :matches "to" "*" {' . RCUBE_SIEVE_NEWLINE; + $variables .= RCUBE_SIEVE_INDENT . 'set "from" "${1}";' . RCUBE_SIEVE_NEWLINE; + $variables .= '}' . RCUBE_SIEVE_NEWLINE; + + $action['from'] = "\${from}"; + } + elseif ($action['from'] == 'auto') { + $action['from'] = "\${from}"; + } + + // append original subject + if ($action['origsubject'] == '1' && strpos($variables, 'set "subject"') === false) { + array_push($exts, 'variables'); + + $variables .= 'set "subject" "";' . RCUBE_SIEVE_NEWLINE; + $variables .= 'if header :matches "subject" "*" {' . RCUBE_SIEVE_NEWLINE; + $variables .= RCUBE_SIEVE_INDENT . 'set "subject" "${1}";' . RCUBE_SIEVE_NEWLINE; + $variables .= '}' . RCUBE_SIEVE_NEWLINE; + + $action['subject'] = trim($action['subject']); + if (substr($action['subject'], -1, 1) != ":") $action['subject'] .= ":"; + $action['subject'] .= " \${subject}"; + } + + $actions .= RCUBE_SIEVE_INDENT . "vacation" . RCUBE_SIEVE_NEWLINE; + if (!empty($action['days'])) $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . ":days ". $action['days'] . RCUBE_SIEVE_NEWLINE; + if (!empty($action['addresses'])) $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . ":addresses [\"". str_replace(",", "\",\"", $this->_escape_string($action['addresses'])) ."\"]" . RCUBE_SIEVE_NEWLINE; + if (!empty($action['subject'])) $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . ":subject \"". $action['subject'] ."\"" . RCUBE_SIEVE_NEWLINE; + if (!empty($action['handle'])) $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . ":handle \"". $this->_escape_string($action['handle']) ."\"" . RCUBE_SIEVE_NEWLINE; + if (!empty($action['from'])) $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . ":from \"". $this->_escape_string($action['from']) ."\"" . RCUBE_SIEVE_NEWLINE; + + if ($action['htmlmsg']) { + $MAIL_MIME = new Mail_mime("\r\n"); + + $action['msg'] = '' . + "\r\n\r\n" . $action['msg'] . "\r\n\r\n"; + + $MAIL_MIME->setHTMLBody($action['msg']); + + // add a plain text version of the e-mail as an alternative part. + $h2t = new rcube_html2text($action['msg'], false, true, 0); + $plainTextPart = $h2t->get_text(); + if (!$plainTextPart) { + // empty message body breaks attachment handling in drafts + $plainTextPart = "\r\n"; + } + else { + // make sure all line endings are CRLF (#1486712) + $plainTextPart = preg_replace('/\r?\n/', "\r\n", $plainTextPart); + } + + $MAIL_MIME->setTXTBody($plainTextPart); + + $MAIL_MIME->setParam('html_charset', $action['charset']); + $MAIL_MIME->setParam('text_charset', $action['charset']); + + $action['msg'] = $MAIL_MIME->getMessage(); + } + + // escape lines which start is a . + $action['msg'] = preg_replace('/(^|\r?\n)\./', "$1..", $action['msg']); + + if ($action['htmlmsg']) + $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . ":mime text:". RCUBE_SIEVE_NEWLINE . $action['msg'] . RCUBE_SIEVE_NEWLINE . "." . RCUBE_SIEVE_NEWLINE . ";" . RCUBE_SIEVE_NEWLINE; + elseif ($action['charset'] != "UTF-8") + $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . ":mime text:". RCUBE_SIEVE_NEWLINE ."Content-Type: text/plain; charset=". $action['charset'] . RCUBE_SIEVE_NEWLINE . RCUBE_SIEVE_NEWLINE . $action['msg'] . RCUBE_SIEVE_NEWLINE . "." . RCUBE_SIEVE_NEWLINE . ";" . RCUBE_SIEVE_NEWLINE; + elseif (strpos($action['msg'], "\n") !== false) + $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . "text:" . RCUBE_SIEVE_NEWLINE . $action['msg'] . RCUBE_SIEVE_NEWLINE . "." . RCUBE_SIEVE_NEWLINE . ";" . RCUBE_SIEVE_NEWLINE; + else + $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . "\"" . $this->_escape_string($action['msg']) . "\";" . RCUBE_SIEVE_NEWLINE; + + break; + case 'imapflags': + case 'imap4flags': + array_push($exts, $action['type']); + + if (strpos($actions, "setflag") !== false) + $actions .= RCUBE_SIEVE_INDENT . "addflag \"" . $this->_escape_string($action['target']) . "\";" . RCUBE_SIEVE_NEWLINE; + else + $actions .= RCUBE_SIEVE_INDENT . "setflag \"" . $this->_escape_string($action['target']) . "\";" . RCUBE_SIEVE_NEWLINE; + + break; + case 'notify': + array_push($exts, 'notify'); + $actions .= RCUBE_SIEVE_INDENT . "notify" . RCUBE_SIEVE_NEWLINE; + $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . ":method \"" . $this->_escape_string($action['method']) . "\"" . RCUBE_SIEVE_NEWLINE; + if (!empty($action['options'])) $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . ":options [\"" . str_replace(",", "\",\"", $this->_escape_string($action['options'])) . "\"]" . RCUBE_SIEVE_NEWLINE; + if (!empty($action['from'])) $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . ":from \"" . $this->_escape_string($action['from']) . "\"" . RCUBE_SIEVE_NEWLINE; + if (!empty($action['importance'])) $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . ":importance \"" . $this->_escape_string($action['importance']) . "\"" . RCUBE_SIEVE_NEWLINE; + $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . ":message \"". $this->_escape_string($action['msg']) ."\";" . RCUBE_SIEVE_NEWLINE; + break; + case 'enotify': + array_push($exts, 'enotify'); + $actions .= RCUBE_SIEVE_INDENT . "notify" . RCUBE_SIEVE_NEWLINE; + if (!empty($action['options'])) $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . ":options [\"" . str_replace(",", "\",\"", $this->_escape_string($action['options'])) . "\"]" . RCUBE_SIEVE_NEWLINE; + if (!empty($action['from'])) $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . ":from \"" . $this->_escape_string($action['from']) . "\"" . RCUBE_SIEVE_NEWLINE; + if (!empty($action['importance'])) $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . ":importance \"" . $this->_escape_string($action['importance']) . "\"" . RCUBE_SIEVE_NEWLINE; + $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . ":message \"". $this->_escape_string($action['msg']) ."\"" . RCUBE_SIEVE_NEWLINE; + $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . "\"" . $this->_escape_string($action['method']) . "\";" . RCUBE_SIEVE_NEWLINE; + break; + case 'editheaderadd': + array_push($exts, 'editheader'); + $actions .= RCUBE_SIEVE_INDENT . "addheader"; + + if ($action['index'] == 'last') + $actions .= " :last"; + + $actions .= " \"". $this->_escape_string($action['name']) ."\" \"". $this->_escape_string($action['value']) ."\";" . RCUBE_SIEVE_NEWLINE; + break; + case 'editheaderrem': + array_push($exts, 'editheader'); + $actions .= RCUBE_SIEVE_INDENT . "deleteheader"; + + if (is_numeric($action['index'])) + $actions .= " :index " . $action['index']; + elseif ($action['index'] == 'last') + $actions .= " :last"; + + if (strlen($action['operator']) > 0) + $actions .= " :" . $action['operator']; + + $actions .= " \"". $this->_escape_string($action['name']) ."\""; + + if (strlen($action['value']) > 0) + $actions .= " \"". $this->_escape_string($action['value']) ."\""; + + $actions .= ";" . RCUBE_SIEVE_NEWLINE; + break; + case 'keep': + case 'discard': + case 'stop': + $actions .= RCUBE_SIEVE_INDENT . $action['type'] .";" . RCUBE_SIEVE_NEWLINE; + break; + } + } + + $script .= $actions . "}" . RCUBE_SIEVE_NEWLINE; + } + } + + if ($variables) + $variables .= RCUBE_SIEVE_NEWLINE; + + // requires + $exts = array_unique($exts); + if (sizeof($exts)) + $script = 'require ["' . implode('","', $exts) . "\"];" . RCUBE_SIEVE_NEWLINE . RCUBE_SIEVE_NEWLINE . $variables . $script; + + // author + if ($script && RCUBE_SIEVE_HEADER) + $script = RCUBE_SIEVE_HEADER . RCUBE_SIEVE_NEWLINE . $script; + + return $script; + } + + public function as_array() + { + return $this->content; + } + + public function parse_text($script) + { + $i = 0; + $content = array(); + + // remove C comments + $script = preg_replace('|/\*.*?\*/|sm', '', $script); + + // tokenize rules - \r is optional for backward compatibility (added 20090413) + if ($tokens = preg_split('/(# rule:\[.*\])\r?\n/', $script, -1, PREG_SPLIT_DELIM_CAPTURE)) { + foreach($tokens as $token) { + if (preg_match('/^# rule:\[(.*)\]/', $token, $matches)) { + $content[$i]['name'] = $matches[1]; + } + elseif (isset($content[$i]['name']) && sizeof($content[$i]) == 1 && preg_match('/^# disabledRule:\[(.*)\]/', $token, $matches)) { + $content[$i] = unserialize($this->_regular_serial($matches[1])); + $i++; + } + elseif (isset($content[$i]['name']) && sizeof($content[$i]) == 1) { + if ($rule = $this->_tokenize_rule($token)) { + $content[$i] = array_merge($content[$i], $rule); + $i++; + } + else { + unset($content[$i]); + } + } + } + } + + return $content; + } + + private function _tokenize_rule($content) + { + $result = NULL; + + if (preg_match('/^(if|elsif|else)\s+((true|not\s+true|allof|anyof|exists|header|not|size|envelope|address|spamtest|virustest|date|currentdate)\s+(.*))\s+\{(.*)\}$/sm', trim($content), $matches)) { + list($tests, $join) = $this->_parse_tests(trim($matches[2])); + $actions = $this->_parse_actions(trim($matches[5])); + + if ($tests && $actions) { + $result = array( + 'tests' => $tests, + 'actions' => $actions, + 'join' => $join, + ); + } + } + + return $result; + } + + private function _parse_actions($content) + { + $content = str_replace("\r\n", "\n", $content); + $result = NULL; + + // supported actions + $patterns[] = '^\s*discard;'; + $patterns[] = '^\s*keep;'; + $patterns[] = '^\s*stop;'; + $patterns[] = '^\s*fileinto\s+(:copy\s+)?(:create\s+)?(.*?[^\\\]);'; + $patterns[] = '^\s*redirect\s+(:copy\s+)?(.*?[^\\\]);'; + $patterns[] = '^\s*setflag\s+(.*?[^\\\]);'; + $patterns[] = '^\s*addflag\s+(.*?[^\\\]);'; + $patterns[] = '^\s*reject\s+text:(.*)\n\.\n;'; + $patterns[] = '^\s*ereject\s+text:(.*)\n\.\n;'; + $patterns[] = '^\s*reject\s+(.*?[^\\\]);'; + $patterns[] = '^\s*ereject\s+(.*?[^\\\]);'; + $patterns[] = '^\s*vacation\s+(:days\s+([0-9]+)\s+)?(:addresses\s+\[(.*?[^\\\])\]\s+)?(:subject\s+(".*?[^"\\\]")\s+)?(:handle\s+(".*?[^"\\\]")\s+)?(:from\s+(".*?[^"\\\]")\s+)?(:mime\s+)?text:(.*)\n\.\n;'; + $patterns[] = '^\s*vacation\s+(:days\s+([0-9]+)\s+)?(:addresses\s+\[(.*?[^\\\])\]\s+)?(:subject\s+(".*?[^"\\\]")\s+)?(:handle\s+(".*?[^"\\\]")\s+)?(:from\s+(".*?[^"\\\]")\s+)?(.*?[^\\\]);'; + $patterns[] = '^\s*notify\s+:method\s+(".*?[^"\\\]")\s+(:options\s+\[(.*?[^\\\])\]\s+)?(:from\s+(".*?[^"\\\]")\s+)?(:importance\s+(".*?[^"\\\]")\s+)?:message\s+(".*?[^"\\\]");'; + $patterns[] = '^\s*notify\s+(:options\s+\[(.*?[^\\\])\]\s+)?(:from\s+(".*?[^"\\\]")\s+)?(:importance\s+(".*?[^"\\\]")\s+)?:message\s+(".*?[^"\\\]")\s+(.*);'; + $patterns[] = '^\s*addheader\s+(:(last))?\s*(".*?[^"\\\]")\s+(".*?[^"\\\]");'; + $patterns[] = '^\s*deleteheader\s+(:(last)|:index\s([0-9])+)?\s*(:(contains))?\s*(".*?[^"\\\]")\s*(".*?[^"\\\]")?;'; + + $pattern = '/(' . implode('$)|(', $patterns) . '$)/ms'; + + // parse actions body + if (preg_match_all($pattern, $content, $mm, PREG_SET_ORDER)) { + foreach ($mm as $m) { + $content = trim($m[0]); + + if (preg_match('/^(discard|keep|stop)/', $content, $matches)) { + $result[] = array('type' => $matches[1]); + } + elseif (preg_match('/^fileinto\s+:copy/', $content)) { + $result[] = array('type' => 'fileinto_copy', 'target' => $this->_parse_string($m[sizeof($m)-1])); + } + elseif (preg_match('/^fileinto/', $content)) { + $result[] = array('type' => 'fileinto', 'target' => $this->_parse_string($m[sizeof($m)-1])); + } + elseif (preg_match('/^redirect\s+:copy/', $content)) { + $result[] = array('type' => 'redirect_copy', 'target' => $this->_parse_string($m[sizeof($m)-1])); + } + elseif (preg_match('/^redirect/', $content)) { + $result[] = array('type' => 'redirect', 'target' => $this->_parse_string($m[sizeof($m)-1])); + } + elseif (preg_match('/^(reject|ereject)\s+(.*);$/sm', $content, $matches)) { + $result[] = array('type' => $matches[1], 'target' => $this->_parse_string($matches[2])); + } + elseif (preg_match('/^(setflag|addflag)/', $content)) { + if (in_array('imap4flags', $this->supported)) + $result[] = array('type' => 'imap4flags', 'target' => $this->_parse_string($m[sizeof($m)-1])); + else + $result[] = array('type' => 'imapflags', 'target' => $this->_parse_string($m[sizeof($m)-1])); + } + elseif (preg_match('/^vacation\s+(:days\s+([0-9]+)\s+)?(:addresses\s+\[(.*?[^\\\])\]\s+)?(:subject\s+(".*?[^"\\\]")\s+)?(:handle\s+(".*?[^"\\\]")\s+)?(:from\s+(".*?[^"\\\]")\s+)?(.*);$/sm', $content, $matches)) { + $origsubject = ""; + if (substr($matches[6], -13, 12) == ": \${subject}") { + $matches[6] = trim(substr($matches[6], 0, -13)) . "\""; + $origsubject = "1"; + } + + if ($matches[10] == "\"\${from}\"") + $matches[10] = "\"auto\""; + +// if (function_exists("mb_decode_mimeheader")) $matches[5] = mb_decode_mimeheader($matches[5]); + + if (strpos($matches[11], 'Content-Type: multipart/alternative') !== false) { + $htmlmsg = true; + + preg_match('/Content-Type: text\/html; charset=([^\r\n]+).*(.+)<\/body>/sm', $matches[11], $htmlparts); + $msg = quoted_printable_decode($htmlparts[2]); + $charset = $htmlparts[1]; + } + else { + $htmlmsg = false; + $msg = $this->_parse_string($matches[11]); + $charset = $this->_parse_charset($matches[11]); + } + + // unescape lines which start is a . + $msg = preg_replace('/(^|\r?\n)\.\./', "$1.", $msg); + + $result[] = array('type' => 'vacation', + 'days' => $matches[2], + 'subject' => $this->_parse_string($matches[6]), + 'origsubject' => $origsubject, + 'from' => $this->_parse_string($matches[10]), + 'addresses' => $this->_parse_string(str_replace("\",\"", ",", $matches[4])), + 'handle' => $this->_parse_string($matches[8]), + 'msg' => $msg, + 'htmlmsg' => $htmlmsg, + 'charset' => $charset); + } + elseif (preg_match('/^notify\s+:method\s+(".*?[^"\\\]")\s+(:options\s+\[(.*?[^\\\])\]\s+)?(:from\s+(".*?[^"\\\]")\s+)?(:importance\s+(".*?[^"\\\]")\s+)?:message\s+(".*?[^"\\\]");$/sm', $content, $matches)) { + $result[] = array('type' => 'notify', + 'method' => $this->_parse_string($matches[1]), + 'options' => $this->_parse_string($matches[3]), + 'from' => $this->_parse_string($matches[5]), + 'importance' => $this->_parse_string($matches[7]), + 'msg' => $this->_parse_string($matches[8])); + } + elseif (preg_match('/^notify\s+(:options\s+\[(.*?[^\\\])\]\s+)?(:from\s+(".*?[^"\\\]")\s+)?(:importance\s+(".*?[^"\\\]")\s+)?:message\s+(".*?[^"\\\]")\s+(.*);$/sm', $content, $matches)) { + $result[] = array('type' => 'enotify', + 'method' => $this->_parse_string($matches[8]), + 'options' => $this->_parse_string($matches[2]), + 'from' => $this->_parse_string($matches[4]), + 'importance' => $this->_parse_string($matches[6]), + 'msg' => $this->_parse_string($matches[7])); + } + elseif (preg_match('/^addheader/', $content)) { + $result[] = array('type' => 'editheaderadd', + 'index' => $m[sizeof($m)-3], + 'name' => $this->_parse_string($m[sizeof($m)-2]), + 'value' => $this->_parse_string($m[sizeof($m)-1])); + } + elseif (preg_match('/^deleteheader/', $content)) { + $result[] = array('type' => 'editheaderrem', + 'index' => $m[sizeof($m)-6] == 'last' ? $m[sizeof($m)-6] : $m[sizeof($m)-5], + 'operator' => $m[sizeof($m)-3], + 'name' => strlen($m[sizeof($m)-2]) == 0 ? $this->_parse_string($m[sizeof($m)-1]) : $this->_parse_string($m[sizeof($m)-2]), + 'value' => strlen($m[sizeof($m)-2]) == 0 ? '' : $this->_parse_string($m[sizeof($m)-1])); + } + } + } + + return $result; + } + + private function _parse_tests($content) + { + $result = NULL; + + // lists + if (preg_match('/^(allof|anyof)\s+\((.*)\)$/sm', $content, $matches)) { + $content = $matches[2]; + $join = $matches[1]=='allof' ? true : false; + } + else { + $join = false; + } + + // supported tests regular expressions + $patterns[] = '(not\s+)?(exists)\s+\[(.*?[^\\\])\]'; + $patterns[] = '(not\s+)?(exists)\s+(".*?[^\\\]")'; + $patterns[] = '(not\s+)?(true)'; + $patterns[] = '(not\s+)?(size)\s+:(under|over)\s+([0-9]+[KGM]{0,1})'; + $patterns[] = '(not\s+)?(spamtest|virustest)\s+:value\s+"(eq|ge|le)"\s+:comparator\s+"i;ascii-numeric"\s+"(.*?[^\\\])"'; + $patterns[] = '(not\s+)?(header|address|envelope)\s+:(contains|is|matches|regex|user|detail|domain)((\s+))\[(.*?[^\\\]")\]\s+\[(.*?[^\\\]")\]'; + $patterns[] = '(not\s+)?(header|address|envelope)\s+:(contains|is|matches|regex|user|detail|domain)((\s+))(".*?[^\\\]")\s+(".*?[^\\\]")'; + $patterns[] = '(not\s+)?(header|address|envelope)\s+:(contains|is|matches|regex|user|detail|domain)((\s+))\[(.*?[^\\\]")\]\s+(".*?[^\\\]")'; + $patterns[] = '(not\s+)?(header|address|envelope)\s+:(contains|is|matches|regex|user|detail|domain)((\s+))(".*?[^\\\]")\s+\[(.*?[^\\\]")\]'; + $patterns[] = '(not\s+)?(header|address|envelope)\s+:(count\s+".*?[^\\\]"|value\s+".*?[^\\\]")(\s+:comparator\s+"(.*?[^\\\])")?\s+\[(.*?[^\\\]")\]\s+\[(.*?[^\\\]")\]'; + $patterns[] = '(not\s+)?(header|address|envelope)\s+:(count\s+".*?[^\\\]"|value\s+".*?[^\\\]")(\s+:comparator\s+"(.*?[^\\\])")?\s+(".*?[^\\\]")\s+(".*?[^\\\]")'; + $patterns[] = '(not\s+)?(header|address|envelope)\s+:(count\s+".*?[^\\\]"|value\s+".*?[^\\\]")(\s+:comparator\s+"(.*?[^\\\])")?\s+\[(.*?[^\\\]")\]\s+(".*?[^\\\]")'; + $patterns[] = '(not\s+)?(header|address|envelope)\s+:(count\s+".*?[^\\\]"|value\s+".*?[^\\\]")(\s+:comparator\s+"(.*?[^\\\])")?\s+(".*?[^\\\]")\s+\[(.*?[^\\\]")\]'; + $patterns[] = '(not\s+)?(body)(\s+:(raw|text|content\s+".*?[^\\\]"))?\s+:(contains|is|matches|regex)((\s+))\[(.*?[^\\\]")\]'; + $patterns[] = '(not\s+)?(body)(\s+:(raw|text|content\s+".*?[^\\\]"))?\s+:(contains|is|matches|regex)((\s+))(".*?[^\\\]")'; + $patterns[] = '(not\s+)?(body)(\s+:(raw|text|content\s+".*?[^\\\]"))?\s+:(count\s+".*?[^\\\]"|value\s+".*?[^\\\]")(\s+:comparator\s+"(.*?[^\\\])")?\s+\[(.*?[^\\\]")\]'; + $patterns[] = '(not\s+)?(body)(\s+:(raw|text|content\s+".*?[^\\\]"))?\s+:(count\s+".*?[^\\\]"|value\s+".*?[^\\\]")(\s+:comparator\s+"(.*?[^\\\])")?\s+(".*?[^\\\]")'; + $patterns[] = '(not\s+)?(date|currentdate)(\s+:zone\s+"([\+\-][0-9]{4})")?\s+:(contains|is|matches|regex)((\s+))(".*?[^\\\]"\s+)?(".*?[^\\\]")\s+(".*?[^\\\]")'; + $patterns[] = '(not\s+)?(date|currentdate)(\s+:zone\s+"([\+\-][0-9]{4})")?\s+:(count\s+".*?[^\\\]"|value\s+".*?[^\\\]")(\s+:comparator\s+"(.*?[^\\\])")?(\s+".*?[^\\\]")?\s+(".*?[^\\\]")\s+(".*?[^\\\]")'; + + // join patterns... + $pattern = '/(' . implode(')|(', $patterns) . ')/'; + + // ...and parse tests list + if (preg_match_all($pattern, $content, $matches, PREG_SET_ORDER)) { + foreach ($matches as $match) { + $size = sizeof($match); + + if (preg_match('/^(not\s+)?size/', $match[0])) { + $result[] = array( + 'type' => 'size', + 'not' => $match[$size-4] ? true : false, + 'operator' => $match[$size-2], // under/over + 'target' => $match[$size-1], // value + ); + } + elseif (preg_match('/^(not\s+)?(spamtest|virustest)/', $match[0])) { + $result[] = array( + 'type' => $match[$size-3], + 'not' => $match[$size-4] ? true : false, + 'operator' => $match[$size-2], // ge/le/eq + 'target' => $match[$size-1], // value + ); + } + elseif (preg_match('/^(not\s+)?(header|address|envelope)/', $match[0])) { + $result[] = array( + 'type' => $match[$size-6], + 'not' => $match[$size-7] ? true : false, + 'operator' => $match[$size-5], // is/contains/matches + 'header' => $this->_parse_list($match[$size-2]), // header(s) + 'target' => $this->_parse_list($match[$size-1], ($match[$size-5] == 'regex' ? true : false)), // string(s) + 'comparator' => trim($match[$size-3]) + ); + } + elseif (preg_match('/^(not\s+)?exists/', $match[0])) { + $result[] = array( + 'type' => 'exists', + 'not' => $match[$size-3] ? true : false, + 'operator' => 'exists', + 'header' => $this->_parse_list($match[$size-1]), // header(s) + ); + } + elseif (preg_match('/^(not\s+)?true/', $match[0])) { + $result[] = array( + 'type' => 'true', + 'not' => $match[$size-2] ? true : false, + ); + } + elseif (preg_match('/^(not\s+)?body/', $match[0])) { + if (preg_match('/.*content\s+"(.*?[^\\\])".*/', $match[$size-5], $parts)) { + $bodypart = 'content'; + $contentpart = $parts[1]; + } + else { + $bodypart = $match[$size-5]; + $contentpart = ''; + } + + $result[] = array( + 'type' => 'body', + 'not' => $match[$size-8] ? true : false, + 'bodypart' => $bodypart, + 'contentpart' => $contentpart, + 'operator' => $match[$size-4], // is/contains/matches + 'header' => 'body', // header(s) + 'target' => $this->_parse_list($match[$size-1], ($match[$size-4] == 'regex' ? true : false)), // string(s) + 'comparator' => trim($match[$size-2]) + ); + } + elseif (preg_match('/^(not\s+)?(date|currentdate)/', $match[0])) { + $result[] = array( + 'type' => 'date', + 'not' => $match[$size-10] ? true : false, + 'header' => $match[$size-9], // header + 'operator' => $match[$size-6], // is/contains/matches + 'datepart' => $this->_parse_list($match[$size-2]), + 'target' => $this->_parse_list($match[$size-1], ($match[$size-5] == 'regex' ? true : false)), // string(s) + 'field' => $match[$size-3], // received + 'comparator' => trim($match[$size-4]) + ); + } + } + } + + return array($result, $join); + } + + private function _parse_string($content) + { + $text = ''; + $content = trim($content); + + if (preg_match('/^:mime\s+text:(.*)\.$/sm', $content, $matches)) { + $parts = preg_split("/\r?\n/", $matches[1], 4); + $text = trim($parts[3]); + } + elseif (preg_match('/^text:(.*)\.$/sm', $content, $matches)) + $text = trim($matches[1]); + elseif (preg_match('/^"(.*)"$/', $content, $matches)) + $text = str_replace('\"', '"', $matches[1]); + + return $text; + } + + private function _parse_charset($content) + { + $charset = RCUBE_CHARSET; + $content = trim($content); + + if (preg_match('/^:mime\s+text:(.*)\.$/sm', $content, $matches)) { + $parts = preg_split("/\r?\n/", $matches[1], 4); + + $charset = trim(substr($parts[1], stripos($parts[1], "charset=") + 8)); + } + + return $charset; + } + + private function _escape_string($content) + { + $replace['/"/'] = '\\"'; + + if (is_array($content)) { + for ($x=0, $y=sizeof($content); $x<$y; $x++) + $content[$x] = preg_replace(array_keys($replace), array_values($replace), $content[$x]); + + return $content; + } + else { + return preg_replace(array_keys($replace), array_values($replace), $content); + } + } + + private function _parse_list($content, $regex = false) + { + $result = array(); + + if ($regex) { + if (preg_match('/^"(.*)"$/', $content, $matches)); + $content = $matches[1]; + + $content = str_replace('\"', '"', $content); + return $content; + } + + for ($x=0, $len=strlen($content); $x<$len; $x++) { + switch ($content[$x]) { + case '\\': + $str .= $content[++$x]; + + break; + case '"': + if (isset($str)) { + $result[] = $str; + unset($str); + } + else { + $str = ''; + } + + break; + default: + if (isset($str)) + $str .= $content[$x]; + + break; + } + } + + if (sizeof($result)>1) + return $result; + elseif (sizeof($result) == 1) + return $result[0]; + else + return NULL; + } + + private function _safe_serial($data) + { + $data = str_replace("\r", "[!r]", $data); + $data = str_replace("\n", "[!n]", $data); + return $data; + } + + private function _regular_serial($data) + { + $data = str_replace("[!r]", "\r", $data); + $data = str_replace("[!n]", "\n", $data); + return $data; + } +} + +?> \ No newline at end of file diff --git a/plugins/sieverules/jquery.maskedinput.js b/plugins/sieverules/jquery.maskedinput.js new file mode 100644 index 000000000..0d9ce6e06 --- /dev/null +++ b/plugins/sieverules/jquery.maskedinput.js @@ -0,0 +1,7 @@ +/* + Masked Input plugin for jQuery + Copyright (c) 2007-2013 Josh Bush (digitalbush.com) + Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license) + Version: 1.3.1 +*/ +(function(e){function t(){var e=document.createElement("input"),t="onpaste";return e.setAttribute(t,""),"function"==typeof e[t]?"paste":"input"}var n,a=t()+".mask",r=navigator.userAgent,i=/iphone/i.test(r),o=/android/i.test(r);e.mask={definitions:{9:"[0-9]",a:"[A-Za-z]","*":"[A-Za-z0-9]"},dataName:"rawMaskFn",placeholder:"_"},e.fn.extend({caret:function(e,t){var n;if(0!==this.length&&!this.is(":hidden"))return"number"==typeof e?(t="number"==typeof t?t:e,this.each(function(){this.setSelectionRange?this.setSelectionRange(e,t):this.createTextRange&&(n=this.createTextRange(),n.collapse(!0),n.moveEnd("character",t),n.moveStart("character",e),n.select())})):(this[0].setSelectionRange?(e=this[0].selectionStart,t=this[0].selectionEnd):document.selection&&document.selection.createRange&&(n=document.selection.createRange(),e=0-n.duplicate().moveStart("character",-1e5),t=e+n.text.length),{begin:e,end:t})},unmask:function(){return this.trigger("unmask")},mask:function(t,r){var c,l,s,u,f,h;return!t&&this.length>0?(c=e(this[0]),c.data(e.mask.dataName)()):(r=e.extend({placeholder:e.mask.placeholder,completed:null},r),l=e.mask.definitions,s=[],u=h=t.length,f=null,e.each(t.split(""),function(e,t){"?"==t?(h--,u=e):l[t]?(s.push(RegExp(l[t])),null===f&&(f=s.length-1)):s.push(null)}),this.trigger("unmask").each(function(){function c(e){for(;h>++e&&!s[e];);return e}function d(e){for(;--e>=0&&!s[e];);return e}function m(e,t){var n,a;if(!(0>e)){for(n=e,a=c(t);h>n;n++)if(s[n]){if(!(h>a&&s[n].test(R[a])))break;R[n]=R[a],R[a]=r.placeholder,a=c(a)}b(),x.caret(Math.max(f,e))}}function p(e){var t,n,a,i;for(t=e,n=r.placeholder;h>t;t++)if(s[t]){if(a=c(t),i=R[t],R[t]=n,!(h>a&&s[a].test(i)))break;n=i}}function g(e){var t,n,a,r=e.which;8===r||46===r||i&&127===r?(t=x.caret(),n=t.begin,a=t.end,0===a-n&&(n=46!==r?d(n):a=c(n-1),a=46===r?c(a):a),k(n,a),m(n,a-1),e.preventDefault()):27==r&&(x.val(S),x.caret(0,y()),e.preventDefault())}function v(t){var n,a,i,l=t.which,u=x.caret();t.ctrlKey||t.altKey||t.metaKey||32>l||l&&(0!==u.end-u.begin&&(k(u.begin,u.end),m(u.begin,u.end-1)),n=c(u.begin-1),h>n&&(a=String.fromCharCode(l),s[n].test(a)&&(p(n),R[n]=a,b(),i=c(n),o?setTimeout(e.proxy(e.fn.caret,x,i),0):x.caret(i),r.completed&&i>=h&&r.completed.call(x))),t.preventDefault())}function k(e,t){var n;for(n=e;t>n&&h>n;n++)s[n]&&(R[n]=r.placeholder)}function b(){x.val(R.join(""))}function y(e){var t,n,a=x.val(),i=-1;for(t=0,pos=0;h>t;t++)if(s[t]){for(R[t]=r.placeholder;pos++a.length)break}else R[t]===a.charAt(pos)&&t!==u&&(pos++,i=t);return e?b():u>i+1?(x.val(""),k(0,h)):(b(),x.val(x.val().substring(0,i+1))),u?t:f}var x=e(this),R=e.map(t.split(""),function(e){return"?"!=e?l[e]?r.placeholder:e:void 0}),S=x.val();x.data(e.mask.dataName,function(){return e.map(R,function(e,t){return s[t]&&e!=r.placeholder?e:null}).join("")}),x.attr("readonly")||x.one("unmask",function(){x.unbind(".mask").removeData(e.mask.dataName)}).bind("focus.mask",function(){clearTimeout(n);var e;S=x.val(),e=y(),n=setTimeout(function(){b(),e==t.length?x.caret(0,e):x.caret(e)},10)}).bind("blur.mask",function(){y(),x.val()!=S&&x.change()}).bind("keydown.mask",g).bind("keypress.mask",v).bind(a,function(){setTimeout(function(){var e=y(!0);x.caret(e),r.completed&&e==x.val().length&&r.completed.call(x)},0)}),y()}))}})})(jQuery); \ No newline at end of file diff --git a/plugins/sieverules/lib/Net/Sieve.php b/plugins/sieverules/lib/Net/Sieve.php new file mode 120000 index 000000000..fa112b6a9 --- /dev/null +++ b/plugins/sieverules/lib/Net/Sieve.php @@ -0,0 +1 @@ +../../../../../php/Net/Sieve.php \ No newline at end of file diff --git a/plugins/sieverules/localization/ca_ES.inc b/plugins/sieverules/localization/ca_ES.inc new file mode 100644 index 000000000..63ad80d0f --- /dev/null +++ b/plugins/sieverules/localization/ca_ES.inc @@ -0,0 +1,168 @@ +
Por ejemplo, si en Jaume envia un misssatge un dilluns, i té un període fixat en 7, en Jaume rebrà un avís de vacances el dilluns però no en rebrà cap altre fins al proper dilluns, malgrat envïi més missatges durant la setmana.'; +$messages['vachandleexp'] = 'Es pot usar un manejador per a vincular diferents missatges de vacances tots junts. Un cop s\'envïi el missatge no se n\'enviarà un altre que contingut el mateix manejador durant el període definit.'; +$messages['vactoexp'] = 'Llista de destinataris addicionals que seran inclosos en l\'auto-resposta. Si un usuari no és la sefa adreça personal i no està a la llista no se li enviaràn missatges.'; +$messages['norulename'] = 'Cal assignar un nom al filtre'; +$messages['ruleexists'] = 'Ja existeix un filtre amb aquest nom. Escolleix-ne un altre'; +$messages['noheader'] = 'Heu d\'introduïr el nom de la capçalera a verificar'; +$messages['headerbadchars'] = 'Error: La capçalera conté caràcters no permesos'; +$messages['noheadervalue'] = 'Ingresseu un valor per a comparar-lo amb la capçalera'; +$messages['sizewrongformat'] = 'Error: El tamany del missatge ha de ser numèric'; +$messages['noredirect'] = 'Introduïu una adreça de correu a la qual redirigir tots els missatges'; +$messages['redirectaddresserror'] = 'Error: Adreça no vàlida'; +$messages['noreject'] = 'Introduïu el text a enviar en els missatges rebutjats'; +$messages['vacnodays'] = 'Introduïu el número de dies per al període que el missatge no serà reenviat a la mateixa persona'; +$messages['vacdayswrongformat'] = 'Error: El període ha de ser de més d\'1 dia'; +$messages['vacnomsg'] = 'Introduïu un text per al missatge'; +$messages['notifynomethod'] = 'Introduïu un mètode a través del qual s\'enviarà la notificació '; +$messages['notifynomsg'] = 'Introduïu un text per al seu missatge'; +$messages['sieveruleexp'] = 'Heu de definir una o més regles que s\'empraran per a comprar els missatges. Els filtres só n executats en l\'ordre que apareixen a l\'esquerra d\'aquesta pantalla. Si es troba una coincidència, la resta del filtres no es comproven.'; +$messages['sieveactexp'] = 'Seleccioneu una de les opcions que apareixen a continuació . Aquesta acció serà executada per cada missatge que encaixi amb les regles definides a sobre d\'aquest text.'; +$messages['sieveheadershlp'] = 'A continuació hi ha alguns exemples de capçaleres que poden verificar-se amb filtres. Seleccioni\'n una per afegir a la regla o introduïu-ne una de pròpia en el requadre de dalt.'; +$messages['movingfilter'] = 'Movent filtre...'; +$messages['noexistingfilters'] = 'No s\'han detectat filtres!'; +$messages['importdefault'] = 'Emprar filtres per defecte: Hi ha un joc de filtres per defecte disponibles. Voleu instalar una còpia d\'aquests filtres?'; +$messages['importother'] = 'Importar filtres: S\'ha trobat un altre joc de filtres de %s. Voleu importar-los a la llsita de filtres?'; +$messages['switchtoadveditor'] = 'L\'editor avançat li permet editar les regles de sieve directament. Qualsevol canvi que faci serà il.legible per l\'editor normal de regles i es perderà si guarda modificacions amb l\'editor normal. Voleu continuar?'; +$messages['filterimported'] = 'Filtre importat correctament'; +$messages['filterimporterror'] = 'No s\'ha pogut importar el filtre . Error en el servidor'; +$messages['badoperator'] = 'Ho lamentem, però l\'operador seleccionat no es pot usar en aquesta regla.'; +$messages['filteractionerror'] = 'L\'acció requerida no està disponible en aquest servidor.'; +$messages['filtermissingerror'] = 'No s\'ha pogut localitzar la regla solicitada.'; +$messages['delrulesetconf'] = 'Esteu segur de voler eliminar aquest conjunt de regles?'; +$messages['rulesetexists'] = 'Ja existeix un conjunt de regles amb aquest nom. Escolliu-ne un altre.'; +$messages['copyexisting'] = ' Copia el següent conjunt de regles: Voleu importar els filtres d\'un conjunt de regles existents al conjunt actual?'; +$messages['filtercopied'] = 'Filtre copiat correctament'; +$messages['nosieverulesets'] = 'No s\'han trobat regles.'; + +?> \ No newline at end of file diff --git a/plugins/sieverules/localization/cs_CZ.inc b/plugins/sieverules/localization/cs_CZ.inc new file mode 100644 index 000000000..f5a8b5f61 --- /dev/null +++ b/plugins/sieverules/localization/cs_CZ.inc @@ -0,0 +1,195 @@ +
Příklad: Pokud vám Honza napíše v pondělí a prodleva je nastavena na 7, Honza obdrží zprávu o vaší nedostupnosti v pondělí, ale do dalšího pondělí už žádnou další zprávu nedostane, nehledě na počet mailů, které vám během týdne pošle.'; +$messages['vachandleexp'] = 'Štítek může být použit ke spojení více různých oznámení o nedostupnosti dohromady. Jakmile je jedna zpráva zaslána, žádná další se stejným štítkem už v dané době zaslána nebude.'; +$messages['vactoexp'] = 'Seznam dalších emailů, které jsou v automatické odpovědi zahrnuty. Pokud není příjemcem emailu vaše hlavní adresa a není na tomto seznamu, žádná zpráva nebude odeslána.'; +$messages['vactoexp_adv'] = 'Jednotlivé adresy oddělte čárkou. Například: test1@adresa.cz,test2@adresa.cz,test3@adresa.cz'; +$messages['vactoexp_err'] = 'Chyba: Více aliasů musí být odděleno čárkou.'; +$messages['norulename'] = 'Zadejte prosím jméno pro tento filtr.'; +$messages['ruleexists'] = 'Filtr se stejným jménem již existuje. Zadejte prosím jiné.'; +$messages['noheader'] = 'Zadejte prosím jméno hlavičky k otestování.'; +$messages['headerbadchars'] = 'Chyba: hlavička obsahuje zakázané znaky.'; +$messages['noheadervalue'] = 'Zadejte prosím hodnotu, vůči které bude hlavička testována.'; +$messages['sizewrongformat'] = 'Chyba: velikost zprávy musí být číslo.'; +$messages['noredirect'] = 'Zadejte prosím emailovou adresu, na kterou se má zpráva přesměrovat.'; +$messages['redirectaddresserror'] = 'Chyba: zdá se, že je email chybný.'; +$messages['noreject'] = 'Zadejte prosím zprávu, která se odešle spolu s odmítnutým emailem.'; +$messages['vacnodays'] = 'Zadejte prosím počet dní pro prodlevu, během které nebude zpráva zasílána stejné osobě.'; +$messages['vacdayswrongformat'] = 'Chyba: prodleva musí být číslo větší nebo rovné 1.'; +$messages['vacnomsg'] = 'Zadejte prosím nějaký text pro vaši zprávu.'; +$messages['notifynomethod'] = 'Zadejte prosím metodu, jakou má být notifikace zaslána.'; +$messages['notifynomsg'] = 'Zadejte prosím nějaký text pro vaši zprávu.'; +$messages['sieveruleexp'] = 'Prosím přidejte jedno nebo více pravidel vůči kterým bude každá zpráva testována. Filtry jsou vyhodnocovány v pořadí v jakém jsou uvedeny v sloupci vlevo. Pokud je nalezena shoda, žádný další filtr se již nevyhodnocuje.'; +$messages['sieveruleexp_stop'] = 'Zadejte prosím jedno nebo více pravidel vůči kterým bude každá zpráva testována. Filtry jsou vyhodnocovány v pořadí v jakém jsou uvedeny v sloupci vlevo dokud není dosaženo \'Přerušení\' akce.'; +$messages['sieveactexp'] = 'Prosím vyberte si z voleb níže. Akce budou vykonány pro jakoukoliv zprávu, která vyhovuje pravidlům výše.'; +$messages['sieveheadershlp'] = 'Níže je několik případu hlaviček, které mohou být ve filtrech testovány. Pro přidání do pravidla vyberte hlavičku nebo zadejte vlastní v poli nahoře.'; +$messages['movingfilter'] = 'Přesouvám filtr...'; +$messages['noexistingfilters'] = 'Nenalezeny žádné existující filtry!'; +$messages['importdefault'] = 'Použít výchozí filtry: Je dostupná sada výchozích filtrů. Přejte si tuto sadu využít?'; +$messages['importother'] = 'Importovat filtry: Byla nalezena jiná sada filtrů z %s. Chcete tyto filtry importovat do stávající sady?'; +$messages['switchtoadveditor'] = 'Přepnutí do pokročilého editoru vám umožní přímo upravovat soubor sieve filtrů. Jakékoliv provedené změny mohou být nečitelné v normálním editoru a mohou být ztraceny, pokud je v normálním editoru uložíte. Přejete si pokračovat?'; +$messages['filterimported'] = 'Filtry úspěšně naimportovány.'; +$messages['filterimporterror'] = 'Nelze importovat filtry. Nastala chyba serveru.'; +$messages['notifyinvalidmethod'] = 'Metoda není napsána ve správném formátu, musí se jednat o URI. Například: `mailto:upozorneni@adresa.cz`.'; +$messages['nobodycontentpart'] = 'Zadejte prosím obsahovou část k otestování.'; +$messages['badoperator'] = 'Omlouváme se, ale operátor, který jste vybrali, nemůže být v tomto pravidle použit.'; +$messages['filteractionerror'] = 'Akce, které jste si vyžádali, není podporována serverem.'; +$messages['filtermissingerror'] = 'Nepodařilo se najít vyžádané pravidlo.'; +$messages['contentpartexp'] = 'MIME-typ nebo konkrétní část zprávy, která má být testována. Například: `message/rfc822`, `text/html`, `audio/mp3` or `image`.'; +$messages['delrulesetconf'] = 'Opravdu chcete smazat tuto sadu pravidel?'; +$messages['rulesetexists'] = 'Sada pravidel s tímto jménem již existuje. Zadejte prosím jinou.'; +$messages['copyexisting'] = 'Kopírovat existující sadu pravidel: Chcete zkopírovat filtry z existující sady pravidel do vybrané sady?'; +$messages['filtercopied'] = 'Filtry úspěšně zkopírovány.'; +$messages['nosieverulesets'] = 'Nenalezeny žádné sady pravidel.'; +$messages['baddateformat'] = 'Chyba: Zadejte prosím datum ve formátu YYYY-MM-DD'; +$messages['badtimeformat'] = 'Chyba: Zadejte prosím čas ve formátu HH:MM:SS'; +$messages['missingfoldername'] = 'Chyba: Zadejte prosím jméno složky'; + +?> \ No newline at end of file diff --git a/plugins/sieverules/localization/de_CH.inc b/plugins/sieverules/localization/de_CH.inc new file mode 100644 index 000000000..d203cd8c1 --- /dev/null +++ b/plugins/sieverules/localization/de_CH.inc @@ -0,0 +1,192 @@ +
Beispiel: Wenn Joe dir am Montag eine Mail schickt und der Zeitraum beträgt 7, bekommt Joe sofort eine Abwesenheitsnachricht gesendet, dann aber bis zum darauffolgenden Montag keine mehr, egal wie häufig er weitere Mails sendet.'; +$messages['vachandleexp'] = 'Ein Handle kann genutzt werden um verschiedene Abwesenheitsnachrichten zu koppeln, so dass im Zeitraum keine weiteren Abwesenheitsnachrichten gesendet werden die das selbe Handle besitzen.'; +$messages['vactoexp'] = 'Liste zusätzlicher Empfängeradressen für die ebenfalls eine Abwesenheitsnachricht gesendet wird. Gehen Mails ein, deren Empfänger nicht die Hauptadresse ist und die nicht in dieser Liste stehen wird keine Abwesenheitsnachricht gesendet.'; +$messages['vactoexp_adv'] = 'Trenne mehrere Adressen mit einem Komma (,). Zum Beispiel: test1@example.com,test2@example.com,test3@example.com'; +$messages['vactoexp_err'] = 'Fehler: Mehrere Adressen müssen durch ein Komma (,) getrennt werden'; +$messages['norulename'] = 'Bitte gib einen Namen für diesen Filter ein'; +$messages['ruleexists'] = 'Ein Filter mit diesem Namen existiert bereits. Wähle einen anderen'; +$messages['noheader'] = 'Bitte gib den Namen des zu testenden Headers ein'; +$messages['headerbadchars'] = 'Fehler: Header enthält unzulässige Zeichen'; +$messages['noheadervalue'] = 'Bitte gib den Wert ein, gegen den der Header getestet werden soll'; +$messages['sizewrongformat'] = 'Fehler: Nachrichtengröße muss numerisch sein'; +$messages['noredirect'] = 'Bitte gib eine E-Mail Adresse zur Weiterleitung ein'; +$messages['redirectaddresserror'] = 'Fehler: E-Mail Adresse ungültig'; +$messages['noreject'] = 'Bitte gib eine Nachricht als Begründung für die Abweisung der Mail ein'; +$messages['vacnodays'] = 'Bitte gib die Anzahl Tage ein, währendessen die Abwesenheitsnachricht nicht erneut an den selben Absender gesendet wird.'; +$messages['vacdayswrongformat'] = 'Fehler: Der Zeitraum muss numerisch größer gleich 1 sein'; +$messages['vacnomsg'] = 'Bitte gib einen Text für deine Nachricht ein'; +$messages['notifynomethod'] = 'Bitte gibt eine Methode an mit der Benachrichtigungen versendet werden sollen.'; +$messages['notifynomsg'] = 'Bitte gebe einen Text für die Nachricht ein'; +$messages['sieveruleexp'] = 'Bitte erstelle eine oder mehrere Regeln gegen die jede Nachricht getestet werden soll. Filter werden in der Reihenfolge durchlaufen, in der sie links gelistet sind. Wenn ein Filter zutrifft, werden keine weiteren Filter durchlaufen.'; +$messages['sieveruleexp_stop'] = 'Bitte wähle mindestens eine Regel, die auf die Nachrichten angewandt werden soll. Filter werden in der Reihenfolge abgearbeitet, wie sie auf der linken Seite dargestellt sind bis eine \'Stop\'-Regel zutrifft.'; +$messages['sieveactexp'] = 'Bitte wähle eine von den unten gelisteten Optionen. Diese Aktionen werden für jede Nachricht ausgeführt, die auf obige Filterregel(n) passt.'; +$messages['sieveheadershlp'] = 'Unten werden einige Header als Beispiel für mögliche Header angezeigt. Wähle einen oder füge oben einen eigenen Header hinzu.'; +$messages['movingfilter'] = 'Verschiebe Filter...'; +$messages['noexistingfilters'] = 'Keine vorhandenen Filter gefunden!'; +$messages['importdefault'] = 'Verwende Standardfilter: Es sind eine Reihe von Standardfiltern verfügbar. Möchtest Du diese verwenden?'; +$messages['importother'] = 'Filter importieren: EIne Reihe von Filtern von %s wurden gefunden. Möchtest Du diese Filter Deinen Filtern hinzufügen?'; +$messages['switchtoadveditor'] = 'Die verwendung des erweiterten Editors ermöglicht es, die Sieve-Filter direkt zu bearbeiten. Alle Änderungen sind für den normalen Editor unlesbar und werden verworfen wenn eine Regel mit dem normalen Editor gespeichert wird. Möchtest Du fortfahren?'; +$messages['filterimported'] = 'Filterimport erfolgreich'; +$messages['filterimporterror'] = 'Fehler beim Filterimport. Serverfehler.'; +$messages['notifyinvalidmethod'] = 'Die Methode scheint ein ungültiges Format zu haben. Es muss eine URI sein, z. B.: `mailto:alert@example.com`.'; +$messages['nobodycontentpart'] = 'Bitte gib den zu testenden Bereich des Inhalts an'; +$messages['badoperator'] = 'Der gewählte Operator kann in dieser Regel nicht verwendet werden'; +$messages['filteractionerror'] = 'Die gewünschte Aktion wird vom Server nicht unterstützt'; +$messages['filtermissingerror'] = 'Die angeforderte Regel konnte nicht gefunden werden'; +$messages['contentpartexp'] = 'Der MIME-Typ oder der Teil der Nachricht, der getestet werden soll. Zum Beispiel: `message/rfc822`, `text/html`, `audio/mp3` oder `image`.'; +$messages['delrulesetconf'] = 'Soll dieser Regelsatz wirklich gelöscht werden?'; +$messages['rulesetexists'] = 'Ein Regelsatz mit diesem Namen existiert bereits. Bitte wähle einen anderen Namen.'; +$messages['copyexisting'] = 'Kopiere bestehenden Regelsatz: Sollen die Filter von einem bestehenden Regelsatz in den akutellen Regelsatz kopiert werden?'; +$messages['filtercopied'] = 'Filter erfolgreich kopiert.'; +$messages['nosieverulesets'] = 'Keine Regelsätze gefunden.'; +$messages['baddateformat'] = 'Fehler: Bitte das Datum im Format JJJJ-MM-TT eingeben.'; +$messages['badtimeformat'] = 'Fehler: Bitte die Uhrzeit im Format HH:MM:SS eingeben.'; +$messages['missingfoldername'] = 'Fehler: Bitte ein Verzeichnisnamen eingeben.'; + +?> \ No newline at end of file diff --git a/plugins/sieverules/localization/de_DE.inc b/plugins/sieverules/localization/de_DE.inc new file mode 100644 index 000000000..3d7499c35 --- /dev/null +++ b/plugins/sieverules/localization/de_DE.inc @@ -0,0 +1,192 @@ +
Beispiel: Wenn Joe dir am Montag eine Mail schickt und der Zeitraum beträgt 7, bekommt Joe sofort eine Abwesenheitsnachricht gesendet, dann aber bis zum darauffolgenden Montag keine mehr, egal wie häufig er weitere Mails sendet.'; +$messages['vachandleexp'] = 'Ein Handle kann genutzt werden um verschiedene Abwesenheitsnachrichten zu koppeln, so dass im Zeitraum keine weiteren Abwesenheitsnachrichten gesendet werden die das selbe Handle besitzen.'; +$messages['vactoexp'] = 'Liste zusätzlicher Empfängeradressen, für die ebenfalls eine Abwesenheitsnachricht gesendet wird. Gehen Mails ein, deren Empfänger nicht die Hauptadresse ist und die nicht in dieser Liste stehen, wird keine Abwesenheitsnachricht gesendet.'; +$messages['vactoexp_adv'] = 'Trenne mehrere Adressen mit einem Komma (,). Zum Beispiel: test1@example.com,test2@example.com,test3@example.com'; +$messages['vactoexp_err'] = 'Fehler: Mehrere Adressen müssen durch ein Komma (,) getrennt werden'; +$messages['norulename'] = 'Bitte gib einen Namen für diesen Filter ein'; +$messages['ruleexists'] = 'Ein Filter mit diesem Namen existiert bereits. Wähle einen anderen'; +$messages['noheader'] = 'Bitte gib den Namen des zu testenden Headers ein'; +$messages['headerbadchars'] = 'Fehler: Header enthält unzulässige Zeichen'; +$messages['noheadervalue'] = 'Bitte gib den Wert ein, gegen den der Header getestet werden soll'; +$messages['sizewrongformat'] = 'Fehler: Nachrichtengröße muss numerisch sein'; +$messages['noredirect'] = 'Bitte gib eine E-Mail Adresse zur Weiterleitung ein'; +$messages['redirectaddresserror'] = 'Fehler: E-Mail Adresse ungültig'; +$messages['noreject'] = 'Bitte gib eine Nachricht als Begründung für die Abweisung der Mail ein'; +$messages['vacnodays'] = 'Bitte gib die Anzahl Tage ein, währendessen die Abwesenheitsnachricht nicht erneut an den selben Absender gesendet wird.'; +$messages['vacdayswrongformat'] = 'Fehler: Der Zeitraum muss numerisch größer gleich 1 sein'; +$messages['vacnomsg'] = 'Bitte gib einen Text für deine Nachricht ein'; +$messages['notifynomethod'] = 'Bitte gibt eine Methode an mit der Benachrichtigungen versendet werden sollen.'; +$messages['notifynomsg'] = 'Bitte gebe einen Text für die Nachricht ein'; +$messages['sieveruleexp'] = 'Bitte erstelle eine oder mehrere Regeln gegen die jede Nachricht getestet werden soll. Filter werden in der Reihenfolge durchlaufen, in der sie links gelistet sind. Wenn ein Filter zutrifft, werden keine weiteren Filter durchlaufen.'; +$messages['sieveruleexp_stop'] = 'Bitte wähle mindestens eine Regel, die auf die Nachrichten angewandt werden soll. Filter werden in der Reihenfolge abgearbeitet, wie sie auf der linken Seite dargestellt sind bis eine \'Stop\'-Regel zutrifft.'; +$messages['sieveactexp'] = 'Bitte wähle eine von den unten gelisteten Optionen. Diese Aktionen werden für jede Nachricht ausgeführt, die auf obige Filterregel(n) passt.'; +$messages['sieveheadershlp'] = 'Unten werden einige Header als Beispiel für mögliche Header angezeigt. Wähle einen oder füge oben einen eigenen Header hinzu.'; +$messages['movingfilter'] = 'Verschiebe Filter...'; +$messages['noexistingfilters'] = 'Keine vorhandenen Filter gefunden!'; +$messages['importdefault'] = 'Verwende Standardfilter: Es sind eine Reihe von Standardfiltern verfügbar. Möchtest Du diese verwenden?'; +$messages['importother'] = 'Filter importieren: EIne Reihe von Filtern von %s wurden gefunden. Möchtest Du diese Filter Deinen Filtern hinzufügen?'; +$messages['switchtoadveditor'] = 'Die verwendung des erweiterten Editors ermöglicht es, die Sieve-Filter direkt zu bearbeiten. Alle Änderungen sind für den normalen Editor unlesbar und werden verworfen wenn eine Regel mit dem normalen Editor gespeichert wird. Möchtest Du fortfahren?'; +$messages['filterimported'] = 'Filterimport erfolgreich'; +$messages['filterimporterror'] = 'Fehler beim Filterimport. Serverfehler.'; +$messages['notifyinvalidmethod'] = 'Die Methode scheint ein ungültiges Format zu haben. Es muss eine URI sein, z. B.: `mailto:alert@example.com`.'; +$messages['nobodycontentpart'] = 'Bitte gib den zu testenden Bereich des Inhalts an'; +$messages['badoperator'] = 'Der gewählte Operator kann in dieser Regel nicht verwendet werden'; +$messages['filteractionerror'] = 'Die gewünschte Aktion wird vom Server nicht unterstützt'; +$messages['filtermissingerror'] = 'Die angeforderte Regel konnte nicht gefunden werden'; +$messages['contentpartexp'] = 'Der MIME-Typ oder der Teil der Nachricht, der getestet werden soll. Zum Beispiel: `message/rfc822`, `text/html`, `audio/mp3` oder `image`.'; +$messages['delrulesetconf'] = 'Soll dieser Regelsatz wirklich gelöscht werden?'; +$messages['rulesetexists'] = 'Ein Regelsatz mit diesem Namen existiert bereits. Bitte wähle einen anderen Namen.'; +$messages['copyexisting'] = 'Kopiere bestehenden Regelsatz: Sollen die Filter von einem bestehenden Regelsatz in den akutellen Regelsatz kopiert werden?'; +$messages['filtercopied'] = 'Filter erfolgreich kopiert.'; +$messages['nosieverulesets'] = 'Keine Regelsätze gefunden.'; +$messages['baddateformat'] = 'Fehler: Bitte das Datum im Format JJJJ-MM-TT eingeben.'; +$messages['badtimeformat'] = 'Fehler: Bitte die Uhrzeit im Format HH:MM:SS eingeben.'; +$messages['missingfoldername'] = 'Fehler: Bitte ein Verzeichnisnamen eingeben.'; + +?> \ No newline at end of file diff --git a/plugins/sieverules/localization/en_GB.inc b/plugins/sieverules/localization/en_GB.inc new file mode 100644 index 000000000..bdb0a15f4 --- /dev/null +++ b/plugins/sieverules/localization/en_GB.inc @@ -0,0 +1,205 @@ +
For example: If Joe emails you on Monday and the period is set to 7 then Joe will receive an out of office message on Monday but will not get another one until the following Monday, no matter how many emails he sends an email during the week.'; +$messages['vachandleexp'] = 'A handle can be used to link different out of office messages together, once one message has been sent no other message with the same handle will be resent in that period.'; +$messages['vactoexp'] = 'List of additional recipient addresses which are included in the auto replying. If a mail\'s recipient is not your main address and it\'s not on this list, no message will be sent.'; +$messages['vactoexp_adv'] = 'Separate multiple aliases with a comma (,). For Example: test1@example.com,test2@example.com,test3@example.com'; +$messages['vactoexp_err'] = 'Error: Multiple aliases should be separated with a comma (,)'; +$messages['norulename'] = 'Please enter a name for this filter'; +$messages['ruleexists'] = 'A filter with this name already exists. Please enter another'; +$messages['noheader'] = 'Please enter the name of the header to test'; +$messages['headerbadchars'] = 'Error: Header contains forbidden characters'; +$messages['noheadervalue'] = 'Please enter a value to test the header against'; +$messages['sizewrongformat'] = 'Error: Message size must be numeric'; +$messages['noredirect'] = 'Please enter an email address to redirect messages to'; +$messages['redirectaddresserror'] = 'Error: Address appears invalid'; +$messages['noreject'] = 'Please enter a message to send with rejected email'; +$messages['vacnodays'] = 'Please enter a number of days for the period in which the message will not be resent to the same person'; +$messages['vacdayswrongformat'] = 'Error: The period must be a number greater than or equal to 1'; +$messages['vacnomsg'] = 'Please enter some text for your message'; +$messages['notifynomethod'] = 'Please enter a method by which the notification should be sent'; +$messages['notifynomsg'] = 'Please enter some text for your message'; +$messages['sieveruleexp'] = 'Please define one or more rules against which each message will be tested. Filters are run in the order in which they appear on the left of this screen, if a match is found no further filters will be tested.'; +$messages['sieveruleexp_stop'] = 'Please define one or more rules against which each message will be tested. Filters are run in the order in which they appear on the left of this screen until a \'Stop\' action is met.'; +$messages['sieveactexp'] = 'Please select from the options below. These actions will be performed for any message matching the above rule(s).'; +$messages['sieveheadershlp'] = 'Below are some examples of other headers that can be tested by the filters. Select a header to add it to the rule or enter a custom one in the box above.'; +$messages['movingfilter'] = 'Moving filter...'; +$messages['noexistingfilters'] = 'No existing filters detected!'; +$messages['importdefault'] = 'Use default filters: There is a set of default filters available. Would you like to use these filters?'; +$messages['importother'] = 'Import filters: Another set of filters from %s has been found. Would you like to import these filters into your current set?'; +$messages['switchtoadveditor'] = 'Switching to the advanced editor allows you to edit the sieve file directly. Any changes here may be unreadable in the normal editor and may be lost when filters are saved using the normal editor. Do you wish to continue?'; +$messages['filterimported'] = 'Filter imported successfully'; +$messages['filterimporterror'] = 'Unable to import filter. Server error occurred'; +$messages['notifyinvalidmethod'] = 'The method does not appear to be written in a valid format, it must be a URI. For example: `mailto:alert@example.com`.'; +$messages['nobodycontentpart'] = 'Please enter a content part to test'; +$messages['badoperator'] = 'Sorry the operator you selected cannot be used in this rule'; +$messages['filteractionerror'] = 'The action you requested is not supported by the server'; +$messages['filtermissingerror'] = 'Unable to find the rule requested'; +$messages['contentpartexp'] = 'The MIME-type or specific part of the message which should be tested. For example: `message/rfc822`, `text/html`, `audio/mp3` or `image`.'; +$messages['delrulesetconf'] = 'Are you sure you want to delete this ruleset?'; +$messages['rulesetexists'] = 'A ruleset with this name already exists. Please enter another'; +$messages['copyexisting'] = 'Copy exiting ruleset: Would you like to copy filters from an existing ruleset into your current set?'; +$messages['filtercopied'] = 'Filter copied successfully'; +$messages['nosieverulesets'] = 'No rulesets found.'; +$messages['baddateformat'] = 'Error: Please enter the date in the format YYYY-MM-DD'; +$messages['badtimeformat'] = 'Error: Please enter the time in the format HH:MM:SS'; +$messages['missingfoldername'] = 'Error: Please enter a folder name'; +$messages['eheadernoname'] = 'Error: Please enter a header name'; +$messages['eheadernoval'] = 'Error: Please enter a header value'; + +?> \ No newline at end of file diff --git a/plugins/sieverules/localization/en_US.inc b/plugins/sieverules/localization/en_US.inc new file mode 100644 index 000000000..6049eeb73 --- /dev/null +++ b/plugins/sieverules/localization/en_US.inc @@ -0,0 +1,205 @@ +
For example: If Joe emails you on Monday and the period is set to 7 then Joe will receive an out of office message on Monday but will not get another one until the following Monday, no matter how many emails he sends an email during the week.'; +$messages['vachandleexp'] = 'A handle can be used to link different out of office messages together, once one message has been sent no other message with the same handle will be resent in that period.'; +$messages['vactoexp'] = 'List of additional recipient addresses which are included in the auto replying. If a mail\'s recipient is not your main address and it\'s not on this list, no message will be sent.'; +$messages['vactoexp_adv'] = 'Separate multiple aliases with a comma (,). For Example: test1@example.com,test2@example.com,test3@example.com'; +$messages['vactoexp_err'] = 'Error: Multiple aliases should be separated with a comma (,)'; +$messages['norulename'] = 'Please enter a name for this filter'; +$messages['ruleexists'] = 'A filter with this name already exists. Please enter another'; +$messages['noheader'] = 'Please enter the name of the header to test'; +$messages['headerbadchars'] = 'Error: Header contains forbidden characters'; +$messages['noheadervalue'] = 'Please enter a value to test the header against'; +$messages['sizewrongformat'] = 'Error: Message size must be numeric'; +$messages['noredirect'] = 'Please enter an email address to redirect messages to'; +$messages['redirectaddresserror'] = 'Error: Address appears invalid'; +$messages['noreject'] = 'Please enter a message to send with rejected email'; +$messages['vacnodays'] = 'Please enter a number of days for the period in which the message will not be resent to the same person'; +$messages['vacdayswrongformat'] = 'Error: The period must be a number greater than or equal to 1'; +$messages['vacnomsg'] = 'Please enter some text for your message'; +$messages['notifynomethod'] = 'Please enter a method by which the notification should be sent'; +$messages['notifynomsg'] = 'Please enter some text for your message'; +$messages['sieveruleexp'] = 'Please define one or more rules against which each message will be tested. Filters are run in the order in which they appear on the left of this screen, if a match is found no further filters will be tested.'; +$messages['sieveruleexp_stop'] = 'Please define one or more rules against which each message will be tested. Filters are run in the order in which they appear on the left of this screen until a \'Stop\' action is met.'; +$messages['sieveactexp'] = 'Please select from the options below. These actions will be performed for any message matching the above rule(s).'; +$messages['sieveheadershlp'] = 'Below are some examples of other headers that can be tested by the filters. Select a header to add it to the rule or enter a custom one in the box above.'; +$messages['movingfilter'] = 'Moving filter...'; +$messages['noexistingfilters'] = 'No existing filters detected!'; +$messages['importdefault'] = 'Use default filters: There is a set of default filters available. Would you like to use these filters?'; +$messages['importother'] = 'Import filters: Another set of filters from %s has been found. Would you like to import these filters into your current set?'; +$messages['switchtoadveditor'] = 'Switching to the advanced editor allows you to edit the sieve file directly. Any changes here may be unreadable in the normal editor and may be lost when filters are saved using the normal editor. Do you wish to continue?'; +$messages['filterimported'] = 'Filter imported successfully'; +$messages['filterimporterror'] = 'Unable to import filter. Server error occurred'; +$messages['notifyinvalidmethod'] = 'The method does not appear to be written in a valid format, it must be a URI. For example: `mailto:alert@example.com`.'; +$messages['nobodycontentpart'] = 'Please enter a content part to test'; +$messages['badoperator'] = 'Sorry the operator you selected cannot be used in this rule'; +$messages['filteractionerror'] = 'The action you requested is not supported by the server'; +$messages['filtermissingerror'] = 'Unable to find the rule requested'; +$messages['contentpartexp'] = 'The MIME-type or specific part of the message which should be tested. For example: `message/rfc822`, `text/html`, `audio/mp3` or `image`.'; +$messages['delrulesetconf'] = 'Are you sure you want to delete this ruleset?'; +$messages['rulesetexists'] = 'A ruleset with this name already exists. Please enter another'; +$messages['copyexisting'] = 'Copy exiting ruleset: Would you like to copy filters from an existing ruleset into your current set?'; +$messages['filtercopied'] = 'Filter copied successfully'; +$messages['nosieverulesets'] = 'No rulesets found.'; +$messages['baddateformat'] = 'Error: Please enter the date in the format YYYY-MM-DD'; +$messages['badtimeformat'] = 'Error: Please enter the time in the format HH:MM:SS'; +$messages['missingfoldername'] = 'Error: Please enter a folder name'; +$messages['eheadernoname'] = 'Error: Please enter a header name'; +$messages['eheadernoval'] = 'Error: Please enter a header value'; + +?> \ No newline at end of file diff --git a/plugins/sieverules/localization/es_AR.inc b/plugins/sieverules/localization/es_AR.inc new file mode 100644 index 000000000..b57e223a4 --- /dev/null +++ b/plugins/sieverules/localization/es_AR.inc @@ -0,0 +1,140 @@ +
Por ejemplo, si Juan le manda un mensaje, unlunes, y tiene el periodo fijado en 7, Juan recibirá un aviso de vacaciones el lunes pero no recibirá otro hasta el siguiente lunes, sin importar cuántos emails le envíe durente la semana.'; +$messages['vachandleexp'] = 'Se puede usar un manejador para vincular diferentes mensajes de vacaciones todos juntos, una vez se envio un mensaje, no se enviará otro que tenga el mismo manejador durante el periodo definido.'; +$messages['vactoexp'] = 'Lista de destinatarios adicionales que será incluida en la auto respuesta. Si un destinatario no es su dirección principal, y no está en esta lista, no se le enviarán mensajes.'; +$messages['norulename'] = 'Debe asignar un nombre al filtro'; +$messages['ruleexists'] = 'Ya hay un filtro con ese nombre. Elija otro'; +$messages['noheader'] = 'Debe ingresar el nombre de la cabecera a verificar'; +$messages['headerbadchars'] = 'Error: La cabecera contiene caracteres no permitidos'; +$messages['noheadervalue'] = 'Ingrese un valor contra el cual comparar la cabecera'; +$messages['sizewrongformat'] = 'Error: El tamaño del mensaje debe ser numérico'; +$messages['noredirect'] = 'Ingrese una dirección de email a la cual redirigir los mensajes'; +$messages['redirectaddresserror'] = 'Error: Dirección inválida'; +$messages['noreject'] = 'Ingrese el texto a enviar con los mensajes rechazados'; +$messages['vacnodays'] = 'Ingrese el numero de dias para el periodo que el mensaje no será reenviado a la misma persona'; +$messages['vacdayswrongformat'] = 'Error: El periodo debe ser 1 o más dias'; +$messages['vacnomsg'] = 'Ingrese un texto para el mensaje'; +$messages['notifynomethod'] = 'Ingrese el método por el cual se enviará la notificación'; +$messages['notifynomsg'] = 'Ingrese un texto para su mensaje'; +$messages['sieveruleexp'] = 'Debe definir una o más reglas contra las que se comprobarán los mensajes. Los filtros son ejecutados en el orden e nque aparecen a la izquierda de esta pantalla. Si se encuentra una coincidencia los demás filtros no se comprueban.'; +$messages['sieveactexp'] = 'Seleccione una de las opciones que figuran abajo. Esta acción será ejecutada por cada mensaje que concuerden con las reglas que figuran arriba.'; +$messages['sieveheadershlp'] = 'Debajo hay algunos ejemplos de cabeceras que pueden verificarse con filtros. Seleccione una cabecera para agregar a la regla o increse una propia en el cuadro de arriba.'; +$messages['movingfilter'] = 'Moviendo filtro...'; +$messages['noexistingfilters'] = '¡No se detectan filtros!'; +$messages['importdefault'] = 'Usar filtros por defecto: Hay un juego de filtros por defecto disponibles. ¿Quiere instalar una copia de esos filtros?'; +$messages['importother'] = 'Importar filtros: Se ha encontrado otro juego de filtros de %s. ¿Quiere importarlos a su lista de filtros?'; +$messages['switchtoadveditor'] = 'El editor avanzado le permite editar las reglas de sieve directamente. Cualquier cambio que haga será ilegible para el editor normal de reglas y se parderá si graba modificaciones con el editor normal. ¿Quiere continuar?'; +$messages['filterimported'] = 'Filtro importado correctamente'; +$messages['filterimporterror'] = 'No se pudo importar el filtro. Error en el servidor'; + +?> \ No newline at end of file diff --git a/plugins/sieverules/localization/es_ES.inc b/plugins/sieverules/localization/es_ES.inc new file mode 100644 index 000000000..df9b0f24b --- /dev/null +++ b/plugins/sieverules/localization/es_ES.inc @@ -0,0 +1,185 @@ +
Por ejemplo, si Juan le manda un mensaje, un lunes, y tiene el periodo fijado en 7, Juan recibirá un aviso de vacaciones el lunes pero no recibirá otro hasta el siguiente lunes, sin importar cuántos emails le envíe durente la semana.'; +$messages['vachandleexp'] = 'Se puede usar un manejador para vincular diferentes mensajes de vacaciones todos juntos, una vez se envio un mensaje, no se enviará otro que tenga el mismo manejador durante el periodo definido.'; +$messages['vactoexp'] = 'Lista de destinatarios adicionales que será incluida en la auto respuesta. Si un destinatario no es su dirección principal, y no está en esta lista, no se le enviarán mensajes.'; +$messages['vactoexp_adv'] = 'Separe multiples alias con coma (,). Por ejemplo test1@ejemplo.com,test2@ejemplo.com,test3@ejemplo.com'; +$messages['vactoexp_err'] = 'Error: Los distintos alias deben separarse con coma (,)'; +$messages['norulename'] = 'Debe asignar un nombre al filtro'; +$messages['ruleexists'] = 'Ya hay un filtro con ese nombre. Elija otro'; +$messages['noheader'] = 'Debe ingresar el nombre de la cabecera a verificar'; +$messages['headerbadchars'] = 'Error: La cabecera contiene caracteres no permitidos'; +$messages['noheadervalue'] = 'Ingrese un valor contra el cual comparar la cabecera'; +$messages['sizewrongformat'] = 'Error: El tamaño del mensaje debe ser numérico'; +$messages['noredirect'] = 'Ingrese una dirección de email a la cual redirigir los mensajes'; +$messages['redirectaddresserror'] = 'Error: Dirección inválida'; +$messages['noreject'] = 'Ingrese el texto a enviar con los mensajes rechazados'; +$messages['vacnodays'] = 'Ingrese el numero de dias para el periodo que el mensaje no será reenviado a la misma persona'; +$messages['vacdayswrongformat'] = 'Error: El periodo debe ser 1 o más dias'; +$messages['vacnomsg'] = 'Ingrese un texto para el mensaje'; +$messages['notifynomethod'] = 'Ingrese el método por el cual se enviará la notificación'; +$messages['notifynomsg'] = 'Ingrese un texto para su mensaje'; +$messages['sieveruleexp'] = 'Debe definir una o más reglas contra las que se comprobarán los mensajes. Los filtros son ejecutados en el orden en que aparecen a la izquierda de esta pantalla. Si se encuentra una coincidencia los demás filtros no se comprueban.'; +$messages['sieveruleexp_stop'] = 'Debe definir una o más reglas contra las que se comprobarán los mensajes. Los filtros son ejecutados en el orden en que aparecen a la izquierda de esta pantalla, hasta que una acción \'Stop\' se cumpla.'; +$messages['sieveactexp'] = 'Seleccione una de las opciones que figuran abajo. Esta acción será ejecutada por cada mensaje que concuerden con las reglas que figuran arriba.'; +$messages['sieveheadershlp'] = 'Debajo hay algunos ejemplos de cabeceras que pueden verificarse con filtros. Seleccione una cabecera para agregar a la regla o increse una propia en el cuadro de arriba.'; +$messages['movingfilter'] = 'Moviendo filtro...'; +$messages['noexistingfilters'] = '¡No se detectan filtros!'; +$messages['importdefault'] = 'Usar filtros por defecto: Hay un juego de filtros por defecto disponibles. ¿Quiere instalar una copia de esos filtros?'; +$messages['importother'] = 'Importar filtros: Se ha encontrado otro juego de filtros de %s. ¿Quiere importarlos a su lista de filtros?'; +$messages['switchtoadveditor'] = 'El editor avanzado le permite editar las reglas de sieve directamente. Cualquier cambio que haga será ilegible para el editor normal de reglas y se parderá si graba modificaciones con el editor normal. ¿Quiere continuar?'; +$messages['filterimported'] = 'Filtro importado correctamente'; +$messages['filterimporterror'] = 'No se pudo importar el filtro. Error en el servidor'; +$messages['notifyinvalidmethod'] = 'El método no parece estar escrito en un formato válido, debe ser una URI. Por ejemplo: "mailto: alert@example.com".'; +$messages['nobodycontentpart'] = 'Por favor, introduzca una parte de contenido para prueba'; +$messages['badoperator'] = 'Lo sentimos, el operador que ha seleccionado no se puede usar en esta regla.'; +$messages['filteractionerror'] = 'La acción requerida no está soportada por el servidor.'; +$messages['filtermissingerror'] = 'No ha sido posible encontrar la regla solicitada.'; +$messages['contentpartexp'] = 'El tipo MIME o una parte específica del mensaje debe ser probado. Por ejemplo: `message/rfc822`, `text/html`, `audio/mp3` or `image`.'; +$messages['delrulesetconf'] = 'Está seguro de querer borrar este conjunto de reglas?'; +$messages['rulesetexists'] = 'Ya existe un conjunto de reglas con ese nombre. Por favor, escoja otro.'; +$messages['copyexisting'] = ' Copia el siguiente conjunto de reglas: ¿Quiere importar los filtros de un conjunto de reglas existente al conjunto actual?'; +$messages['filtercopied'] = 'Filtro copiado correctamente'; +$messages['nosieverulesets'] = 'No se han encontrado reglas.'; +$messages['baddateformat'] = 'Error: Por favor, introduzca la fecha en el formato AAAA-MM-DD'; +$messages['badtimeformat'] = 'Error: Por favor, introduzca la hora en el formato HH:MM:SS'; + +?> \ No newline at end of file diff --git a/plugins/sieverules/localization/et_EE.inc b/plugins/sieverules/localization/et_EE.inc new file mode 100644 index 000000000..980097d14 --- /dev/null +++ b/plugins/sieverules/localization/et_EE.inc @@ -0,0 +1,79 @@ + \ No newline at end of file diff --git a/plugins/sieverules/localization/fi_FI.inc b/plugins/sieverules/localization/fi_FI.inc new file mode 100644 index 000000000..9114f4adc --- /dev/null +++ b/plugins/sieverules/localization/fi_FI.inc @@ -0,0 +1,186 @@ +
Esimerkki: Jaakko lähettää sinulle sähköpostia maanantaina ja aikaväliksi on valittu 7 päivää. Jaakko saa poissaoloviestisi maanantaina, mutta jos hän lähettää sinulle samalla viikolla lisää viestejä, uutta ilmoitusta ei lähetetä ennen seuraavaa maanantaita.'; +$messages['vachandleexp'] = 'Ryhmittelyä voidaan käyttää yhdistämään eri poissaoloviestit toisiinsa. Kun yksi viesti on lähetetty, muita saman ryhmittelyn viestejä ei lähetetä kyseisen aikavälin aikana.'; +$messages['vactoexp'] = 'Lista muista vastaanottajien sähköpostiosoitteista, jotka liitetään automaattivastaukseen. Mikäli viestin vastaanottaja ei ole pääosoitteesi eikä löydy tältä listalta, mitään viestiä ei lähetetä.'; +$messages['vactoexp_adv'] = 'Erottele aliakset pilkulla (,). Esimerkki: testi1@esimerkki.fi,testi2@esimerkki.fi,testi3@esimerkki.fi'; +$messages['vactoexp_err'] = 'Virhe: aliakset tulee erotella pilkulla (,)'; +$messages['norulename'] = 'Anna suotimelle nimi'; +$messages['ruleexists'] = 'Tällä nimellä on jo suodin. Anna uusi nimi'; +$messages['noheader'] = 'Anna testattavan otsikkotiedon nimi'; +$messages['headerbadchars'] = 'Virhe: otsikkotiedossa on kiellettyjä merkkejä'; +$messages['noheadervalue'] = 'Anna arvo, jolla otsikkotietoa testataan'; +$messages['sizewrongformat'] = 'Virhe: viestin koon täytyy olla numeerinen'; +$messages['noredirect'] = 'Anna osoite, johon viestit ohjataan'; +$messages['redirectaddresserror'] = 'Virhe: osoite ei ole kelvollinen'; +$messages['noreject'] = 'Anna viesti, joka liitetään hylättyyn sähköpostiin'; +$messages['vacnodays'] = 'Ilmoita aikaväli (päivien määrä), jona samalle henkilölle ei lähetetä uutta viestiä.'; +$messages['vacdayswrongformat'] = 'Virhe: aikavälin täytyy olla suurempi tai yhtä suuri luku kuin 1'; +$messages['vacnomsg'] = 'Kirjoita viestiisi jotain sisältöä'; +$messages['notifynomethod'] = 'Määrittele metodi, jota käyttäen ilmoitus lähetetään.'; +$messages['notifynomsg'] = 'Kirjoita viestiisi jotain sisältöä'; +$messages['sieveruleexp'] = 'Määrittele yksi tai useampia sääntöjä, joihin jokaista viestiä testataan. Suotimet suoritetaan siinä järjestyksessä, jossa ne esiintyvät vasemmalla olevalla listalla. Kun jokin suotimista täsmää, loppuja suotimia ei suoriteta.'; +$messages['sieveruleexp_stop'] = 'Määrittele yksi tai useampia sääntöjä, joihin jokaista viestiä testataan. Suotimet suoritetaan siinä järjestyksessä, jossa ne esiintyvät vasemmalla olevalla listalla, kunnes keskeytyssääntö tavataan.'; +$messages['sieveactexp'] = 'Valitse jokin alla olevista vaihtoehdoista. Toiminnot suoritetaan kaikille viesteille, jotka täsmäävät yllä oleviin sääntöihin.'; +$messages['sieveheadershlp'] = 'Alla on esimerkkejä otsikkotiedoista, joita voidaan testata suotimilla. Valitse jokin otsikkotieto listasta tai määrittele muu otsikkotieto yllä olevaan kenttään.'; +$messages['movingfilter'] = 'Siirretään suodinta...'; +$messages['noexistingfilters'] = 'Suotimia ei löytynyt!'; +$messages['importdefault'] = 'Käytä oletussuotimia: Suotimia on saatavilla. Haluatko käyttää näitä suotimia?'; +$messages['importother'] = 'Tuo suotimia: Suotimia löydettiin palvelusta %s. Haluatko lisätä nämä suotimet nykyisiin suotimiin?'; +$messages['switchtoadveditor'] = 'Laajennetulla editorilla voit muokata seulatiedostoa suoraan. Tehdyt muutokset eivät välttämättä ole luettavissa tavallisessa editorissa ja saattavat hävitä, jos suotimia muokataan tavallisella editorilla. Haluatko jatkaa?'; +$messages['filterimported'] = 'Suodin lisätty onnistuneesti'; +$messages['filterimporterror'] = 'Palvelinvirhe. Suotimia ei lisätty'; +$messages['notifyinvalidmethod'] = 'Metodi ei ole kelvollisessa muodossa. Sen täytyy olla osoite. Esimerkki: mailto:virhe@esimerkki.fi'; +$messages['nobodycontentpart'] = 'Anna testattava sisältöosa'; +$messages['badoperator'] = 'Valitsemaasi operaattoria ei voida käyttää tässä säännössä'; +$messages['filteractionerror'] = 'Palvelin ei tue valitsemaasi toimintoa'; +$messages['filtermissingerror'] = 'Valittua sääntöä ei löytynyt'; +$messages['contentpartexp'] = 'MIME-tyyppi tai tietty viestin osa, jota testataan. Esimerkki: "message/rfc822", "text/html", "audio/mp3" tai "image"'; +$messages['delrulesetconf'] = 'Haluatko varmasti poistaa tämän säännöstön?'; +$messages['rulesetexists'] = 'Tällä nimellä on jo säännöstö. Anna uusi nimi'; +$messages['copyexisting'] = 'Kopioi säännöstö: Haluatko kopioida toisen säännöstön nykyisiin sääntöihisi?'; +$messages['filtercopied'] = 'Suodin kopioitu onnistuneesti'; +$messages['nosieverulesets'] = 'Säännöstöä ei löytynyt.'; +$messages['baddateformat'] = 'Virhe: anna päivämäärä muodossa VVVV-KK-PP'; +$messages['badtimeformat'] = 'Virhe: anna aika muodossa TT:MM:SS'; +$messages['missingfoldername'] = 'Virhe: anna kansiolle nimi'; + +?> \ No newline at end of file diff --git a/plugins/sieverules/localization/fr_FR.inc b/plugins/sieverules/localization/fr_FR.inc new file mode 100644 index 000000000..fb9f6d430 --- /dev/null +++ b/plugins/sieverules/localization/fr_FR.inc @@ -0,0 +1,185 @@ +
Par exemple: Si Joe vous contacte le lundi et la période est définie à 7, alors Joe va recevoir un message d\'absence du bureau le lundi, mais n\'en aura pas de nouveaux avant le lundi suivant, peu importe le nombre d\'emails qu\'il envoie au cours de la semaine.'; +$messages['vachandleexp'] = 'Un traitement peut être utilisé pour lier différents messages d\'absence ensemble ; une fois qu\'un message a été envoyé, aucun autre message autre avec le même traitement sera renvoyé durant la période.'; +$messages['vactoexp'] = 'Liste de destinataires supplémentaires qui sont inclus dans l\'auto réponse. Si le destinataire de l\'email n\'est pas votre adresse principale et qu\'elle n\'est pas dans la liste, aucun message ne sera envoyé.'; +$messages['vactoexp_adv'] = 'Séparez plusieurs adresses avec une virgule (,). Par exemple: test1@example.com,test2@example.com,test3@example.com'; +$messages['vactoexp_err'] = 'Erreur: Plusieurs adresses doivent être séparées par une virgule (,)'; +$messages['norulename'] = 'Veuillez entrer un nom pour le filtre'; +$messages['ruleexists'] = 'Un filtre avec le même nom existe déjà. Veuillez en choisir un autre'; +$messages['noheader'] = 'Veuillez entrer le nom de l\'entête à tester'; +$messages['headerbadchars'] = 'Erreur : L\'entête contient des caractères interdits.'; +$messages['noheadervalue'] = 'Veuillez entrer une valeur à tester pour l\'entête'; +$messages['sizewrongformat'] = 'Erreur : La taile du message doit être un nombre'; +$messages['noredirect'] = 'Veuillez entrer une adresse email pour la redirection du message'; +$messages['redirectaddresserror'] = 'Erreur : L\'adresse email semble invalide'; +$messages['noreject'] = 'Veuillez entrer un message à envoyer pour les emails rejetés'; +$messages['vacnodays'] = 'Veuillez entrer un nombre de jours pour la période durant laquelle le message ne sera pas renvoyé à la même personne.'; +$messages['vacdayswrongformat'] = 'Erreur : La période doit être un nombre supérieir à 1'; +$messages['vacnomsg'] = 'Veuillez entrer du texte pour votre message'; +$messages['notifynomethod'] = 'Veuillez entrer la méthode par laquellela notification doit être envoyé'; +$messages['notifynomsg'] = 'veuillez entrer du texte pour votre message'; +$messages['sieveruleexp'] = 'Veuillez définir une ou plusieurs règles pour le filtre. Les filtres sont exécutés dans l\'ordre dans lequel ils apparaissent sur la gauche de l\'écran. Si un filtre est exécuté, plus aucun autre filtre ne sera testé.'; +$messages['sieveruleexp_stop'] = 'Veuillez définir une ou plusieurs règles pour le filtre. Les filtres sont exécutés dans l\'ordre dans lequel ils apparaissent sur la gauche de l\'écran, et ce, jusqu\'à ce qu\'une action d\'arrêt des filtres soit exécutée.'; +$messages['sieveactexp'] = 'Veuillez définir une ou plusieurs actions ci-dessous. Ces actions seront exécutés pour chaque message qui correspondra au règles ci-dessus.'; +$messages['sieveheadershlp'] = 'Voici ci-dessous une liste d\'exemple d\'entête que vous pouvez utilisez dans votre règle. Sélectionnez-en une pour l\'ajouter à la règle ou entrez-en une manuellement dans le champs texte ci-dessous.'; +$messages['movingfilter'] = 'Déplacement du filtre...'; +$messages['noexistingfilters'] = 'Aucun filtre détecté!'; +$messages['importdefault'] = 'Utiliser les filtres par défaut : Il y a des filtres disponibles. Voulez-vous utiliser ces filtres ?'; +$messages['importother'] = 'Importer des filtres : Un autre set de filtres de %s a été trouvé. Voulez-vous importer ces filtres dans votre profil ?'; +$messages['switchtoadveditor'] = 'Changer pour l\'éditeur avancé vous permet de modifier le fichier sieve directement. Tout changement ici peut le rendre illisible pour l\'édteur normal et peut être perdu quand les filtres sont enregistré avec l\'édteur normal. Voulez-vous continuer ?'; +$messages['filterimported'] = 'Importation des filtres effectuée.'; +$messages['filterimporterror'] = 'Impossible d\'importer les filtres. Une erreur serveur a eu lieu'; +$messages['notifyinvalidmethod'] = 'La méthode ne semble pas être écrite dans un format valide, elle doit être une URI. Par exemple : \'mailto:alert@exemple.com\''; +$messages['nobodycontentpart'] = 'Veuillez entrer un contenu à tester'; +$messages['badoperator'] = 'Désolé, l\'opérateur que vous avez sélectionner ne peut pas être utilisé pour cette règle'; +$messages['filteractionerror'] = 'L\'action demandée n\'est pas supportée par le serveur'; +$messages['filtermissingerror'] = 'Impossible de trouver la règle demandée'; +$messages['contentpartexp'] = 'Le MIME-type our la partie spécifique du message qui doit être testé. Par exemple : `message/rfc822`, `text/html`, `audio/mp3` ou `image`.'; +$messages['delrulesetconf'] = 'Êtes vous sûr de vouloir effacer ce groupe de règles ?'; +$messages['rulesetexists'] = 'Un groupe de règles porte déjà ce nom. Veuillez en choisir un autre.'; +$messages['copyexisting'] = 'Copie d\'un groupe de règles éxistant : Voulez vous copier les filtres d\'un groupe de règles éxistant dans le groupe courant ?'; +$messages['filtercopied'] = 'Filtre copié avec succès'; +$messages['nosieverulesets'] = 'Aucun groupe de règles trouvé.'; +$messages['baddateformat'] = 'Erreur: Veuillez entrer une date sous la forme AAAA-MM-JJ'; +$messages['badtimeformat'] = 'Erreur: Veuillez entrer une heure sous la forme HH:MM:SS'; + +?> \ No newline at end of file diff --git a/plugins/sieverules/localization/hu_HU.inc b/plugins/sieverules/localization/hu_HU.inc new file mode 100644 index 000000000..21addfbcf --- /dev/null +++ b/plugins/sieverules/localization/hu_HU.inc @@ -0,0 +1,171 @@ +
Pédául: Ha János üzenetet küld Hétfőn és az időszak 7, válaszul kap egy Irodán kívül üzenetet ami nem lesz neki újraküldve a következő Hétfőig, bármennyi üzenetet is küld János ebben az időszakban.'; +$messages['vachandleexp'] = 'A mutató arra használható, hogy összekapcsoljon külömböző Irodán kívül üzeneteket. Ha egy ilyen üzenet el lett küldve, másik ilyen mutatóju üzenet nem lesz elküldve megadott időszakban'; +$messages['vactoexp'] = 'A többi címzett listája akiknek az automatikus válasz el lesz küldve. Ha egy címzett nem a fő cím én nincs ebben a listában, nem lesz neki üzenet küldve.'; +$messages['vactoexp_adv'] = 'Több álnevet vesszővel (,) lehet elválasztani. Pl. teszt1@pelda.hu, teszt2@pelda.hu, teszt3@pelda.hu'; +$messages['vactoexp_err'] = 'Hiba! Több álnév esetén vesszőt (,) kell használni'; +$messages['norulename'] = 'Irjon be egy nevet a szűrőnek'; +$messages['ruleexists'] = 'Ez a szűrőnév már létezik. Kérem irjon be másikat'; +$messages['noheader'] = 'Kérem irja be a fejléc nevét a teszthez'; +$messages['headerbadchars'] = 'Hiba: A fejléc illegális karaktert tartalmaz'; +$messages['noheadervalue'] = 'Kérem irjon be egy értéket a fejléc teszteléséhez'; +$messages['sizewrongformat'] = 'Hiba: az üzenet mérete szám kell legyen'; +$messages['noredirect'] = 'Kérem irjon be egy e-mail címet az átirányításhoz'; +$messages['redirectaddresserror'] = 'Hiba: A cím nem megfelelő'; +$messages['noreject'] = 'Írja be az üzenetet amit válaszolni szeretne a visszadobott üzenetre'; +$messages['vacnodays'] = 'Írja be a napok számát arra az időszakra mig az üzenet nem lesz újraküldve ugyanannak a címzettnek'; +$messages['vacdayswrongformat'] = 'Hiba: az időszak 1-nél nagyobb vagy egyenlő lehet'; +$messages['vacnomsg'] = 'Írja be az üzenet szövegét'; +$messages['notifynomethod'] = 'Írja be a módszert, melyel az értesitést eloküldjük'; +$messages['notifynomsg'] = 'Írja be az üzenet szövegét'; +$messages['sieveruleexp'] = 'Kérem határozzon meg egy vagy több szabályt mellyel az üzenetek szelve lesznek. A szűrők olyan sorrendben futnak le, ahogyan megjelennek a baloldalon. Ha egy szűrőnek megfelel az üzenet, több szűrő nem hajtodik végre.'; +$messages['sieveactexp'] = 'Kérem válasszon a következő lehetőségekből. ezek minden üzenetnre végrehajtódnak, melyek megfelelnek a szabálynak.'; +$messages['sieveheadershlp'] = 'Alább néhány példa más fejlécre melyek tesztelhetőek a szűrőkkel. Válassza ki a fejlécet, adja hozzá a szűrőhőz vagy írjon be egyénit az alábbi szövegmezőbe.'; +$messages['movingfilter'] = 'Szűrő áthelyezése...'; +$messages['noexistingfilters'] = 'Nem találhatók szűrők'; +$messages['importdefault'] = 'Alapértelmezett szűrők használata: Alapértelmezett szűrők léteznek. Szeretné használni ezeket a szűrőket?'; +$messages['importother'] = 'Szűrők importálása: Egy másik szűrőcsoport %s től létezik. Be szeretné tölteni ezt a szűrőcsoportot?'; +$messages['switchtoadveditor'] = 'ÿtváltás halado szerkesztőre, mellyel Ön direktbe szerkesztheti a sieve fájlt. Az itt végzett változtatások nem lesznek olvashatóak a norlál szerkesztöben és elvesznek ha a szűrők mentésre kerülnek a normál szerkesztőben. Szeretné folytatni?'; +$messages['filterimported'] = 'A szűrő sikeresen importálva'; +$messages['filterimporterror'] = 'Nem sikerült a szűrő importálása. Szerver hiba'; +$messages['filteractionerror'] = 'A kért műveletet nem támogatja a szerver'; +$messages['filtermissingerror'] = 'Nem találom a keresett szabályt'; +$messages['delrulesetconf'] = 'Biztosan törölni szeretné ezt a szabálycsoportot?'; +$messages['rulesetexists'] = 'Már létezik ilyen nevű szabálycsoport. Írjon be másikat!'; +$messages['filtercopied'] = 'Szűrő sikeresen átmásolva'; +$messages['nosieverulesets'] = 'Nincs ilyen szabálycsoport.'; +$messages['baddateformat'] = 'Hiba: a dátumot ÉÉÉÉ-HH-NN formátumban kell megadni.'; +$messages['badtimeformat'] = 'Hiba: az időt ÓÓ:PP:MP fromátumban kell megadni'; +$messages['missingfoldername'] = 'Hiba! Írjon be egy mappanevet.'; + +?> \ No newline at end of file diff --git a/plugins/sieverules/localization/it_IT.inc b/plugins/sieverules/localization/it_IT.inc new file mode 100644 index 000000000..a5a7bc484 --- /dev/null +++ b/plugins/sieverules/localization/it_IT.inc @@ -0,0 +1,202 @@ +
Per esempio: Se Marco ti scrive una email lunedì e il periodo è impostato a 7, Marco riceverà un messaggio di assenza lunedì ma non ne riceverà altri fino al lunedì successivo, indipendentemente dal n. di email che invia durante la settimana.'; +$messages['vachandleexp'] = 'Un handle può essere usato per collegare diversi messaggi di assenza insieme, una volta che un messaggio è stato inviato nessun altro con lo stesso handle sarà rispedito in quel periodo.'; +$messages['vactoexp'] = 'Lista degli indirizzi dei destinatari aggiuntivi che sono inclusi nella risposta automatica. Se un destinatario non è il tuo indirizzo principale e non è in questa lista, nessun messaggio sarà inviato.'; +$messages['vactoexp_adv'] = 'Separare i diversi indirizzi con una virgola. Per esempio: test1@example.com,test2@example.com,test3@example.com'; +$messages['vactoexp_err'] = 'Errore: i diversi indirizzi devono essere separati da virgole'; +$messages['norulename'] = 'Inserire un nome per il filtro'; +$messages['ruleexists'] = 'Un filtro con questo nome esiste già. Per favore scegline un altro.'; +$messages['noheader'] = 'Inserire il nome dell\'intestazione da testare'; +$messages['headerbadchars'] = 'Errore: L\'intestazione contiene caratteri proibiti'; +$messages['noheadervalue'] = 'Inserire un valore con cui testare l\'intestazione'; +$messages['sizewrongformat'] = 'Errore: Le dimensioni del messaggio devono essere espresse in formato numerico'; +$messages['noredirect'] = 'Inserire un indirizzo email a cui reindirizzare i messaggi'; +$messages['redirectaddresserror'] = 'Errore: L\'indirizzo non è valido'; +$messages['noreject'] = 'Inserire un messaggio da inviare con le email respinte'; +$messages['vacnodays'] = 'Inserire il numero di giorni per il periodo in cui il messaggio non sarà reinviato alla stessa persona'; +$messages['vacdayswrongformat'] = 'Errore: Il periodo deve essere un numero maggiore o uguale a 1'; +$messages['vacnomsg'] = 'Inserire un testo per il messaggio'; +$messages['notifynomethod'] = 'Inserire un metodo con cui la notifica dovrà essere inviata'; +$messages['notifynomsg'] = 'Inserire un testo per il messaggio'; +$messages['sieveruleexp'] = 'Definire una o più regole con cui ogni messaggio sarà testato. I filtri sono lanciati nell\'ordine in cui essi appaiono nella sinistra della schermata. Se una regola viene soddisfatta nessun altro filtro viene valutato.'; +$messages['sieveruleexp_stop'] = 'Definire una o più regole con le quali testare i messaggi. I filtri sono lanciati nell\'ordine in cui appaiono nella sinistra della schermata fintanto che non viene eseguita un\'azione di \'Stop\'.'; +$messages['sieveactexp'] = 'Selezionare una delle opzioni. Queste azioni saranno eseguite per ogni messaggio che soddiferà le regole qui sopra.'; +$messages['sieveheadershlp'] = 'Questi sono alcuni esempi di intestazioni che possono essere testate dal filtro. Scegliere un\'intestazione per aggiungerla alla regola, o scriverne una personalizzata nella casella qui sopra.'; +$messages['movingfilter'] = 'Sto spostando il filtro...'; +$messages['noexistingfilters'] = 'Nessun filtro esistente rilevato!'; +$messages['importdefault'] = 'Usa i filtri predefiniti: C\'è un set predefinito di filtri disponibile. Vuoi usare questi filtri?'; +$messages['importother'] = 'Importa filtri: è stato trovato un altro set di filtri da %s. Vuoi importare questi filtri nel tuo set corrente?'; +$messages['switchtoadveditor'] = 'Passare all\'editor avanzato ti consente di editare il \'file sieve\' direttamente. Ogni cambiamento qui potrà risultare illeggibile nell\'editor normale e può essere perso quando i filtri sono salvati usando l\'editor normale. Vuoi continuare?'; +$messages['filterimported'] = 'Filtro importato con successo'; +$messages['filterimporterror'] = 'Impossibile importare il filtro. Errore del server.'; +$messages['notifyinvalidmethod'] = 'Il metodo non sembra essere scritto in un formato valido, deve essere un URI, per esempio: `mailto:alert@example.com`.'; +$messages['nobodycontentpart'] = 'Inserire una parte di contenuto da testare'; +$messages['badoperator'] = 'Spiacente, l\'operatore che hai selezionato non può essere usato in questa regola'; +$messages['filteractionerror'] = 'L\'azione che hai richiesto non è supportata dal server'; +$messages['filtermissingerror'] = 'Impossibile trovare la regola richiesta'; +$messages['contentpartexp'] = 'Il MIME-type o la parte specifica del messaggio che dovrebbe essere testato. Per esempio: `message/rfc822`, `text/html`, `audio/mp3` o `image`.'; +$messages['delrulesetconf'] = 'Sei sicuro di voler cancellare questo set di regole?'; +$messages['rulesetexists'] = 'Un set di regole con questo nome esiste già. Inseriscine un altro.'; +$messages['copyexisting'] = 'Copia del set di regole: Vuoi copiare i filtri dal set di regole esistente nel set corrente?'; +$messages['filtercopied'] = 'Filtro copiato con successo'; +$messages['nosieverulesets'] = 'Nessun set di regole trovato.'; +$messages['baddateformat'] = 'Errore: Inserire la data nel formato YYYY-MM-DD'; +$messages['badtimeformat'] = 'Errore: Inserire l\'ora nel formato HH:MM:SS'; +$messages['missingfoldername'] = 'Errore: Per favore inserisci il nome di una cartella'; +$messages['eheadernoname'] = 'Errore: Per favore inserisci il nome di un header'; +$messages['eheadernoval'] = 'Errore: Per favore inserisci il contenuto di un header'; + +?> \ No newline at end of file diff --git a/plugins/sieverules/localization/nl_NL.inc b/plugins/sieverules/localization/nl_NL.inc new file mode 100644 index 000000000..ccdeeb7c4 --- /dev/null +++ b/plugins/sieverules/localization/nl_NL.inc @@ -0,0 +1,205 @@ +
Voorbeeld: Als Jan u op maandag emailt en de periode is op 7 ingesteld dan zal Jan op maandag een afwezigheidsbericht ontvangen, maar geen andere tot de daaropvolgende maandag, ongeacht het aantal emails welke hij gedurende de week verstuurt.'; +$messages['vachandleexp'] = 'Een reactienaam of handle kan verschillende afwezigheidsberichten groeperen, zodat er binnen een periode slechts een enkel afwezigheidsbericht met dezelfde reactienaam wordt verstuurd.'; +$messages['vactoexp'] = 'Lijst van extra adressen welke bij een afwezigsheidmelding gebruikt worden. Meldingen worden alleen verzonden als het bericht aan het standaard adres of een adres in deze lijst gericht is.'; +$messages['vactoexp_adv'] = 'Scheid meerdere aliases met een komma (,). Bijvoorbeeld: test1@example.com,test2@example.com,test3@example.com'; +$messages['vactoexp_err'] = 'Fout: Meerdere aliases moeten met een komma (,) worden gescheiden'; +$messages['norulename'] = 'Vul een naam in voor dit filter'; +$messages['ruleexists'] = 'Deze naam is al in gebruik voor een ander filter, voer a.u.b. een andere in'; +$messages['noheader'] = 'Vul een naam voor de kop in om te testen'; +$messages['headerbadchars'] = 'Fout: de kop bevat ongeldige tekens'; +$messages['noheadervalue'] = 'Vul een waarde in om met de kop te testen'; +$messages['sizewrongformat'] = 'Fout: berichtgrootte is niet numeriek'; +$messages['noredirect'] = 'Vul een e-mailadres in om berichten naar door te sturen'; +$messages['redirectaddresserror'] = 'Fout: ongeldig e-mailadres'; +$messages['noreject'] = 'Vul een bericht in om mee te zenden met geweigerde e-mail'; +$messages['vacnodays'] = 'Vul het aantal dagen in voor de periode waarin het bericht niet opnieuw naar dezelfde persoon wordt verzonden'; +$messages['vacdayswrongformat'] = '\'Fout: De periode moet groter dan of gelijk aan 1 zijn'; +$messages['vacnomsg'] = 'Vul tekst in voor uw bericht'; +$messages['notifynomethod'] = 'Kies een verzendmethode voor de notificatie'; +$messages['notifynomsg'] = 'Vul tekst in voor uw melding'; +$messages['sieveruleexp'] = 'Maak een of meer regels waaraan een bericht moet voldoen. Filters worden uitgevoerd in de volgorde zoals deze links op het scherm zijn te zien. Als aan een regel wordt voldaan dan worden eventuele volgende regels genegeerd.'; +$messages['sieveruleexp_stop'] = 'Maak een of meer regels waaraan een bericht moet voldoen. Filters worden uitgevoerd in de volgorde zoals deze links op het scherm zijn te zien totdat een \'Stop\' aktie optreedt'; +$messages['sieveactexp'] = '\'Maak een keuze uit onderstaande opties. Deze acties worden uitgevoerd voor elk bericht dat aan bovenstaande regels voldoet.'; +$messages['sieveheadershlp'] = 'Hieronder staan voorbeelden van andere koppen die kunnen worden getest door de filters. Kies een kop om toe te voegen aan de regel of vul een kop in in het invoerveld.'; +$messages['movingfilter'] = 'Bezig met filter verplaatsen...'; +$messages['noexistingfilters'] = 'Geen bestaande filters gevonden!'; +$messages['importdefault'] = '\'Gebruik standaardfilters: Er is een set van standaardfilters beschikbaar. Wilt u deze filters gebruiken?'; +$messages['importother'] = 'Import filters: Er is een andere set filters van %s gevonden. Wilt u deze filters in uw huidige set importeren?'; +$messages['switchtoadveditor'] = 'U kunt het \'Sieve\' bestand rechtstreeks wijzigen via de geavanceerde editor. Veranderingen zijn mogelijk onleesbaar in de standaardeditor en kunnen verloren gaan als filters via de standaardeditor worden opgeslagen. Wilt u doorgaan?'; +$messages['filterimported'] = 'Filter succesvol geimporteerd'; +$messages['filterimporterror'] = 'Kan filter niet importeren. Er is een fout opgetreden.'; +$messages['notifyinvalidmethod'] = 'De methode is in een ongeldig formaat (URI) geschreven. Voorbeeld: `mailto:alert@example.com`.'; +$messages['nobodycontentpart'] = 'Vul een inhoudsgedeelte in om te testen'; +$messages['badoperator'] = 'De gekozen operator kan niet in deze regel worden gebruikt'; +$messages['filteractionerror'] = 'De server ondersteund deze actie niet'; +$messages['filtermissingerror'] = 'Regel niet gevonden'; +$messages['contentpartexp'] = 'Het MIME-type of specifiek gedeelte van het bericht welke getest moet worden. Bijvoorbeeld: `message/rfc822`, `text/html`, `audio/mp3` or `image`.'; +$messages['delrulesetconf'] = 'Weet u zeker dat u deze regelset wilt verwijderen?'; +$messages['rulesetexists'] = 'Er is al een regelset met deze naam, voer a.u.b. een andere in'; +$messages['copyexisting'] = 'Bestaande regelset kopieëren: Wilt u filters van een bestaande regelset naar u huidige regelset kopieëren?'; +$messages['filtercopied'] = 'Filter succesvol gekopieerd'; +$messages['nosieverulesets'] = 'Geen regelsets gevonden.'; +$messages['baddateformat'] = 'Fout: Vul de datum in het JJJJ-MM-DD in'; +$messages['badtimeformat'] = 'Fout: Vul de tijd in het format UU:MM:SS in'; +$messages['missingfoldername'] = 'Fout: Vul een mapnaam in'; +$messages['eheadernoname'] = 'Fout: Vul een header naam in'; +$messages['eheadernoval'] = 'Fout: Vul een header waarde in'; + +?> \ No newline at end of file diff --git a/plugins/sieverules/localization/pl_PL.inc b/plugins/sieverules/localization/pl_PL.inc new file mode 100644 index 000000000..4f1de93f8 --- /dev/null +++ b/plugins/sieverules/localization/pl_PL.inc @@ -0,0 +1,205 @@ + \ No newline at end of file diff --git a/plugins/sieverules/localization/pt_BR.inc b/plugins/sieverules/localization/pt_BR.inc new file mode 100644 index 000000000..1cf68551a --- /dev/null +++ b/plugins/sieverules/localization/pt_BR.inc @@ -0,0 +1,183 @@ +
Por exemplo: Se João lhe enviar e-mails na segunda-feira e o período estiver definido para 7 dias, João irá receber uma mensagem de Fora do Escritório na segunda-feira, mas não irá receber mais nenhuma até à segunda-feira seguinte, não importando quantos e-mails ele lhe envie durante a semana.'; +$messages['vachandleexp'] = 'Um identificador pode ser usado para ligar as diferentes mensagens de Fora do Escritório em conjunto, uma vez que uma mensagem foi enviada nenhuma outra com o mesmo identificador será enviada.'; +$messages['vactoexp'] = 'Lista de endereços de destinatários adicionais que estão incluídos na resposta automática. Se um destinatário de e-mail não for seu endereço principal e não estiver nesta lista, nenhuma mensagem será enviada.'; +$messages['norulename'] = 'Por favor, indique um nome para este filtro'; +$messages['ruleexists'] = 'Já existe um filtro com este nome. Por favor, indique outro'; +$messages['noheader'] = 'Por favor, indique o nome do cabeçalho para testar'; +$messages['headerbadchars'] = 'Erro: O cabeçalho contém caracteres proibidos'; +$messages['noheadervalue'] = 'Por favor indique um valor para testar o cabeçalho contra'; +$messages['sizewrongformat'] = 'Erro: O tamanho da mensagem deve ser numérico'; +$messages['noredirect'] = 'Indique um endereço de e-mail para redirecionar as mensagens'; +$messages['redirectaddresserror'] = 'Erro: O endereço de e-mail parece ser inválido'; +$messages['noreject'] = 'Indique uma mensagem para enviar juntamente com o e-mail rejeitado'; +$messages['vacnodays'] = 'Por favor insira um número de dias para o período em que a mensagem não será reenviado para a mesma pessoa'; +$messages['vacdayswrongformat'] = 'Erro: O período deve ser um número maior ou igual a 1'; +$messages['vacnomsg'] = 'Insira o texto para a sua mensagem'; +$messages['notifynomethod'] = 'Por favor, indique um método pelo qual a notificação deve ser enviada'; +$messages['notifynomsg'] = 'Insira o texto para a sua mensagem'; +$messages['sieveruleexp'] = 'Por favor, defina uma ou mais regras sobre as quais cada mensagem será testada. Os filtros são executados na ordem em que aparecem à esquerda da tela, se for encontrada uma correspondência mais nenhum filtro será testado.'; +$messages['sieveruleexp_stop'] = 'Por favor, defina uma ou mais regras sobre as quais cada mensagem será testada. Os filtros são executados na ordem em que aparecem à esquerda da tela até uma ação de \'Stop\' ser encontrada.'; +$messages['sieveactexp'] = 'Por favor, selecione uma das opções abaixo. Essas ações serão realizadas para qualquer mensagem correspondente à(s) regra(s) acima.'; +$messages['sieveheadershlp'] = 'Abaixo estão alguns exemplos de outros cabeçalhos que podem ser testados pelos filtros. Selecione um cabeçalho para adicioná-lo à regra, ou introduza um personalizado na caixa acima.'; +$messages['movingfilter'] = 'Movendo filtro...'; +$messages['noexistingfilters'] = 'Não foi detectado nenhum filtro existente!'; +$messages['importdefault'] = 'Usar filtros predefinidos: Há um conjunto de filtros predefinidos disponíveis. Gostaria de usar esses filtros?'; +$messages['importother'] = 'Importação de filtros:Foi encontrado outro conjunto de filtros de %s. Gostaria de importar esses filtros para o seu conjunto actual?'; +$messages['switchtoadveditor'] = 'Mudando para o editor avançado é possível editar o arquivo Sieve diretamente. Quaisquer alterações aqui efetuadas podem ser ilegíveis no editor normal e podem ser perdidas quando os filtros são guardados usando o editor normal. Deseja continuar?'; +$messages['filterimported'] = 'Filtro importado com sucesso'; +$messages['filterimporterror'] = 'Não foi possível importar o filtro. Ocorreu um erro no servidor.'; +$messages['notifyinvalidmethod'] = 'O método parece não estar escrito num formato válido, ele deve ser uma URL. Por exemplo: "mailto: alert@example.com».'; +$messages['nobodycontentpart'] = 'Por favor, indique uma parte de conteúdo para testar'; +$messages['badoperator'] = 'O operador seleccionado não pode ser usado nesta regra'; +$messages['filteractionerror'] = 'A ação solicitada não é suportada pelo servidor'; +$messages['filtermissingerror'] = 'Não foi possível encontrar a regra solicitada'; +$messages['contentpartexp'] = 'O tipo de MIME ou parte específica da mensagem que deve ser testado. Por exemplo: `text/html`, `audio/mp3` or `image`.'; +$messages['delrulesetconf'] = 'Tem certeza que quer eliminar este conjunto de regras?'; +$messages['rulesetexists'] = 'Um conjunto de regras com este nome já existe. Por favor, indique outro nome'; +$messages['copyexisting'] = 'Copiar conjunto de regras existente:Gostaria de copiar os filtros de um conjunto de de regras existente para o seu conjunto actual?'; +$messages['filtercopied'] = 'Filtro copiado com sucesso'; +$messages['nosieverulesets'] = 'Nenhum conjunto de regras encontrado.'; +$messages['baddateformat'] = 'Erro: Indique a data no formato AAAA-MM-DD'; +$messages['badtimeformat'] = 'Erro: Indique a hora no formato HH:MM:SS'; + +?> \ No newline at end of file diff --git a/plugins/sieverules/localization/pt_PT.inc b/plugins/sieverules/localization/pt_PT.inc new file mode 100644 index 000000000..5b3dffc24 --- /dev/null +++ b/plugins/sieverules/localization/pt_PT.inc @@ -0,0 +1,183 @@ +
Por exemplo: Se o João lhe enviar e-mails na segunda-feira e o período está definido para 7 dias, o João irá receber uma mensagem de Fora do Escritório na segunda-feira, mas não irá receber mais nenhuma até à segunda-feira seguinte, não importa quantos e-mails ele lhe envie durante a semana.'; +$messages['vachandleexp'] = 'Um identificador pode ser usado para ligar as diferentes mensagens de Fora do Escritório em conjunto, uma vez que uma mensagem for enviada nenhuma outra mensagem com o mesmo identificador será enviada no mesmo período.'; +$messages['vactoexp'] = 'Lista de endereços de destinatários adicionais que estão incluídos na resposta automática. Se um destinatário de e-mail não é o seu endereço principal e não está nesta lista, nenhuma mensagem será enviada.'; +$messages['norulename'] = 'Por favor, indique um nome para este filtro'; +$messages['ruleexists'] = 'Já existe um filtro com este nome. Por favor, indique outro'; +$messages['noheader'] = 'Por favor, indique o nome do cabeçalho para testar'; +$messages['headerbadchars'] = 'Erro: O cabeçalho contém caracteres proibidos'; +$messages['noheadervalue'] = 'Por favor indique um valor para testar o cabeçalho contra'; +$messages['sizewrongformat'] = 'Erro: O tamanho da mensagem deve ser numérico'; +$messages['noredirect'] = 'Indique um endereço de e-mail para redirecionar as mensagens'; +$messages['redirectaddresserror'] = 'Erro: O endereço de e-mail parece ser inválido'; +$messages['noreject'] = 'Indique uma mensagem para enviar juntamente com o e-mail rejeitado'; +$messages['vacnodays'] = 'Por favor insira um número de dias para o período em que a mensagem não será reenviado para a mesma pessoa'; +$messages['vacdayswrongformat'] = 'Erro: O período deve ser um número maior ou igual a 1'; +$messages['vacnomsg'] = 'Insira o texto para a sua mensagem'; +$messages['notifynomethod'] = 'Por favor, indique um método pelo qual a notificação deve ser enviada'; +$messages['notifynomsg'] = 'Insira o texto para a sua mensagem'; +$messages['sieveruleexp'] = 'Por favor, defina uma ou mais regras sobre as quais cada mensagem será testada. Os filtros são executados na ordem em que aparecem à esquerda do ecrã, se for encontrada uma correspondência mais nenhum filtro será testado.'; +$messages['sieveruleexp_stop'] = 'Por favor, defina uma ou mais regras sobre as quais cada mensagem será testada. Os filtros são executados na ordem em que aparecem à esquerda do ecrã até uma acção de \'Stop\' ser encontrada.'; +$messages['sieveactexp'] = 'Por favor, seleccione uma das opções abaixo. Essas acções serão realizadas para qualquer mensagem correspondente à(s) regra(s) acima.'; +$messages['sieveheadershlp'] = 'Abaixo estão alguns exemplos de outros cabeçalhos que podem ser testados pelos filtros. Selecione um cabeçalho para adicioná-lo à regra, ou introduza um personalizado na caixa acima.'; +$messages['movingfilter'] = 'A mover filtro...'; +$messages['noexistingfilters'] = 'Não foi detectado nenhum filtro existente!'; +$messages['importdefault'] = 'Usar filtros predefinidos: Há um conjunto de filtros predefinidos disponíveis. Gostaria de usar esses filtros?'; +$messages['importother'] = 'Importação de filtros:Foi encontrado outro conjunto de filtros de %s. Gostaria de importar esses filtros para o seu conjunto actual?'; +$messages['switchtoadveditor'] = 'Mudando para o editor avançado permite editar o ficheiro Sieve directamente. Quaisquer alterações aqui efectuadas podem ser ilegíveis no editor normal e podem ser perdidas quando os filtros são guardados usando o editor normal. Deseja continuar?'; +$messages['filterimported'] = 'Filtro importado com sucesso'; +$messages['filterimporterror'] = 'Não foi possível importar o filtro. Ocorreu um erro no servidor.'; +$messages['notifyinvalidmethod'] = 'O método parece não estar escrito num formato válido, ele deve ser um URL. Por exemplo: "mailto: alert@example.com».'; +$messages['nobodycontentpart'] = 'Por favor, indique uma parte de conteúdo para testar'; +$messages['badoperator'] = 'O operador seleccionado não pode ser usado nesta regra'; +$messages['filteractionerror'] = 'A acção solicitada não é suportada pelo servidor'; +$messages['filtermissingerror'] = 'Não foi possível encontrar a regra solicitada'; +$messages['contentpartexp'] = 'O tipo de MIME ou parte específica da mensagem que deve ser testado. Por exemplo: `text/html`, `audio/mp3` or `image`.'; +$messages['delrulesetconf'] = 'Tem certeza que quer eliminar este conjunto de regras?'; +$messages['rulesetexists'] = 'Um conjunto de regras com este nome já existe. Por favor, indique outro nome'; +$messages['copyexisting'] = 'Copiar conjunto de regras existente:Gostaria de copiar os filtros de um conjunto de de regras existente para o seu conjunto actual?'; +$messages['filtercopied'] = 'Filtro copiado com sucesso'; +$messages['nosieverulesets'] = 'Nenhum conjunto de regras encontrado.'; +$messages['baddateformat'] = 'Erro: Indique a data no formato AAAA-MM-DD'; +$messages['badtimeformat'] = 'Erro: Indique a hora no formato HH:MM:SS'; + +?> \ No newline at end of file diff --git a/plugins/sieverules/localization/ro_RO.inc b/plugins/sieverules/localization/ro_RO.inc new file mode 100644 index 000000000..f8dce4c02 --- /dev/null +++ b/plugins/sieverules/localization/ro_RO.inc @@ -0,0 +1,175 @@ +
De exemplu: Dacă Ion iţi trimite un email luni şi perioada este setată la 7 zile, atunci Ion va primi un mesaj OUT of OFFICE luni însă nu va mai primi niciunul pana lunea următoare indiferent de câte mesaje îţi va trimite.'; +$messages['vachandleexp'] = 'Poate fi folosită o regulă pentru a lega mesaje OUT of OFFICE împreună. Odată trimis un mesaj, nu va mai fi trimis niciun mesaj cu aceeasi regulă.'; +$messages['vactoexp'] = 'Lista adreselor de email aditionale care vor fi incluse in raspunsul automat. '; +$messages['norulename'] = 'Te rog sa introduci un nume pentru acest filtru.'; +$messages['ruleexists'] = 'Un filtru cu acest nume există deja. Te rog să introduci altul.'; +$messages['noheader'] = 'Te rog să introduci numele headerului pentru verificare.'; +$messages['headerbadchars'] = 'Eroare: Headerul conţine caractere ilegale.'; +$messages['noheadervalue'] = 'Te rog să introduci o valoare pentru a testa headerul.'; +$messages['sizewrongformat'] = 'Eroare: Mărimea mesajului trebuie să fie numerică .'; +$messages['noredirect'] = 'Te rog să introduci o adresă de email pentru a redirecţiona mesajele.'; +$messages['redirectaddresserror'] = 'Eroare: Adresa nu pare să fie validă.'; +$messages['noreject'] = 'Te rog să introduci un mesaj pentru a fi trimis impreună cu mesajul de respingere.'; +$messages['vacnodays'] = 'Te rog să introduci o perioadă de zile în care mesaju'; +$messages['vacdayswrongformat'] = 'Eroare: Perioada trebuie să fie un număr mai mare sau egal cu 1.'; +$messages['vacnomsg'] = 'Te rog să introduci un text pentru mesaj.'; +$messages['notifynomethod'] = 'Te rog să introduci o metodă prin care să se trimită notificarea.'; +$messages['notifynomsg'] = 'Te rog să introduci un text pentru mesaj.'; +$messages['sieveruleexp'] = 'Te rog să introduci una sau mai multe reguli prin care va fi testat fiecare mesaj. Filtrele sunt aplicate în ordinea în care apar în stânga ecranului. Dacă este găsită o potrivire, niciun alt filtru nu va mai fi testat.'; +$messages['sieveruleexp_stop'] = 'Te rog să introduci una sau mai multe reguli prin care va fi testat fiecare mesaj. Filtrele sunt aplicate în ordinea în care apar în stânga ecranului până câand este găsită o acţiune de stopare.'; +$messages['sieveactexp'] = 'Te rog sa selectezi una din opţiunile de mai jos. Aceste acţiuni vor fi efectuate pentru orice mesaj ce se potriveşte regulilor de mai jos.'; +$messages['sieveheadershlp'] = 'Mai jos aveţi exemple de alte headere ce pot fi testate de către filtre. Selectează un header pentru a-l adăuga la regulă sau introdu una proprie în câmpul de mai sus.'; +$messages['movingfilter'] = 'Se mută filtrul ...'; +$messages['noexistingfilters'] = 'Nici un filtru existent ...'; +$messages['importdefault'] = 'Foloseşte filtrele implicite:Există un set de filtre implicite. Doreşti să foloseşti aceste filtre?'; +$messages['importother'] = 'Importă filtre Un alt set de filtre de la %s a fost găsit. Doreşti să imporţi aceste filtre in setul tău curent?'; +$messages['switchtoadveditor'] = 'Trecerea la editorul avansat iti permite să editezi fişierul sieve direct. Orice modificare faci aici poate fi de nedescifrat in editorul normal si poate fi pierdută atunci când filtrele sunt salvate folosind editorul normal. Doreşti să continui?'; +$messages['filterimported'] = 'Filtrul importat cu succes?'; +$messages['filterimporterror'] = 'Imposibil de importat filtrul. Eroare de server.'; +$messages['notifyinvalidmethod'] = 'Metoda nu pare a fi scrisă într-un format valid, trebuie să fie un URL. De ex. `mailto:ion@exemplu.com`'; +$messages['nobodycontentpart'] = 'Te rog să introduci un conţinut de probă.'; +$messages['badoperator'] = 'Îmi pare rău, operatorul selectat nu poate fi folosit în această regulă.'; +$messages['filteractionerror'] = 'Acţiunea cerută nu este suportată de server.'; +$messages['filtermissingerror'] = 'Imposibil de găsit regula cerută.'; +$messages['contentpartexp'] = 'Tipul MIME-Type sau o parte specifica din mesajul ce trebuie testat. De ex. `message/rfc822`, `text/html`, `audio/mp3` sau `image`.'; +$messages['delrulesetconf'] = 'Eşti sigur că doreşti să ştergi acest set de reguli?'; +$messages['rulesetexists'] = 'Un set de reguli cu acest nume există deja. Introdu altul.'; +$messages['copyexisting'] = 'Copiază setul de reguli existent: Doreşti să copiezi filtrele dintr-un set de reguli existent in setul tău curent?'; +$messages['filtercopied'] = 'Filtrul copiat cu succes.'; +$messages['nosieverulesets'] = 'Niciun set de reguli găsit.'; + +?> \ No newline at end of file diff --git a/plugins/sieverules/localization/ru_RU.inc b/plugins/sieverules/localization/ru_RU.inc new file mode 100644 index 000000000..12aaeea53 --- /dev/null +++ b/plugins/sieverules/localization/ru_RU.inc @@ -0,0 +1,182 @@ +
Например: Если Вася написал вам письмо в понедельник и вы установили периодичность в 7 (дней), то Вася получит сообщение о Вашем отсутствии в понедельник, и больше не будет получать таких сообщений до следующего понедельника, даже если он писал вам много раз.'; +$messages['vachandleexp'] = 'Метка связывает несколько сообщений об отсутствии вместе: после того, как одно из них было отправлено, другие сообщения с той же меткой не будут отправляться в течение этого периода..'; +$messages['vactoexp'] = 'Список дополнительных адресов получателей, для которых будет работать "автоответчик". Ответы не будут отправляться, если адреса получателя принятого сообщения нет в этом списке.'; +$messages['vactoexp_adv'] = 'Несколько адресов разделяются запятой (,). Например, test1@example.com,test2@example.com,test3@example.com.'; +$messages['vactoexp_err'] = 'Ошибка: Несколько ардесов должны быть разделены запятыми.'; +$messages['norulename'] = 'Пожалуйста, введите имя для этого фильтра.'; +$messages['ruleexists'] = 'Фильтр с таким именем уже существует. Введите другое имя фильтра.'; +$messages['noheader'] = 'Пожалуйста, введите имя заголовка для проверки.'; +$messages['headerbadchars'] = 'Ошибка: указанная строка содержит запрещенные символы.'; +$messages['noheadervalue'] = 'Пожалуйста, введите значение для проверки заголовка.'; +$messages['sizewrongformat'] = 'Ошибка: размер сообщения должен быть числовым.'; +$messages['noredirect'] = 'Пожалуйста, введите адрес электронной почты для перенаправки сообщения.'; +$messages['redirectaddresserror'] = 'Ошибка: введен неверный адрес.'; +$messages['noreject'] = 'Пожалуйста, введите текст сообщения.'; +$messages['vacnodays'] = 'Пожалуйста, укажите периодичность отсылки уведомлений'; +$messages['vacdayswrongformat'] = 'Ошибка: Периодичность должна быть положительным целым числом'; +$messages['vacnomsg'] = 'Пожалуйста, введите текст сообщения.'; +$messages['notifynomethod'] = 'Пожалуйста, введите способ отправки уведомления.'; +$messages['notifynomsg'] = 'Пожалуйста, введите текст сообщения.'; +$messages['sieveruleexp'] = 'Пожалуйста, введите одно или несколько правил, согласно которым будут проверяться сообщения. Фильтры работают в том порядке, в котором они появляются слева. Если соответствие найдено, остальные фильтры тестироваться не будут.'; +$messages['sieveactexp'] = 'Пожалуйста, выберите одно или несколько действий. Эти действия будут выполняться для каждого сообщения, соответствующего вышеуказанным правилам.'; +$messages['sieveheadershlp'] = 'Ниже находятся несколько примеров заголовков, которые могут быть проверены фильтрами. Выберите заголовок, чтобы добавить его, либо введите другой в поле ввода.'; +$messages['movingfilter'] = 'Перемещение фильтра...'; +$messages['noexistingfilters'] = 'Фильтров не найдено!'; +$messages['importdefault'] = 'Фильтры по умолчанию: Доступен набор фильтров по умолчанию. Использовать?'; +$messages['importother'] = 'Импорт фильтров: Найден набор фильтров от приложения %s. Импортировать?'; +$messages['switchtoadveditor'] = 'Переключение в режим расширенного редактора позволяет редактировать исходный текст сценария \'sieve\'. Изменения, сделанные в этом режиме, могут не восприниматься графическим интерфейсом, и могут быть потеряны в случае сохранения фильтров в графическом интерфейсе. Продолжить?'; +$messages['filterimported'] = 'Фильтр успешно импортирован'; +$messages['filterimporterror'] = 'Ошибка сервера во время импорта фильтра. Импорт не выполнен'; +$messages['notifyinvalidmethod'] = 'Формат метода неверен. Нужно указать URI, например: «mailto:alert@example.com».'; +$messages['nobodycontentpart'] = 'Укажите часть тела сообщения'; +$messages['badoperator'] = 'Такой оператор не может использоваться в данном правиле'; +$messages['filteractionerror'] = 'Запрошенное действие не поддерживается сервером'; +$messages['filtermissingerror'] = 'Указанное правило не существует'; +$messages['contentpartexp'] = 'MIME-тип или часть сообщения для проверки. Например, «message/rfc822», «text/html», «audio/mp3» или «image».'; +$messages['delrulesetconf'] = 'Действительно удалить этот набор правил?'; +$messages['rulesetexists'] = 'Набор правил с таким названием уже существует. Выберите другое название.'; +$messages['copyexisting'] = 'Копирование существующего набора правил: Скопировать фильтры из существующего набора правил в текущий набор?'; +$messages['filtercopied'] = 'Фильтры успешно скопированы'; +$messages['nosieverulesets'] = 'Наборы правил не найдены.'; +$messages['baddateformat'] = 'Ошибка: Дата должна вводиться в формате ГГГГ-ММ-ДД'; +$messages['badtimeformat'] = 'Ошибка: Время должно вводиться в формате ЧЧ:ММ:СС'; + +?> \ No newline at end of file diff --git a/plugins/sieverules/localization/sk_SK.inc b/plugins/sieverules/localization/sk_SK.inc new file mode 100644 index 000000000..420ffbb88 --- /dev/null +++ b/plugins/sieverules/localization/sk_SK.inc @@ -0,0 +1,159 @@ +Použiť pripravené pravidlá: Je dostupných niekoľko pravidiel. Chcete ich použiť?'; +$messages['importother'] = 'Importovať pravidlá: Ďalšia sada pravidiel bola nájdená v %s. Chcete ich importovať?'; +$messages['switchtoadveditor'] = 'Prepnutie do pokročilého editora Vám umožní priamo editovať súbor pravidel. Úpravy, ktoré tu urobíte môžu byť pre štandardný editor pravidiel nečitateľné a môžu sa pri uložení v ňom stratiť. Chcete pokračovať?'; +$messages['filterimported'] = 'Pravidlá boli úspešne importované'; +$messages['filterimporterror'] = 'Pravidlá nebolo možné importovať. Vyskytla sa chyba servera'; +$messages['notifyinvalidmethod'] = 'Vyzerá to, že metóda nie je zapísaná v platnom formáte. Musí to byť URI. Napr.: `mailto:adresa@domena.sk`.'; +$messages['nobodycontentpart'] = 'Zadajte prosím obsahovú časť testu'; +$messages['badoperator'] = 'Prepáčte, ale operátor ktorý ste vybrali nemôže byť v tejto podmienke použitý'; +$messages['filteractionerror'] = 'Akcia, ktorú ste vybrali nie je podporovaná serverom'; +$messages['filtermissingerror'] = 'Nepodarilo sa nájsť požadovanú podmienku'; +$messages['contentpartexp'] = 'Typ MIME, alebo špecifická časť správy, ktorá má byť testovaná. Napr.: `message/rfc822`, `text/html`, `audio/mp3` či `image`.'; + +?> \ No newline at end of file diff --git a/plugins/sieverules/localization/sl_SI.inc b/plugins/sieverules/localization/sl_SI.inc new file mode 100644 index 000000000..16bc1851d --- /dev/null +++ b/plugins/sieverules/localization/sl_SI.inc @@ -0,0 +1,185 @@ +
Npr.: če Janez pošlje sporočilo v ponedeljek, in je ponovitev nastavljena na 7, potem bo dobil odgovor v ponedeljek, še enega pa ne bo dobil pred naslednjim ponedeljkom, ne glede na to, koliko sporočil bo poslal vmes.'; +$messages['vachandleexp'] = 'Z vzdevkom se lahko med seboj poveže več različnih samodejnih odgovorov - ko je bil samodejni odgovor z nekim vzdevkom poslan, ne bo v tej ponovitvi poslano noben drug odgovor z istim vzdevkom.'; +$messages['vactoexp'] = 'Seznam dodatnih naslovov prejemnikov, ki bodo vključeni pri samodejnem odgovarjanju. Če naslova prejemnika sporočila ni na tem seznamu, samodejni odgovor na sporočilo ne bo poslan.'; +$messages['vactoexp_adv'] = 'Naslove ločite z vejicami. Primer: naslov1@example.com,naslov2@example.org,naslov3@example.com'; +$messages['vactoexp_err'] = 'Napaka: naslovi morajo biti ločeni z vejicami (,)'; +$messages['norulename'] = 'Vnesite ime pravila'; +$messages['ruleexists'] = 'Pravilo s tem imenom že obstaja. Vnesite drugo ime'; +$messages['noheader'] = 'Vnesite ime polja'; +$messages['headerbadchars'] = 'Napaka: polje vsebuje nedovoljene znake'; +$messages['noheadervalue'] = 'Vnesite vrednost, s katero se preizkuša polje'; +$messages['sizewrongformat'] = 'Napaka: velikost sporočila mora biti število'; +$messages['noredirect'] = 'Vnestie e-poštni naslov, na katerega naj se preusmeri sporočilo'; +$messages['redirectaddresserror'] = 'Napaka: naslov ni videti veljaven'; +$messages['noreject'] = 'Vnesite sporočilo, ki naj se pošlje z zavrnitvijo'; +$messages['vacnodays'] = 'Vnesite število dni, po preteku katerih se bo samodejni odgovor ponovil'; +$messages['vacdayswrongformat'] = 'Napaka: ponovitev mora biti večja ali enaka 1'; +$messages['vacnomsg'] = 'Vnesite besedilo sporočila'; +$messages['notifynomethod'] = 'Vnesite metodo, s katero naj bo poslano sporočilo'; +$messages['notifynomsg'] = 'Vnesite besedilo sporočila'; +$messages['sieveruleexp'] = 'Pripravite enega ali več pogojev, pod katerimi bo to pravilo uveljavljeno. Pravila se izvajajo v vrstnem redu, po katerem so razvrščena na seznamu na levi strani. Če sporočilo ustreza pogojem, se nadaljna pravila ne bodo izvedla.'; +$messages['sieveruleexp_stop'] = 'Pripravite enega ali več pogojev, pod katerimi bo to pravilo uveljavljeno. Pravila se izvajajo v vrstnem redu, po katerem so razvrščena na seznamu na levi strani, in se izvajajo do dejanja ›Prenehaj‹.'; +$messages['sieveactexp'] = 'Izberite eno od spodnjih možnosti. Ta dejanja se bodo izvedla za vsako sporočilo, ki ustreza zgornjim pravilom.'; +$messages['sieveheadershlp'] = 'Spodaj je nekaj primerov drugih polj, ki jih lahko preizkušajo pravila. Izberite polje s seznama, ali pa vnesite poljubno polje.'; +$messages['movingfilter'] = 'Premikam pravilo...'; +$messages['noexistingfilters'] = 'Obstoječa pravila niso bila zaznana!'; +$messages['importdefault'] = 'Uporabi privzeta pravila: na voljo so privzeta pravila. Ali jih želite uvoziti?'; +$messages['importother'] = 'Uvozi filtre: Najdena je bila druga zbirka pravil %s. Ali želite uvoziti ta pravila v trenutno zbirko?'; +$messages['switchtoadveditor'] = 'Preklop v napredni urejevalnik omogoča neposredno urejanje datoteke sieve. Sprememb, ki jih naredite v naprednem urejevalniku, običajni urejevalnik morda ne bo razumel, in se lahko izgubijo, če pravila shranite z običajnim urejevalnikom. Ali želite nadaljevati?'; +$messages['filterimported'] = 'Pravilo uspešno uvoženo'; +$messages['filterimporterror'] = 'Pravila ni bilo mogoče uvoziti. Prišlo je do napake strežnika'; +$messages['notifyinvalidmethod'] = 'Metoda mora biti zapisana v URI formatu, npr.: ›mailto:alert@example.com‹.'; +$messages['nobodycontentpart'] = 'Vnesite del vsebine za preizkus'; +$messages['badoperator'] = 'Izbranega operaterja ne morete uporabiti s tem pravilom'; +$messages['filteractionerror'] = 'Strežnik ne podpira željenega dejanja'; +$messages['filtermissingerror'] = 'Željenega pravila ni bilo mogoče najti'; +$messages['contentpartexp'] = 'MIME vrsta ali specifičen del sporočila, ki naj se testira. Npr.: ›message/rfc822‹, ›text/html‹, ›audio/mp3‹ ali ›image‹.'; +$messages['delrulesetconf'] = 'Ali ste prepričani, da želite izbrisati izbrano zbirko?'; +$messages['rulesetexists'] = 'Zbirka s tem imenom že obstaja. Vnesite drugo ime'; +$messages['copyexisting'] = 'Kopiraj obstoječo zbirko: Ali želite kopirati pravila iz obstoječe zbirke v trenutno?'; +$messages['filtercopied'] = 'Pravilo uspešno prekopirano'; +$messages['nosieverulesets'] = 'Ni zbirk.'; +$messages['baddateformat'] = 'Napaka: vnesite datum v obliki LLLL-MM-DD'; +$messages['badtimeformat'] = 'Napaka: vnesite čas v obliki UU:MM:SS'; + +?> \ No newline at end of file diff --git a/plugins/sieverules/localization/sv_SE.inc b/plugins/sieverules/localization/sv_SE.inc new file mode 100644 index 000000000..2aa2d4e03 --- /dev/null +++ b/plugins/sieverules/localization/sv_SE.inc @@ -0,0 +1,159 @@ +
Exempel: Om Joe mailar dig på måndag och antalet dagar är 7 kommer han att få ett frånvaromeddelande på måndag, men sedan får han inget nytt förrän nästa måndag oavsett hur många gånger han mailar dig under veckan.'; +$messages['vachandleexp'] = 'Ett id kan använndas för att länka samman flera frånvaromeddelanden. När ett frånvaromeddelande med detta id har skickats kommer inga fler att frånvaromeddelanden med samma id att skickas under perioden.'; +$messages['vactoexp'] = 'Frånvaromeddelandet skickas enbart till din huvudsakliga adress + de adresser du valt i listan ovan. Har du fler mottagaradresser du vill kunna välja bland måste du först lägga till dessa under Profiler.'; +$messages['norulename'] = 'Fyll i ett namn på detta filter.'; +$messages['ruleexists'] = 'Ett filter med det valda namnet finns redan. Vänligen fyll i ett annat namn.'; +$messages['noheader'] = 'Fyll i namnet på brevhuvudet'; +$messages['headerbadchars'] = 'Fel: Brevhuvudet innehåller otillåtna tecken'; +$messages['noheadervalue'] = 'Fyll i ett värde som brevhuvudet ska testas mot'; +$messages['sizewrongformat'] = 'Fel: Meddelandestorlek måste anges i siffror'; +$messages['noredirect'] = 'Fyll i en e-postadress att omdirigera meddelanden till'; +$messages['redirectaddresserror'] = 'Fel: e-postadressen har inte giltigt format'; +$messages['noreject'] = 'Fyll i ett meddelande som ska skickas med brev som avvisas'; +$messages['vacnodays'] = 'Fyll i antalet dagar för den period under vilken meddelandet inte kommer att skickas på nytt till samma person'; +$messages['vacdayswrongformat'] = 'Fel: Antalet dagar måste vara ett tal större än eller lika med 1'; +$messages['vacnomsg'] = 'Fyll i text som ska skickas i frånvaromeddelandet'; +$messages['notifynomethod'] = 'Fyll i med vilken metod notifieringen ska skickas'; +$messages['notifynomsg'] = 'Fyll i en notifieringstext'; +$messages['sieveruleexp'] = 'Definiera en eller flera regler som varje meddelande kommer att testas mot. Filter körs i den ordning de listas till vänster.'; +$messages['sieveactexp'] = 'Välj bland alternativen nedan. Dessa åtgärder kommer att utföras varje gång ett meddelande matchar reglerna ovan.'; +$messages['sieveheadershlp'] = 'Detta är några exempel på andra brevhuvudet som filtren kan testa. Välj ett brevhuvud för att lägga till det till regeln eller fyll i ett eget brevhuvud.'; +$messages['movingfilter'] = 'Flyttar filter...'; +$messages['noexistingfilters'] = 'Hittar inga existerande filter!'; +$messages['importdefault'] = 'Använd standardfilter: Det finns en uppsättning standardfilter tillgängliga. Skulle du vilja använda dem?'; +$messages['importother'] = 'Importera filter: En annan uppsättning filter från %s har upptäckts. Skulle du vilja importera dem till din nuvarande filteruppsättning?'; +$messages['switchtoadveditor'] = 'Med den avancerade editorn kan du redigera din filterfil direkt. Ändringar gjorda där kan gå förlorade om du senare redigerar dina filter via den vanliga filterredigeringen. Vill du fortsätta?'; +$messages['filterimported'] = 'Importen av filter lyckades'; +$messages['filterimporterror'] = 'Importen av filter misslyckades. Ett serverfel uppstod.'; +$messages['notifyinvalidmethod'] = 'Den angivna metoden har inte ett giltigt format, det måste vara en URI. Exempel: `mailto:alert@example.com`.'; +$messages['nobodycontentpart'] = 'Fyll i vilken del av innehållet som ska testas'; +$messages['badoperator'] = 'Den valda operatorn kan inte användas i den här regeln'; +$messages['filteractionerror'] = 'Den valda åtgärden stöds inte av servern'; +$messages['filtermissingerror'] = 'Kan inte hitta den önskade regeln'; +$messages['contentpartexp'] = 'Fyll i MIME-typ eller specifik del av meddelandet som ska testas. Exempel: `message/rfc822`, `text/html`, `audio/mp3`'; + +?> \ No newline at end of file diff --git a/plugins/sieverules/localization/zh_TW.inc b/plugins/sieverules/localization/zh_TW.inc new file mode 100644 index 000000000..4f63b1e70 --- /dev/null +++ b/plugins/sieverules/localization/zh_TW.inc @@ -0,0 +1,192 @@ +
For example: If Joe emails you on Monday and the period is set to 7 then Joe will receive an out of office message on Monday but will not get another one until the following Monday, no matter how many emails he sends an email during the week.'; +$messages['vachandleexp'] = 'A handle can be used to link different out of office messages together, once one message has been sent no other message with the same handle will be resent in that period.'; +$messages['vactoexp'] = 'List of additional recipient addresses which are included in the auto replying. If a mail\'s recipient is not your main address and it\'s not on this list, no message will be sent.'; +$messages['vactoexp_adv'] = 'Separate multiple aliases with a comma (,). For Example: test1@example.com,test2@example.com,test3@example.com'; +$messages['vactoexp_err'] = 'Error: Multiple aliases should be separated with a comma (,)'; +$messages['norulename'] = '請輸入規則名稱'; +$messages['ruleexists'] = '重複的規則名稱。請重新輸入'; +$messages['noheader'] = 'Please enter the name of the header to test'; +$messages['headerbadchars'] = 'Error: Header contains forbidden characters'; +$messages['noheadervalue'] = 'Please enter a value to test the header against'; +$messages['sizewrongformat'] = '錯誤: 郵件大小必須是數字'; +$messages['noredirect'] = '請輸入一個電子郵件位址以便轉寄訊息'; +$messages['redirectaddresserror'] = 'Error: Address appears invalid'; +$messages['noreject'] = 'Please enter a message to send with rejected email'; +$messages['vacnodays'] = 'Please enter a number of days for the period in which the message will not be resent to the same person'; +$messages['vacdayswrongformat'] = 'Error: The period must be a number greater than or equal to 1'; +$messages['vacnomsg'] = 'Please enter some text for your message'; +$messages['notifynomethod'] = 'Please enter a method by which the notification should be sent'; +$messages['notifynomsg'] = 'Please enter some text for your message'; +$messages['sieveruleexp'] = '請定義一個或多個規則條件。每封信都會依照左側列表,採由上而下的順序比對規則條件,如果符合其中一個規則,後續的郵件規則將不被執行。'; +$messages['sieveruleexp_stop'] = 'Please define one or more rules against which each message will be tested. Filters are run in the order in which they appear on the left of this screen until a \'Stop\' action is met.'; +$messages['sieveactexp'] = '請從選單中選擇項目,這些動作將會套用在符合上述規則條件的郵件。'; +$messages['sieveheadershlp'] = 'Below are some examples of other headers that can be tested by the filters. Select a header to add it to the rule or enter a custom one in the box above.'; +$messages['movingfilter'] = '移動郵件規則...'; +$messages['noexistingfilters'] = 'No existing filters detected!'; +$messages['importdefault'] = 'Use default filters: There is a set of default filters available. Would you like to use these filters?'; +$messages['importother'] = 'Import filters: Another set of filters from %s has been found. Would you like to import these filters into your current set?'; +$messages['switchtoadveditor'] = 'Switching to the advanced editor allows you to edit the sieve file directly. Any changes here may be unreadable in the normal editor and may be lost when filters are saved using the normal editor. Do you wish to continue?'; +$messages['filterimported'] = 'Filter imported successfully'; +$messages['filterimporterror'] = '無法匯入郵件規則。(伺服器錯誤)'; +$messages['notifyinvalidmethod'] = 'The method does not appear to be written in a valid format, it must be a URI. For example: `mailto:alert@example.com`.'; +$messages['nobodycontentpart'] = 'Please enter a content part to test'; +$messages['badoperator'] = 'Sorry the operator you selected cannot be used in this rule'; +$messages['filteractionerror'] = 'The action you requested is not supported by the server'; +$messages['filtermissingerror'] = 'Unable to find the rule requested'; +$messages['contentpartexp'] = 'The MIME-type or specific part of the message which should be tested. For example: `message/rfc822`, `text/html`, `audio/mp3` or `image`.'; +$messages['delrulesetconf'] = 'Are you sure you want to delete this ruleset?'; +$messages['rulesetexists'] = 'A ruleset with this name already exists. Please enter another'; +$messages['copyexisting'] = 'Copy exiting ruleset: Would you like to copy filters from an existing ruleset into your current set?'; +$messages['filtercopied'] = 'Filter copied successfully'; +$messages['nosieverulesets'] = 'No rulesets found.'; +$messages['baddateformat'] = 'Error: Please enter the date in the format YYYY-MM-DD'; +$messages['badtimeformat'] = 'Error: Please enter the time in the format HH:MM:SS'; +$messages['missingfoldername'] = '錯誤: 請輸入資料夾名稱'; + +?> \ No newline at end of file diff --git a/plugins/sieverules/package.xml b/plugins/sieverules/package.xml new file mode 100644 index 000000000..1ca73d3f8 --- /dev/null +++ b/plugins/sieverules/package.xml @@ -0,0 +1,116 @@ + + + sieverules + http://github.com/JohnDoh/Roundcube-Plugin-SieveRules-Managesieve/ + Control sieve filter settings from within Roundcube + Adds a 'Filters' tab to the 'Personal Settings' to allow the user to manage their Sieve mail rules. Uses the Managesieve protocol. Predefined rules created for the user to select. + + Philip Weir + JohnDoh + roundcube@tehinterweb.co.uk + yes + + 2013-02-24 + + + 1.18 + 1.18 + + + stable + stable + + GNU GPLv3+ + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5.2.1 + + + 1.7.0 + + + jqueryui + http://trac.roundcube.net/browser/trunk/plugins/jqueryui/ + 1.8.14 + + + + + diff --git a/plugins/sieverules/sieverules.js b/plugins/sieverules/sieverules.js new file mode 100644 index 000000000..5ec505869 --- /dev/null +++ b/plugins/sieverules/sieverules.js @@ -0,0 +1,1480 @@ +/** + * SieveRules plugin script + */ + +rcube_webmail.prototype.sieverules_select = function(list) { + if (rcmail.sieverules_examples) rcmail.sieverules_examples.clear_selection(); + var id; + + if (this.sieverules_timer) + clearTimeout(rcmail.sieverules_timer); + + if (id = list.get_single_selection()) + rcmail.sieverules_timer = window.setTimeout(function() { rcmail.sieverules_load(id, 'plugin.sieverules.edit'); }, 200); +} + +rcube_webmail.prototype.sieverules_keypress = function(list) { + if (list.key_pressed == list.DELETE_KEY) + rcmail.command('plugin.sieverules.delete'); + else if (list.key_pressed == list.BACKSPACE_KEY) + rcmail.command('plugin.sieverules.delete'); +} + +rcube_webmail.prototype.sieverules_ex_select = function(list) { + rcmail.sieverules_list.clear_selection(); + if (list.multi_selecting) + return false; + + if (this.sieverules_timer) + clearTimeout(this.sieverules_timer); + + var id; + if (id = list.get_single_selection()) + rcmail.sieverules_timer = window.setTimeout(function() { rcmail.sieverules_load(id, 'plugin.sieverules.add'); }, 200); +} + +rcube_webmail.prototype.sieverules_mouse_up = function(e) { + if (rcmail.sieverules_list) { + if (!rcube_mouse_is_over(e, rcmail.sieverules_list.list)) + rcmail.sieverules_list.blur(); + } + + if (rcmail.sieverules_examples) { + if (!rcube_mouse_is_over(e, rcmail.sieverules_examples.list)) + rcmail.sieverules_examples.blur(); + } + + // handle mouse release when dragging + if (rcmail.sieverules_ex_drag_active && rcmail.sieverules_list && rcmail.env.sieverules_last_target) { + rcmail.command('plugin.sieverules.import_ex'); + rcmail.sieverules_examples.draglayer.hide(); + } + else if (rcmail.sieverules_drag_active && rcmail.sieverules_list && rcmail.env.sieverules_last_target) { + var _src = rcmail.sieverules_list.get_single_selection(); + + if (rcmail.env.sieverules_last_target == 'end') { + var _dst = rcmail.sieverules_list.rows.length; + $(rcmail.gui_objects.sieverules_list).children('tbody').children('tr:last').removeClass('droptargetend'); + } + else { + var _dst = rcmail.env.sieverules_last_target.substr(6); + $('#' + rcmail.env.sieverules_last_target).removeClass('droptarget'); + } + + rcmail.command('plugin.sieverules.move', { source:_src, dest:_dst }); + rcmail.sieverules_list.draglayer.hide(); + } +}; + +rcube_webmail.prototype.sieverules_ex_drag_start = function(list) { + rcmail.sieverules_ex_drag_active = true; + rcmail.sieverules_list.drag_active = true; + rcmail.sieverules_drag_start(list); +}; + +rcube_webmail.prototype.sieverules_drag_start = function(list) { + rcmail.sieverules_drag_active = true; + + if (this.sieverules_timer) + clearTimeout(this.sieverules_timer); + + if (rcmail.gui_objects.sieverules_list) { + rcmail.initialBodyScrollTop = bw.ie ? 0 : window.pageYOffset; + rcmail.initialListScrollTop = rcmail.gui_objects.sieverules_list.parentNode.scrollTop; + + var pos, list, rulesTable; + list = $(rcmail.gui_objects.sieverules_list.parentNode); + pos = list.offset(); + rcmail.env.sieveruleslist_coords = { x1:pos.left, y1:pos.top, x2:pos.left + list.width(), y2:pos.top + list.height() }; + + rows = rcmail.sieverules_list.rows; + rcmail.env.sieverules_coords = new Array(); + for (var i = 0; i < rows.length; i++) { + pos = $('#' + rows[i].id).offset(); + rcmail.env.sieverules_coords[rows[i].id] = { x1:pos.left, y1:pos.top, x2:pos.left + $('#' + rows[i].id).width(), y2:pos.top + $('#' + rows[i].id).height(), on:0 }; + } + } +}; + +rcube_webmail.prototype.sieverules_drag_move = function(e) { + if (rcmail.gui_objects.sieverules_list && rcmail.env.sieveruleslist_coords) { + // offsets to compensate for scrolling while dragging a message + var boffset = bw.ie ? -document.documentElement.scrollTop : rcmail.initialBodyScrollTop; + var moffset = rcmail.initialListScrollTop-rcmail.gui_objects.sieverules_list.parentNode.scrollTop; + var toffset = -moffset-boffset; + + var li, pos, mouse; + mouse = rcube_event.get_mouse_pos(e); + pos = rcmail.env.sieveruleslist_coords; + mouse.y += toffset; + + // if mouse pointer is outside of folderlist + if (mouse.x < pos.x1 || mouse.x >= pos.x2 || mouse.y < pos.y1 || mouse.y >= pos.y2) { + $(rcmail.gui_objects.sieverules_list).children('tbody').children('tr:last').removeClass('droptargetend'); + rcmail.env.sieverules_last_target = null; + } + else { + $(rcmail.gui_objects.sieverules_list).children('tbody').children('tr:last').addClass('droptargetend'); + rcmail.env.sieverules_last_target = 'end'; + } + + // over the folders + for (var k in rcmail.env.sieverules_coords) { + pos = rcmail.env.sieverules_coords[k]; + if (mouse.x >= pos.x1 && mouse.x < pos.x2 && mouse.y >= pos.y1 && mouse.y < pos.y2) { + $(rcmail.gui_objects.sieverules_list).children('tbody').children('tr:last').removeClass('droptargetend'); + $('#' + k).addClass('droptarget'); + rcmail.env.sieverules_last_target = k; + rcmail.env.sieverules_coords[k].on = 1; + } + else if (pos.on) { + $('#' + k).removeClass('droptarget'); + rcmail.env.sieverules_last_target = null; + rcmail.env.sieverules_coords[k].on = 0; + } + } + } +}; + +rcube_webmail.prototype.sieverules_drag_end = function(e) { + rcmail.sieverules_drag_active = false; + rcmail.sieverules_ex_drag_active = false; + rcmail.env.sieverules_last_target = null; + + // over the rules + if (rcmail.gui_objects.sieverules_list && rcmail.env.sieverules_coords) { + for (var k in rcmail.env.sieverules_coords) { + if (rcmail.env.sieverules_coords[k].on) { + $('#' + k).removeClass('droptarget'); + } + } + } + + $(rcmail.gui_objects.sieverules_list).children('tbody').children('tr:last').removeClass('droptargetend'); +}; + +rcube_webmail.prototype.sieverules_load = function(id, action) { + if (action == 'plugin.sieverules.edit' && (!id || id == rcmail.env.iid)) + return false; + + var add_url = ''; + var target = window; + if (rcmail.env.contentframe && window.frames && window.frames[rcmail.env.contentframe]) { + add_url = '&_framed=1'; + target = window.frames[rcmail.env.contentframe]; + rcube_find_object(rcmail.env.contentframe).style.visibility = 'inherit'; + } + + if (action && (id || action == 'plugin.sieverules.add')) { + rcmail.set_busy(true); + target.location.href = rcmail.env.comm_path+'&_action='+action+'&_iid='+id+add_url; + } + + return true; +} + +rcube_webmail.prototype.sieverules_ready = function(id) { + if (id.substring(0, 2) != 'ex') + rcmail.enable_command('plugin.sieverules.delete', true); + + if (rcmail.sieverules_examples) + rcmail.sieverules_examples.clear_selection(); + + rcmail.sieverules_list.highlight_row(id); + rcmail.env.iid = id; + + return true; +} + +rcube_webmail.prototype.sieverules_update_list = function(action, param1, param2, param3, param4) { + var sid = rcmail.sieverules_list.get_single_selection(); + var selection; + var rows = rcmail.sieverules_list.rows; + var rules = Array(); + + switch(action) { + case 'add-first': + rcmail.sieverules_list.clear(); + case 'add': + if (rows.length == 1 && rows[0].obj.cells[0].innerHTML == rcmail.gettext('loading','')) + rcmail.sieverules_list.remove_row(0); + + var newrow = document.createElement('tr'); + + if (param1 == -1) { + var cell = document.createElement('td'); + cell.setAttribute('colspan', '2'); + cell.appendChild(document.createTextNode(param2)); + newrow.appendChild(cell); + } + else { + newrow.id = param1; + var cell = document.createElement('td'); + cell.appendChild(document.createTextNode(param2)); + newrow.appendChild(cell); + + cell = document.createElement('td'); + cell.className = 'control'; + + param3 = param3.replace(/\\'/g, '\''); + param4 = param4.replace(/\\'/g, '\''); + + cell.innerHTML = param3 + param4; + newrow.appendChild(cell); + } + + rcmail.sieverules_list.insert_row(newrow); + break; + case 'update': + rows[param1].obj.cells[0].innerHTML = param2; + break; + case 'delete': + rcmail.sieverules_list.clear_selection(); + sid = null; + case 'reload': + rcmail.sieverules_list.clear(); + + var newrow = document.createElement('tr'); + var cell = document.createElement('td'); + cell.setAttribute('colspan', '2'); + cell.appendChild(document.createTextNode(rcmail.gettext('loading',''))); + newrow.appendChild(cell); + rcmail.sieverules_list.insert_row(newrow); + + rcmail.http_request('plugin.sieverules.update_list', '', false); + break; + case 'move': + // create array of rules + for (var i = 0; i < rows.length; i++) { + rules[i] = rows[i].obj.cells[0].innerHTML; + + if (sid == i) selection = rules[i]; + } + + // assign order + rules.splice(param2, 0, rules[param1]); + + if (parseInt(param1) < parseInt(param2)) + rules.splice(param1, 1); + else + rules.splice(parseInt(param1) + 1, 1); + + // update table + for (var i = 0; i < rows.length; i++) { + rows[i].obj.cells[0].innerHTML = rules[i]; + + if (rules[i] == selection) sid = i; + } + + var target = window; + if (rcmail.env.contentframe && window.frames && window.frames[rcmail.env.contentframe]) + target = window.frames[rcmail.env.contentframe]; + + // update iid of rule being editied + var iid; + if (target.rcube_find_object && (iid = target.rcube_find_object('_iid'))) { + if (iid.value != param1 && iid.value != "") { + if (iid.value > param1 && iid.value < param2) { + sid = parseInt(iid.value) - 1; + rcmail.sieverules_list.highlight_row(sid); + rcmail.sieverules_list.select_row(sid); + iid.value = sid; + target.rcmail.env.iid = sid; + } + else if (iid.value < param1 && iid.value > param2) { + sid = parseInt(iid.value) + 1; + rcmail.sieverules_list.highlight_row(sid); + rcmail.sieverules_list.select_row(sid); + iid.value = sid; + target.rcmail.env.iid = sid; + } + else { + rcmail.sieverules_list.select_row(iid.value); + } + } + else if (iid.value != "") { + rcmail.sieverules_list.highlight_row(sid); + rcmail.sieverules_list.select_row(sid); + iid.value = sid; + target.rcmail.env.iid = sid; + } + } + else if (sid) { + rcmail.sieverules_list.highlight_row(sid); + rcmail.sieverules_list.select_row(sid); + } + + break; + } +} + +rcube_webmail.prototype.sieverules_rule_join_radio = function(value) { + var rulesTable = rcube_find_object('rules-table'); + + if (rulesTable.tBodies[0].rows.length == 3) + rcmail.command('plugin.sieverules.add_rule','', rulesTable.tBodies[0].rows[0]); + + rulesTable.style.display = (value == 'any' ? 'none' : ''); +} + +rcube_webmail.prototype.sieverules_header_select = function(sel) { + var idx = sel.parentNode.parentNode.rowIndex / 3; + var eidx = ((idx + 1) * 3) - 1; + var obj = document.getElementsByName('_selheader[]')[idx]; + var testType = obj.value.split('::')[0]; + var header = obj.value.split('::')[1]; + var selIdx = 0; + var target_obj = $("input[name='_target[]']")[idx]; + + document.getElementsByName('_test[]')[idx].value = testType; + document.getElementsByName('_header[]')[idx].value = header; + document.getElementsByName('_target[]')[idx].className = ''; + document.getElementsByName('_operator[]')[idx].selectedIndex = 0; + document.getElementsByName('_bodypart[]')[idx].style.display = 'none'; + document.getElementsByName('_datepart[]')[idx].style.display = 'none'; + document.getElementsByName('_weekday[]')[idx].style.display = 'none'; + $(target_obj).unmask(); + + if (header == 'size') { + document.getElementsByName('_header[]')[idx].style.visibility = 'hidden'; + document.getElementsByName('_headerhlp')[idx].style.visibility = 'hidden'; + document.getElementsByName('_operator[]')[idx].style.display = 'none'; + document.getElementsByName('_date_operator[]')[idx].style.display = 'none'; + document.getElementsByName('_spamtest_operator[]')[idx].style.display = 'none'; + document.getElementsByName('_spam_probability[]')[idx].style.display = 'none'; + document.getElementsByName('_virus_probability[]')[idx].style.display = 'none'; + document.getElementsByName('_size_operator[]')[idx].style.display = ''; + document.getElementsByName('_target[]')[idx].style.display = ''; + document.getElementsByName('_target[]')[idx].className = 'short'; + document.getElementsByName('_units[]')[idx].style.display = ''; + } + else if (header == 'spamtest') { + document.getElementsByName('_header[]')[idx].style.visibility = 'hidden'; + document.getElementsByName('_headerhlp')[idx].style.visibility = 'hidden'; + document.getElementsByName('_operator[]')[idx].style.display = 'none'; + document.getElementsByName('_size_operator[]')[idx].style.display = 'none'; + document.getElementsByName('_date_operator[]')[idx].style.display = 'none'; + document.getElementsByName('_spamtest_operator[]')[idx].style.display = ''; + document.getElementsByName('_spam_probability[]')[idx].style.display = ''; + document.getElementsByName('_virus_probability[]')[idx].style.display = 'none'; + document.getElementsByName('_target[]')[idx].style.display = 'none'; + document.getElementsByName('_target[]')[idx].value = document.getElementsByName('_spam_probability[]')[idx].value; + document.getElementsByName('_units[]')[idx].style.display = 'none'; + } + else if (header == 'virustest') { + document.getElementsByName('_header[]')[idx].style.visibility = 'hidden'; + document.getElementsByName('_headerhlp')[idx].style.visibility = 'hidden'; + document.getElementsByName('_operator[]')[idx].style.display = 'none'; + document.getElementsByName('_size_operator[]')[idx].style.display = 'none'; + document.getElementsByName('_date_operator[]')[idx].style.display = 'none'; + document.getElementsByName('_spamtest_operator[]')[idx].style.display = ''; + document.getElementsByName('_spam_probability[]')[idx].style.display = 'none'; + document.getElementsByName('_virus_probability[]')[idx].style.display = ''; + document.getElementsByName('_target[]')[idx].style.display = 'none'; + document.getElementsByName('_target[]')[idx].value = document.getElementsByName('_spam_probability[]')[idx].value; + document.getElementsByName('_units[]')[idx].style.display = 'none'; + } + else if (header.indexOf('predefined_') == 0) { + document.getElementsByName('_header[]')[idx].style.visibility = 'hidden'; + document.getElementsByName('_headerhlp')[idx].style.visibility = 'hidden'; + document.getElementsByName('_operator[]')[idx].style.display = 'none'; + document.getElementsByName('_size_operator[]')[idx].style.display = 'none'; + document.getElementsByName('_date_operator[]')[idx].style.display = 'none'; + document.getElementsByName('_spamtest_operator[]')[idx].style.display = 'none'; + document.getElementsByName('_spam_probability[]')[idx].style.display = 'none'; + document.getElementsByName('_virus_probability[]')[idx].style.display = 'none'; + document.getElementsByName('_target[]')[idx].style.display = 'none'; + document.getElementsByName('_units[]')[idx].style.display = 'none'; + + if (rcmail.env.predefined_rules[header.substring(11)][0] == 'size') { + document.getElementsByName('_header[]')[idx].value = 'size'; + selIdx = rcmail.sieverules_get_index(document.getElementsByName('_size_operator[]')[idx], rcmail.env.predefined_rules[header.substring(11)][2]); + document.getElementsByName('_size_operator[]')[idx].selectedIndex = selIdx; + var reg = new RegExp('^([0-9]+)(K|M)*$'); + var matches = reg.exec(rcmail.env.predefined_rules[header.substring(11)][3]); + document.getElementsByName('_target[]')[idx].value = matches[1]; + selIdx = rcmail.sieverules_get_index(document.getElementsByName('_units[]')[idx], matches[2]); + document.getElementsByName('_units[]')[idx].selectedIndex = selIdx; + } + else if (rcmail.env.predefined_rules[header.substring(11)][0] == 'spamtest') { + document.getElementsByName('_header[]')[idx].value = 'spamtest'; + selIdx = rcmail.sieverules_get_index(document.getElementsByName('_spamtest_operator[]')[idx], rcmail.env.predefined_rules[header.substring(11)][2]); + document.getElementsByName('_spamtest_operator[]')[idx].selectedIndex = selIdx; + document.getElementsByName('_spam_probability[]')[idx].value = rcmail.env.predefined_rules[header.substring(11)][3]; + } + else if (rcmail.env.predefined_rules[header.substring(11)][0] == 'virustest') { + document.getElementsByName('_header[]')[idx].value = 'virustest'; + selIdx = rcmail.sieverules_get_index(document.getElementsByName('_spamtest_operator[]')[idx], rcmail.env.predefined_rules[header.substring(11)][2]); + document.getElementsByName('_spamtest_operator[]')[idx].selectedIndex = selIdx; + document.getElementsByName('_virus_probability[]')[idx].value = rcmail.env.predefined_rules[header.substring(11)][3]; + } + else { + document.getElementsByName('_header[]')[idx].value = rcmail.env.predefined_rules[header.substring(11)][1]; + selIdx = rcmail.sieverules_get_index(document.getElementsByName('_operator[]')[idx], rcmail.env.predefined_rules[header.substring(11)][2], -1); + + // check advanced options if standard not found + if (selIdx == -1 && rcmail.sieverules_get_index(document.getElementsByName('_advoperator[]')[idx], rcmail.env.predefined_rules[header.substring(11)][2], -1) > -1) { + document.getElementsByName('_operator[]')[idx].selectedIndex = rcmail.sieverules_get_index(document.getElementsByName('_operator[]')[idx], 'advoptions'); + document.getElementsByName('_advoperator[]')[idx].selectedIndex = rcmail.sieverules_get_index(document.getElementsByName('_advoperator[]')[idx], rcmail.env.predefined_rules[header.substring(11)][2]); + document.getElementsByName('_comparator[]')[idx].selectedIndex = rcmail.sieverules_get_index(document.getElementsByName('_comparator[]')[idx], rcmail.env.predefined_rules[header.substring(11)][3]); + document.getElementsByName('_advtarget[]')[idx].value = rcmail.env.predefined_rules[header.substring(11)][4]; + } + else { + document.getElementsByName('_operator[]')[idx].selectedIndex = selIdx; + document.getElementsByName('_target[]')[idx].value = rcmail.env.predefined_rules[header.substring(11)][4]; + } + } + } + else { + document.getElementsByName('_operator[]')[idx].style.display = ''; + document.getElementsByName('_size_operator[]')[idx].style.display = 'none'; + document.getElementsByName('_spamtest_operator[]')[idx].style.display = 'none'; + document.getElementsByName('_spam_probability[]')[idx].style.display = 'none'; + document.getElementsByName('_virus_probability[]')[idx].style.display = 'none'; + document.getElementsByName('_date_operator[]')[idx].style.display = 'none'; + document.getElementsByName('_target[]')[idx].style.display = ''; + document.getElementsByName('_units[]')[idx].style.display = 'none'; + + if (header == 'other') { + document.getElementsByName('_header[]')[idx].style.visibility = 'visible'; + document.getElementsByName('_headerhlp')[idx].style.visibility = 'visible'; + document.getElementsByName('_header[]')[idx].value = ''; + } + else { + document.getElementsByName('_header[]')[idx].style.visibility = 'hidden'; + document.getElementsByName('_headerhlp')[idx].style.visibility = 'hidden'; + } + + if (header == 'body') { + document.getElementsByName('_header[]')[idx].style.display = 'none'; + document.getElementsByName('_headerhlp')[idx].style.display = 'none'; + document.getElementsByName('_bodypart[]')[idx].style.display = ''; + + document.getElementsByName('_body_contentpart[]')[idx].parentNode.parentNode.style.display = ''; + } + else if (testType == 'date') { + document.getElementsByName('_header[]')[idx].style.display = 'none'; + document.getElementsByName('_headerhlp')[idx].style.display = 'none'; + document.getElementsByName('_datepart[]')[idx].style.display = ''; + document.getElementsByName('_operator[]')[idx].style.display = 'none'; + document.getElementsByName('_date_operator[]')[idx].style.display = ''; + + document.getElementsByName('_datepart[]')[idx].selectedIndex = 0; + document.getElementsByName('_body_contentpart[]')[idx].parentNode.parentNode.style.display = 'none'; + $(target_obj).datepicker({ dateFormat: 'yy-mm-dd' }); + } + else { + document.getElementsByName('_header[]')[idx].style.display = ''; + document.getElementsByName('_headerhlp')[idx].style.display = ''; + + document.getElementsByName('_body_contentpart[]')[idx].parentNode.parentNode.style.display = 'none'; + } + } + + var idx = sel.parentNode.parentNode.rowIndex; + rcube_find_object('rules-table').tBodies[0].rows[idx + 1].style.display = 'none'; + rcube_find_object('rules-table').tBodies[0].rows[idx + 2].style.display = 'none'; +} + +rcube_webmail.prototype.sieverules_bodypart_select = function(sel) { + var idx = sel.parentNode.parentNode.rowIndex; + var eidx = idx / 3; + var obj = document.getElementsByName('_bodypart[]')[eidx]; + + document.getElementsByName('_body_contentpart[]')[eidx].disabled = false; + document.getElementsByName('_advoperator[]')[eidx].disabled = (document.getElementsByName('_operator[]')[eidx].value == 'advoptions') ? false : true; + + if (document.getElementsByName('_operator[]')[eidx].value == 'advoptions') + rcmail.sieverules_rule_advop_select(document.getElementsByName('_advoperator[]')[eidx]); + else + document.getElementsByName('_comparator[]')[eidx].disabled = true; + + document.getElementsByName('_advtarget[]')[eidx].disabled = (document.getElementsByName('_operator[]')[eidx].value == 'advoptions') ? false : true; + var advopts_row = rcube_find_object('rules-table').tBodies[0].rows[idx + 2]; + if (obj.value != 'content' && document.getElementsByName('_operator[]')[eidx].value == 'advoptions') + document.getElementsByName('_body_contentpart[]')[eidx].disabled = true; + else + advopts_row.style.display = (obj.value == 'content' ? '' : 'none'); +} + +rcube_webmail.prototype.sieverules_datepart_select = function(sel) { + var idx = sel.parentNode.parentNode.rowIndex; + var eidx = idx / 3; + var obj = document.getElementsByName('_datepart[]')[eidx]; + var opr = document.getElementsByName('_operator[]')[eidx]; + var target_obj = $("input[name='_target[]']")[eidx]; + $(target_obj).datepicker("destroy"); + $(target_obj).unmask(); + + if (obj.value == 'date') + $(target_obj).datepicker({ dateFormat: 'yy-mm-dd' }); + else if (obj.value == 'time') + $(target_obj).mask('99:99:99', {example: 'HH:MM:SS', placeholder: '0'}); + + document.getElementsByName('_advtarget[]')[eidx].style.display = (obj.value == 'weekday') ? 'none' : ''; + document.getElementsByName('_advweekday[]')[eidx].style.display = (obj.value == 'weekday') ? '' : 'none'; + if (opr.value != 'exists' && opr.value != 'notexists' && opr.value != 'advoptions') { + document.getElementsByName('_target[]')[eidx].style.display = (obj.value == 'weekday') ? 'none' : ''; + document.getElementsByName('_weekday[]')[eidx].style.display = (obj.value == 'weekday') ? '' : 'none'; + } +} + +rcube_webmail.prototype.sieverules_rule_op_select = function(sel) { + var idx = sel.parentNode.parentNode.rowIndex; + var eidx = idx / 3; + var datepart = document.getElementsByName('_datepart[]')[eidx].value; + + var obj = document.getElementsByName('_operator[]')[eidx]; + if (obj.value == 'exists' || obj.value == 'notexists' || obj.value == 'advoptions') { + document.getElementsByName('_target[]')[eidx].style.display = 'none'; + document.getElementsByName('_weekday[]')[eidx].style.display = 'none'; + } + else { + document.getElementsByName('_target[]')[eidx].style.display = (datepart == 'weekday') ? 'none' : ''; + document.getElementsByName('_weekday[]')[eidx].style.display = (datepart == 'weekday') ? '' : 'none'; + } + + if (obj.value != 'exists' && obj.value != 'notexists' && document.getElementsByName('_test[]')[eidx].value == 'exists') { + var h_obj = document.getElementsByName('_selheader[]')[eidx]; + var testType = h_obj.value.split('::')[0]; + + document.getElementsByName('_test[]')[eidx].value = testType; + } + + document.getElementsByName('_body_contentpart[]')[eidx].disabled = (document.getElementsByName('_bodypart[]')[eidx].value == 'content') ? false : true; + document.getElementsByName('_advoperator[]')[eidx].disabled = false; + rcmail.sieverules_rule_advop_select(document.getElementsByName('_advoperator[]')[eidx]); + document.getElementsByName('_advtarget[]')[eidx].disabled = false; + var advopts_row = rcube_find_object('rules-table').tBodies[0].rows[idx + 2]; + if (obj.value != 'advoptions' && document.getElementsByName('_bodypart[]')[eidx].value == 'content') { + document.getElementsByName('_advoperator[]')[eidx].disabled = true; + document.getElementsByName('_comparator[]')[eidx].disabled = true; + document.getElementsByName('_advtarget[]')[eidx].disabled = true; + } + else { + advopts_row.style.display = (obj.value == 'advoptions' ? '' : 'none'); + } + + return false; +} + +rcube_webmail.prototype.sieverules_rule_advop_select = function(sel) { + var obj = sel.parentNode.parentNode.parentNode.parentNode; + var idx = (obj.parentNode.parentNode.rowIndex - 2) / 3; + + if (sel.value.substring(0, 5) == 'count' || sel.value.substring(0, 5) == 'value') + document.getElementsByName('_comparator[]')[idx].disabled = false; + else + document.getElementsByName('_comparator[]')[idx].disabled = true; + + return false; +} + +rcube_webmail.prototype.sieverules_action_select = function(sel) { + var idx = sel.parentNode.parentNode.rowIndex; + var actoion_row = rcube_find_object('actions-table').tBodies[0].rows[idx]; + var obj = document.getElementsByName('_act[]')[idx]; + + // hide everything + document.getElementsByName('_folder[]')[idx].style.display = 'none'; + $(document.getElementsByName('_customfolder[]')[idx]).parent().hide(); + document.getElementsByName('_redirect[]')[idx].style.display = 'none'; + document.getElementsByName('_reject[]')[idx].style.display = 'none'; + document.getElementsByName('_imapflags[]')[idx].style.display = 'none'; + document.getElementsByName('_day[]')[idx].parentNode.parentNode.parentNode.parentNode.style.display = 'none'; + document.getElementsByName('_nmethod[]')[idx].parentNode.parentNode.parentNode.parentNode.style.display = 'none'; + document.getElementsByName('_eheadname[]')[idx].parentNode.parentNode.parentNode.parentNode.style.display = 'none'; + + if (obj.value == 'fileinto' || obj.value == 'fileinto_copy') + document.getElementsByName('_folder[]')[idx].style.display = ''; + else if (obj.value == 'reject' || obj.value == 'ereject') + document.getElementsByName('_reject[]')[idx].style.display = ''; + else if (obj.value == 'vacation') { + document.getElementsByName('_day[]')[idx].parentNode.parentNode.parentNode.parentNode.style.display = ''; + + if (rcmail.env.sieverules_htmleditor == 1) { + rowid = document.getElementsByName('_msg[]')[idx].id.replace('rcmfd_sievevacmag_', ''); + document.getElementById('rcmfd_sievevachtmlcb_' + rowid).checked = true; + rcmail.sieverules_toggle_vac_html(document.getElementById('rcmfd_sievevachtmlcb_' + rowid), rowid, 'rcmfd_sievevacmag_' + rowid); + } + + rcmail.enable_sig(document.getElementsByName('_vacfrom[]')[idx]); + } + else if (obj.value == 'notify' || obj.value == 'enotify') + document.getElementsByName('_nmethod[]')[idx].parentNode.parentNode.parentNode.parentNode.style.display = ''; + else if (obj.value == 'redirect' || obj.value == 'redirect_copy') + document.getElementsByName('_redirect[]')[idx].style.display = ''; + else if (obj.value == 'imapflags' || obj.value == 'imap4flags') + document.getElementsByName('_imapflags[]')[idx].style.display = ''; + else if (obj.value == 'editheaderadd' || obj.value == 'editheaderrem') { + document.getElementsByName('_eheadname[]')[idx].parentNode.parentNode.parentNode.parentNode.style.display = ''; + + if (obj.value == 'editheaderrem') { + document.getElementsByName('_eheadval[]')[idx].parentNode.parentNode.style.display = 'none'; + document.getElementsByName('_eheadaddlast[]')[idx].parentNode.parentNode.style.display = 'none'; + document.getElementsByName('_hadv_opts[]')[idx].parentNode.parentNode.style.display = ''; + } + else { + document.getElementsByName('_eheadval[]')[idx].parentNode.parentNode.style.display = ''; + document.getElementsByName('_eheadaddlast[]')[idx].parentNode.parentNode.style.display = ''; + document.getElementsByName('_eheadopp[]')[idx].parentNode.parentNode.style.display = 'none'; + document.getElementsByName('_eheadindex[]')[idx].parentNode.parentNode.style.display = 'none'; + document.getElementsByName('_hadv_opts[]')[idx].parentNode.parentNode.style.display = 'none'; + } + } + + if ($(document.getElementsByName('_folder[]')[idx]).is(':visible') && document.getElementsByName('_folder[]')[idx].value == '@@newfolder') + $(document.getElementsByName('_customfolder[]')[idx]).parent().show(); +} + +rcube_webmail.prototype.sieverules_select_folder = function(sel) { + var idx = sel.parentNode.parentNode.rowIndex; + var actoion_row = rcube_find_object('actions-table').tBodies[0].rows[idx]; + var obj = document.getElementsByName('_folder[]')[idx]; + + $(document.getElementsByName('_customfolder[]')[idx]).parent().hide(); + if (obj.value == '@@newfolder') + $(document.getElementsByName('_customfolder[]')[idx]).parent().show(); +} + +rcube_webmail.prototype.sieverules_xheaders = function(sel) { + var idx = sel.parentNode.parentNode.rowIndex + 1; + var xheader_row = rcube_find_object('rules-table').tBodies[0].rows[idx]; + xheader_row.style.display = (xheader_row.style.display == 'none' ? '' : 'none'); + return false; +} + +rcube_webmail.prototype.sieverules_set_xheader = function(sel) { + var obj = sel.parentNode.parentNode.parentNode.parentNode; + var idx = (obj.parentNode.parentNode.rowIndex - 1) / 3; + var headerBox = document.getElementsByName('_header[]')[idx]; + headerBox.value = sel.value; +} + +rcube_webmail.prototype.sieverules_get_index = function(list, value, fallback) { + fallback = fallback || 0; + + for (var i = 0; i < list.length; i++) { + if (list[i].value == value) + return i; + } + + return fallback; +} + +rcube_webmail.prototype.sieverules_toggle_vac_to = function(sel, id) { + var obj = rcube_find_object('rcmfd_sievevacto_' + id); + var opts = document.getElementsByName('_vacto_check_' + id + '[]') + + obj.value = ""; + for (i = 0; i < opts.length; i++) { + if (opts[i].checked) { + if (obj.value.length > 0) obj.value += ","; + obj.value += opts[i].value; + } + } +} + +rcube_webmail.prototype.sieverules_toggle_vac_osubj = function(sel, id) { + var obj = rcube_find_object('rcmfd_sievevactoh_' + id); + obj.value = sel.checked ? sel.value : ""; +} + +rcube_webmail.prototype.sieverules_toggle_vac_html = function(obj, rowid, txtid) { + rcmail_toggle_editor(obj, txtid); + + var sel = rcube_find_object('rcmfd_sievevachtmlhd_' + rowid); + sel.value = obj.checked ? obj.value : ""; +} + +rcube_webmail.prototype.sieverules_notify_impt = function(sel, id) { + var obj = rcube_find_object('rcmfd_sievenimpt_' + id); + obj.value = sel.value == 'none' ? '' : sel.value; +} + +rcmail.sieverules_help = function(sel, row) { + var obj = sel.parentNode.parentNode.parentNode.parentNode; + var help_row = obj.tBodies[0].rows[row]; + help_row.style.display = (help_row.style.display == 'none' ? '' : 'none'); + return false; +} + +rcube_webmail.prototype.sieverules_show_adv = function(sel) { + var obj = sel.parentNode.parentNode.parentNode.parentNode; + var rows = obj.tBodies[0].rows; + + if (sel.checked) { + for(var i = 0; i < rows.length; i++) + if(rows[i].className && rows[i].className.match(/advanced/)) + rows[i].style.display = ''; + } + else { + for(var i = 0; i < rows.length; i++) + if(rows[i].className && rows[i].className.match(/advanced/)) + rows[i].style.display = 'none'; + + for(var i = 0; i < rows.length; i++) + if(rows[i].className && rows[i].className.match(/advhelp/)) + rows[i].style.display = 'none'; + } +} + +rcube_webmail.prototype.sieverules_adveditor = function(sel) { + if (sel.checked && !confirm(rcmail.gettext('switchtoadveditor','sieverules'))) { + sel.checked = false; + return false; + } + + if (sel.checked) + rcmail.goto_url('plugin.sieverules.advanced', '', true); + else + rcmail.goto_url('plugin.sieverules', '_override=1', true); +} + +rcube_webmail.prototype.sieverules_load_setup = function() { + var add_url = ''; + + var target = window; + if (rcmail.env.contentframe && window.frames && window.frames[rcmail.env.contentframe]) { + add_url = '&_framed=1'; + target = window.frames[rcmail.env.contentframe]; + rcube_find_object(rcmail.env.contentframe).style.visibility = 'inherit'; + } + + target.location.href = rcmail.env.comm_path+'&_action=plugin.sieverules.setup' + add_url; +} + +rcube_webmail.prototype.sieverules_select_ruleset = function(obj, action) { + if (typeof obj == 'string') { + window.location.href = rcmail.env.comm_path+'&_action='+action+'&_ruleset=' + obj; + } + else { + var idx = obj.selectedIndex; + window.location.href = rcmail.env.comm_path+'&_action='+action+'&_ruleset=' + obj.options[idx].value; + } +} + +rcube_webmail.prototype.sieverules_add_ruleset = function(val, text) { + var obj = rcube_find_object('rulelist'); + + // remove loading message + if (obj.options.length == 1 && obj.options[0].value == '' && obj.options[0].text == rcmail.gettext('loading','')) + obj.remove(0); + + var opt = document.createElement('option'); + opt.value = val; + opt.text = text; + + obj.options.add(opt); + + if (rcmail.env.ruleset == val) + obj.selectedIndex = obj.options.length - 1; +} + +rcube_webmail.prototype.sieverules_disable_ruleset_options = function() { + $('#rulelist').attr("disabled", "disabled"); + rcmail.enable_command('plugin.sieverules.ruleset_dialog', 'plugin.sieverules.activate_ruleset', 'plugin.sieverules.del_ruleset', false); +} + +rcube_webmail.prototype.sieverulesdialog_submit = function() { + var action = rcube_find_object('sieverulesrsdialog_action').value; + var val = rcube_find_object('sieverulesrsdialog_name').value; + + if (action == '' || action == 'rename_ruleset') { + var obj = rcube_find_object('sieverulesrsdialog_ruleset'); + for (i = 0; i < obj.options.length ; i++) { + if (obj.options[i].value == val) { + alert(rcmail.gettext('rulesetexists','sieverules')); + rcube_find_object('sieverulesrsdialog_name').focus(); + return false; + } + } + } + else if (action == 'copyto_ruleset' || action == 'copyfrom_ruleset') { + var obj = rcube_find_object('sieverulesrsdialog_ruleset'); + var idx = obj.selectedIndex; + val = obj.options[idx].value; + } + + $('#sieverulesrsdialog').dialog('close'); + + var target = window; + if (rcmail.env.contentframe && window.frames && window.frames[rcmail.env.contentframe]) + target = window.frames[rcmail.env.contentframe]; + + if (action == 'rename_ruleset') + window.location.href = rcmail.env.comm_path+'&_action=plugin.sieverules.rename_ruleset&_ruleset=' + rcmail.env.ruleset + '&_new=' + val; + else if (action == 'copyto_ruleset') + rcmail.http_request('plugin.sieverules.copy_filter', '_iid='+ target.rcmail.env.iid +'&_dest=' + val, true); + else if (action == 'copyfrom_ruleset') + window.location.href = rcmail.env.comm_path+'&_action=plugin.sieverules.import&_import=_copy_&_ruleset=' + val + '&_new=' + rcmail.env.ruleset; + else + window.location.href = rcmail.env.comm_path+'&_action=plugin.sieverules&_ruleset=' + val; +} + +rcube_webmail.prototype.enable_sig = function(obj) { + var id; + + if (obj.options[0].value == 'auto' || obj.options[0].value == '') + id = obj.selectedIndex; + else + id = obj.selectedIndex + 1; + + // enable manual signature insert + if (rcmail.env.signatures && rcmail.env.signatures[id]) + rcmail.enable_command('plugin.sieverules.vacation_sig', true); + else + rcmail.enable_command('plugin.sieverules.vacation_sig', false); +} + +rcube_webmail.prototype.sieverules_toggle_eheadlast = function(obj) { + var selectobj = document.getElementById(obj.id.replace('_eheadaddlast_', '_eheadindex_')); + + if (obj.checked) + selectobj.selectedIndex = 6; + else + selectobj.selectedIndex = 0; +} + +$(document).ready(function() { + if (window.rcmail) { + rcmail.addEventListener('init', function(evt) { + if (rcmail.env.action == 'plugin.sieverules.add' || rcmail.env.action == 'plugin.sieverules.edit' || rcmail.env.action == 'plugin.sieverules.setup' || rcmail.env.action == 'plugin.sieverules.advanced') + var tab = $('').attr('id', 'settingstabpluginsieverules').addClass('tablink selected'); + else + var tab = $('').attr('id', 'settingstabpluginsieverules').addClass('tablink'); + + var button = $('').attr('href', rcmail.env.comm_path+'&_action=plugin.sieverules').attr('title', rcmail.gettext('managefilters', 'sieverules')).html(rcmail.gettext('filters','sieverules')).appendTo(tab); + + // add button and register command + rcmail.add_element(tab, 'tabs'); + + if ((rcmail.env.action == 'plugin.sieverules' || rcmail.env.action == 'plugin.sieverules.advanced') && !rcmail.env.sieveruleserror) { + if (rcmail.gui_objects.sieverules_list) { + rcmail.sieverules_list = new rcube_list_widget(rcmail.gui_objects.sieverules_list, {multiselect:false, draggable:true, keyboard:true}); + + // override blur function to prevent current rule being deselected + rcmail.sieverules_list.blur = function() {} + + rcmail.sieverules_list.addEventListener('select', function(o) { rcmail.sieverules_select(o); }); + rcmail.sieverules_list.addEventListener('keypress', function(o) { rcmail.sieverules_keypress(o); }); + rcmail.sieverules_list.addEventListener('dragstart', function(o) { rcmail.sieverules_drag_start(o); }); + rcmail.sieverules_list.addEventListener('dragmove', function(e) { rcmail.sieverules_drag_move(e); }); + rcmail.sieverules_list.addEventListener('dragend', function(e) { rcmail.sieverules_drag_end(e); }); + document.onmouseup = function(e) { return rcmail.sieverules_mouse_up(e); }; + rcmail.sieverules_list.init(); + rcmail.sieverules_list.focus(); + + if (rcmail.env.iid && rcmail.env.iid < rcmail.sieverules_list.rows.length && !rcmail.env.eid) + rcmail.sieverules_list.select_row(rcmail.env.iid, false, false); + } + + if (rcmail.gui_objects.sieverules_examples) { + rcmail.sieverules_examples = new rcube_list_widget(rcmail.gui_objects.sieverules_examples, {multiselect:true, draggable:true, keyboard:true}); + rcmail.sieverules_examples.addEventListener('select', function(o) { rcmail.sieverules_ex_select(o); }); + rcmail.sieverules_examples.addEventListener('dragstart', function(o) { rcmail.sieverules_ex_drag_start(o); }); + rcmail.sieverules_examples.addEventListener('dragmove', function(e) { rcmail.sieverules_drag_move(e); }); + rcmail.sieverules_examples.addEventListener('dragend', function(e) { rcmail.sieverules_drag_end(e); }); + rcmail.sieverules_examples.init(); + + if (rcmail.env.eid) + rcmail.sieverules_examples.highlight_row(rcmail.env.eid); + + rcmail.register_command('plugin.sieverules.import_ex', function() { + if (rcmail.sieverules_examples.get_selection().length > 0) { + rcmail.set_busy(true, 'sieverules.movingfilter'); + rcmail.goto_url('plugin.sieverules.import', '_import=_example_&_pos='+ rcmail.env.sieverules_last_target +'&_eids=' + rcmail.sieverules_examples.get_selection(), true); + } + }, true); + } + + if (rcmail.env.action == 'plugin.sieverules') { + rcmail.register_command('plugin.sieverules.move', function(props, obj) { + var args = (props.source) ? props : { source:obj.parentNode.parentNode.rowIndex - 1, dest:props }; + + if (args.dest > -1 && args.dest <= rcmail.sieverules_list.rows.length) { + var lock = rcmail.set_busy(true, 'sieverules.movingfilter'); + rcmail.http_request('plugin.sieverules.move', '_src=' + args.source + '&_dst=' + args.dest, lock); + } + }, true); + + rcmail.register_command('plugin.sieverules.add', function(id) { + if (rcmail.sieverules_examples) rcmail.sieverules_examples.clear_selection(); + rcmail.sieverules_list.clear_selection(); + rcmail.env.iid = null; + rcmail.enable_command('plugin.sieverules.delete', false); + + var add_url = ''; + + var target = window; + if (rcmail.env.contentframe && window.frames && window.frames[rcmail.env.contentframe]) { + add_url = '&_framed=1'; + target = window.frames[rcmail.env.contentframe]; + rcube_find_object(rcmail.env.contentframe).style.visibility = 'inherit'; + } + + target.location.href = rcmail.env.comm_path+'&_action=plugin.sieverules.add' + add_url; + }, true); + } + + rcmail.register_command('plugin.sieverules.ruleset_dialog', function(props, obj) { + rcube_find_object('sieverulesrsdialog_add').style.display = 'none'; + rcube_find_object('sieverulesrsdialog_edit').style.display = 'none'; + rcube_find_object('sieverulesrsdialog_copyto').style.display = 'none'; + rcube_find_object('sieverulesrsdialog_copyfrom').style.display = 'none'; + rcube_find_object('sieverulesrsdialog_input').style.display = 'none'; + rcube_find_object('sieverulesrsdialog_select').style.display = 'none'; + rcube_find_object('sieverulesrsdialog_name').value = ''; + + if (props == 'rename_ruleset') { + //rcube_find_object('sieverulesrsdialog_edit').style.display = ''; + boxtitle = rcube_find_object('sieverulesrsdialog_edit').innerHTML; + rcube_find_object('sieverulesrsdialog_input').style.display = ''; + rcube_find_object('sieverulesrsdialog_name').value = rcmail.env.ruleset; + } + else if (props == 'copyto_ruleset') { + //rcube_find_object('sieverulesrsdialog_copyto').style.display = ''; + boxtitle = rcube_find_object('sieverulesrsdialog_copyto').innerHTML; + rcube_find_object('sieverulesrsdialog_select').style.display = ''; + } + else if (props == 'copyfrom_ruleset') { + //rcube_find_object('sieverulesrsdialog_copyfrom').style.display = ''; + boxtitle = rcube_find_object('sieverulesrsdialog_copyfrom').innerHTML; + rcube_find_object('sieverulesrsdialog_select').style.display = ''; + } + else { + //rcube_find_object('sieverulesrsdialog_add').style.display = ''; + boxtitle = rcube_find_object('sieverulesrsdialog_add').innerHTML; + rcube_find_object('sieverulesrsdialog_input').style.display = ''; + } + + rcube_find_object('sieverulesrsdialog_action').value = props; + + $('#sieverulesrsdialog').dialog({ title: boxtitle, width: 512, resizable: false, modal: true }); + }, true); + + rcmail.register_command('plugin.sieverules.activate_ruleset', function(props, obj) { + rcmail.set_busy(true); + + var obj = rcube_find_object('rulelist'); + if (obj) { + rcmail.http_request('plugin.sieverules.enable_ruleset', '_ruleset=' + rcmail.env.ruleset, true); + obj.options.length = 0; + + var opt = document.createElement('option'); + opt.value = ''; + opt.text = rcmail.gettext('loading',''); + + obj.options.add(opt); + rcmail.enable_command('plugin.sieverules.activate_ruleset', false); + } + else { + window.location.href = rcmail.env.comm_path+'&_action=plugin.sieverules.enable_ruleset&_reload=1&_ruleset=' + rcmail.env.ruleset; + } + }, false); + + rcmail.register_command('plugin.sieverules.del_ruleset', function(props, obj) { + if (rcmail.env.ruleset_total < 2) + return false; + + if (confirm(rcmail.gettext('delrulesetconf','sieverules'))) + window.location.href = rcmail.env.comm_path+'&_action=plugin.sieverules.del_ruleset&_ruleset=' + rcmail.env.ruleset + '&_next=' + rcmail.env.ruleset_next; + }, false); + + rcmail.register_command('plugin.sieverules.sieverules_adveditor', function(props, obj) { + var chkbox = document.createElement('checkbox'); + + if (props == "1") + chkbox.checked = true; + + rcmail.sieverules_adveditor(chkbox); + }, true); + + rcmail.register_command('plugin.sieverules.delete', function(id) { + if (confirm(rcmail.gettext('filterdeleteconfirm','sieverules'))) { + var add_url = ''; + + var target = window; + if (rcmail.env.contentframe && window.frames && window.frames[rcmail.env.contentframe]) { + add_url = '&_framed=1'; + target = window.frames[rcmail.env.contentframe]; + rcube_find_object(rcmail.env.contentframe).style.visibility = 'inherit'; + } + + target.location.href = rcmail.env.comm_path+'&_action=plugin.sieverules.delete&_iid=' + rcmail.env.iid + add_url; + rcmail.enable_command('plugin.sieverules.delete', false); + } + }, false); + + if (rcmail.env.action == 'plugin.sieverules.advanced') { + rcmail.register_command('plugin.sieverules.save', function() { + rcmail.gui_objects.editform.submit(); + }, true); + } + + // enable commands + if (!rcmail.env.ruleset_active && rcmail.env.ruleset_total > 1) + rcmail.enable_command('plugin.sieverules.del_ruleset', true); + + if (!rcmail.env.ruleset_active) + rcmail.enable_command('plugin.sieverules.activate_ruleset', true); + } + else if (rcmail.env.action == 'plugin.sieverules.setup') { + rcmail.register_command('plugin.sieverules.import', function(props) { + var add_url = ''; + + var target = window; + if (rcmail.env.framed) + target = window.parent; + + target.location.href = './?_task=settings&_action=plugin.sieverules.import&' + props; + }, true); + + rcmail.register_command('plugin.sieverules.ruleset_dialog_setup', function(props, obj) { + var target = window; + if (rcmail.env.framed) + target = window.parent; + + target.rcube_find_object('sieverulesrsdialog_add').style.display = 'none'; + target.rcube_find_object('sieverulesrsdialog_edit').style.display = 'none'; + target.rcube_find_object('sieverulesrsdialog_input').style.display = 'none'; + //target.rcube_find_object('sieverulesrsdialog_copyfrom').style.display = ''; + boxtitle = rcube_find_object('sieverulesrsdialog_copyfrom').innerHTML; + target.rcube_find_object('sieverulesrsdialog_select').style.display = ''; + target.rcube_find_object('sieverulesrsdialog_action').value = props; + + target.$('#sieverulesrsdialog').dialog({ title: boxtitle, width: 512, resizable: false, modal: true }); + }, true); + } + + if (rcmail.env.action == 'plugin.sieverules.add' || rcmail.env.action == 'plugin.sieverules.edit') { + rcmail.register_command('plugin.sieverules.add_rule', function(props, obj) { + rcmail.enable_command('plugin.sieverules.del_rule', true); + var rulesTable = rcube_find_object('rules-table').tBodies[0]; + var idx = obj.parentNode.parentNode.rowIndex + 3; + var newNode1 = rulesTable.rows[0].cloneNode(true); + var newNode2 = rulesTable.rows[1].cloneNode(true); + var newNode3 = rulesTable.rows[2].cloneNode(true); + + if (idx < rulesTable.rows.length) { + rulesTable.insertBefore(newNode3, rulesTable.rows[idx]); + rulesTable.insertBefore(newNode2, rulesTable.rows[idx]); + rulesTable.insertBefore(newNode1, rulesTable.rows[idx]); + } + else { + rulesTable.appendChild(newNode1); + rulesTable.appendChild(newNode2); + rulesTable.appendChild(newNode3); + } + + rcmail.env.sieverules_rules++; + var tmp = $(newNode2).html().replace(/rowid/g, rcmail.env.sieverules_rules); + $(newNode2).html(tmp); + var tmp = $(newNode3).html().replace(/rowid/g, rcmail.env.sieverules_rules); + $(newNode3).html(tmp); + + newNode1.style.display = ""; + newNode2.style.display = "none"; + newNode3.style.display = "none"; + + return false; + }, true); + + rcmail.register_command('plugin.sieverules.del_rule', function(props, obj) { + var rulesTable = rcube_find_object('rules-table').tBodies[0]; + + if (rulesTable.rows.length == 6) + return false; + + if (confirm(rcmail.gettext('ruledeleteconfirm','sieverules'))) { + rulesTable.deleteRow(obj.parentNode.parentNode.rowIndex + 2); + rulesTable.deleteRow(obj.parentNode.parentNode.rowIndex + 1); + rulesTable.deleteRow(obj.parentNode.parentNode.rowIndex); + } + + if (rcube_find_object('rules-table').tBodies[0].rows.length == 6) + rcmail.enable_command('plugin.sieverules.del_rule', false); + + return false; + }, false); + + rcmail.register_command('plugin.sieverules.copy_rule', function(props, obj) { + parent.rcmail.command('plugin.sieverules.ruleset_dialog', 'copyto_ruleset', obj); + }, true); + + rcmail.register_command('plugin.sieverules.add_action', function(props, obj) { + rcmail.enable_command('plugin.sieverules.del_action', true); + var actsTable = rcube_find_object('actions-table').tBodies[0]; + var idx = obj.parentNode.parentNode.rowIndex + 1; + var newNode = actsTable.rows[0].cloneNode(true); + + if (idx < actsTable.rows.length) + actsTable.insertBefore(newNode, actsTable.rows[idx]); + else + actsTable.appendChild(newNode); + + rcmail.env.sieverules_actions++; + var tmp = $(newNode).html().replace(/rowid/g, rcmail.env.sieverules_actions); + $(newNode).html(tmp); + + newNode.style.display = ""; + + return false; + }, true); + + rcmail.register_command('plugin.sieverules.del_action', function(props, obj) { + var actsTable = rcube_find_object('actions-table').tBodies[0]; + + if (actsTable.rows.length == 2) + return false; + + if (confirm(rcmail.gettext('actiondeleteconfirm','sieverules'))) + actsTable.deleteRow(obj.parentNode.parentNode.rowIndex); + + if (rcube_find_object('actions-table').tBodies[0].rows.length == 2) + rcmail.enable_command('plugin.sieverules.del_action', false); + + return false; + }, false); + + rcmail.register_command('plugin.sieverules.save', function() { + var rows; + + if (rcmail.env.framed) + rows = parent.rcmail.sieverules_list.rows; + else + rows = rcmail.sieverules_list.rows; + + var input_name = rcube_find_object('_name'); + var rule_join = document.getElementsByName('_join'); + var headers = document.getElementsByName('_header[]'); + var bodyparts = document.getElementsByName('_bodypart[]'); + var contentparts = document.getElementsByName('_body_contentpart[]'); + var dateparts = document.getElementsByName('_datepart[]'); + var ops = document.getElementsByName('_operator[]'); + var advops = document.getElementsByName('_advoperator[]'); + var targets = document.getElementsByName('_target[]'); + var advtargets = document.getElementsByName('_advtarget[]'); + var acts = document.getElementsByName('_act[]'); + var folders = document.getElementsByName('_folder[]'); + var customfolders = document.getElementsByName('_customfolder[]'); + var addrs = document.getElementsByName('_redirect[]'); + var rejects = document.getElementsByName('_reject[]'); + var senders = document.getElementsByName('_vacfrom[]'); + var aliases = document.getElementsByName('_vacto[]'); + var days = document.getElementsByName('_day[]'); + var subjects = document.getElementsByName('_subject[]'); + var msgs = document.getElementsByName('_msg[]'); + var nmethods = document.getElementsByName('_nmethod[]'); + var nmsgs = document.getElementsByName('_nmsg[]'); + var eheadernames = document.getElementsByName('_eheadname[]'); + var eheadervals = document.getElementsByName('_eheadval[]'); + var size_test = new RegExp('^[0-9]+$'); + var spamtest_test = new RegExp('^[0-9]+$'); + var header_test = new RegExp('^[a-zA-Z0-9\-]+( ?, ?[a-zA-Z0-9\-]+)*$'); + var date_test = new RegExp('^[0-9]{4}\-[0-9]{2}\-[0-9]{2}$'); + var time_test = new RegExp('^[0-9]{2}:[0-9]{2}:[0-9]{2}$'); + + if (input_name && input_name.value == '') { + alert(rcmail.gettext('norulename','sieverules')); + input_name.focus(); + return false; + } + + for (var i = 0; i < rows.length; i++) { + if (input_name.value == rows[i].obj.cells[0].innerHTML && i != rcmail.env.iid) { + alert(rcmail.gettext('ruleexists','sieverules')); + input_name.focus(); + return false; + } + } + + for (var i = 1; i < headers.length && (rule_join[0].checked || rule_join[1].checked); i++) { + if (headers[i].value == '') { + alert(rcmail.gettext('noheader','sieverules')); + headers[i].focus(); + return false; + } + + if (!header_test.test(headers[i].value)) { + alert(rcmail.gettext('headerbadchars','sieverules')); + headers[i].focus(); + return false; + } + + if (bodyparts[i].value == 'content' && contentparts[i].value == '') { + alert(rcmail.gettext('nobodycontentpart','sieverules')); + contentparts[i].focus(); + return false; + } + + if (targets[i] && dateparts[i].value != 'weekday' && ops[i].value.indexOf("exists") == -1 && ops[i].value.indexOf("advoptions") == -1 && targets[i].value == '') { + alert(rcmail.gettext('noheadervalue','sieverules')); + targets[i].focus(); + return false; + } + + if (advtargets[i] && dateparts[i].value != 'weekday' && ops[i].value.indexOf("advoptions") != -1 && advtargets[i].value == '') { + alert(rcmail.gettext('noheadervalue','sieverules')); + advtargets[i].focus(); + return false; + } + + if (headers[i].value == 'size' && !size_test.test(targets[i].value)) { + alert(rcmail.gettext('sizewrongformat','sieverules')); + targets[i].focus(); + return false; + } + + if (headers[i].value == 'spamtest') { + targets[i].value = document.getElementsByName('_spam_probability[]')[i].value; + } + + if (headers[i].value == 'virustest') { + targets[i].value = document.getElementsByName('_virus_probability[]')[i].value; + } + + if (headers[i].value == 'body' && (advops[i].value.indexOf('user') > -1 || advops[i].value.indexOf('detail') > -1 || advops[i].value.indexOf('domain') > -1)) { + alert(rcmail.gettext('badoperator','sieverules')); + advops[i].focus(); + return false; + } + + if ((headers[i].value == 'date' || headers[i].value == 'currentdate')) { + if (dateparts[i].value == 'date' && !date_test.test(targets[i].value)) { + alert(rcmail.gettext('baddateformat','sieverules')); + targets[i].focus(); + return false; + } + else if (dateparts[i].value == 'time' && !time_test.test(targets[i].value)) { + alert(rcmail.gettext('badtimeformat','sieverules')); + targets[i].focus(); + return false; + } + } + } + + for (var i = 1; i < acts.length; i++) { + var idx = acts[i].selectedIndex; + + if (acts[i][idx].value == 'fileinto' || acts[i][idx].value == 'fileinto_copy') { + if (folders[i].value == '@@newfolder' && customfolders[i].value == '') { + alert(rcmail.gettext('missingfoldername','sieverules')); + customfolders[i].focus(); + return false; + } + } + else if (acts[i][idx].value == 'redirect' || acts[i][idx].value == 'redirect_copy') { + if (addrs[i].value == '') { + alert(rcmail.gettext('noredirect','sieverules')); + addrs[i].focus(); + return false; + } + + if (!rcube_check_email(addrs[i].value.replace(/^\s+/, '').replace(/[\s,;]+$/, ''), true)) { + alert(rcmail.gettext('redirectaddresserror','sieverules')); + addrs[i].focus(); + return false; + } + } + else if (acts[i][idx].value == 'reject' || acts[i][idx].value == 'ereject') { + if (rejects[i].value == '') { + alert(rcmail.gettext('noreject','sieverules')); + rejects[i].focus(); + return false; + } + } + else if (acts[i][idx].value == 'vacation') { + if (senders[i].value != '' && senders[i].value != 'auto' && !rcube_check_email(senders[i].value.replace(/^\s+/, '').replace(/[\s,;]+$/, ''), true) && !$.isNumeric(senders[i].value)) { + alert(rcmail.gettext('redirectaddresserror','sieverules')); + senders[i].focus(); + return false; + } + + if (aliases[i].value.indexOf(' ') > -1 || aliases[i].value.indexOf(';') > -1) { + alert(rcmail.gettext('vactoexp_err','sieverules')); + aliases[i].focus(); + return false; + } + + //if (days[i].value == '') { + // alert(rcmail.gettext('vacnodays','sieverules')); + // days[i].focus(); + // return false; + //} + + if (days[i].value != '' && (!size_test.test(days[i].value) || days[i].value < 1)) { + alert(rcmail.gettext('vacdayswrongformat','sieverules')); + days[i].focus(); + return false; + } + + //if (subjects[i].value == '') { + // alert(rcmail.gettext('vacnosubject','sieverules')); + // subjects[i].focus(); + // return false; + //} + + var editor = tinyMCE.get("rcmfd_sievevacmag_" + (i - 1)); + if ((editor && editor.getContent() == '') || (!editor && msgs[i].value == '')) { + alert(rcmail.gettext('vacnomsg','sieverules')); + msgs[i].focus(); + return false; + } + } + else if (acts[i][idx].value == 'notify' || acts[i][idx].value == 'enotify') { + if (nmethods[i].value == '') { + alert(rcmail.gettext('notifynomethod','sieverules')); + nmethods[i].focus(); + return false; + } + + if (acts[i][idx].value == 'enotify' && nmethods[i].value.indexOf(':') == -1) { + alert(rcmail.gettext('notifyinvalidmethod','sieverules')); + nmethods[i].focus(); + return false; + } + + if (nmsgs[i].value == '') { + alert(rcmail.gettext('notifynomsg','sieverules')); + nmsgs[i].focus(); + return false; + } + } + else if (acts[i][idx].value == 'editheaderadd' || acts[i][idx].value == 'editheaderrem') { + if (eheadernames[i].value == '') { + alert(rcmail.gettext('eheadernoname','sieverules')); + eheadernames[i].focus(); + return false; + } + + if (acts[i][idx].value == 'editheaderadd') { + if (eheadervals[i].value == '') { + alert(rcmail.gettext('eheadernoval','sieverules')); + eheadervals[i].focus(); + return false; + } + } + } + } + + // enable the comparators field + for (var i = 0; i < document.getElementsByName('_comparator[]').length; i++) + document.getElementsByName('_comparator[]')[i].disabled = false; + + rcmail.gui_objects.editform.submit(); + }, true); + + rcmail.register_command('plugin.sieverules.vacation_sig', function(id) { + var obj = document.getElementById("rcmfd_sievevacfrom_" + id); + var is_html = ($("#rcmfd_sievevachtmlcb_" + id).is(':checked')); + + if (!obj || !obj.options) + return false; + + var sig, id; + var sig_separator = '-- '; + + if (obj.options[0].value == 'auto' || obj.options[0].value == '') + id = obj.selectedIndex; + else + id = obj.selectedIndex + 1; + + if (is_html) { + var editor = tinyMCE.get("rcmfd_sievevacmag_" + id), + sigElem = editor.dom.get('_rc_sig'); + + // Append the signature as a div within the body + if (!sigElem) { + var body = editor.getBody(), + doc = editor.getDoc(); + + sigElem = doc.createElement('div'); + sigElem.setAttribute('id', '_rc_sig'); + + if (bw.ie) // add empty line before signature on IE + body.appendChild(doc.createElement('br')); + + body.appendChild(sigElem); + } + + if (rcmail.env.signatures[id]) { + if (rcmail.env.signatures[id].is_html) { + sig = rcmail.env.signatures[id].text; + if (!rcmail.env.signatures[id].plain_text.match(/^--[ -]\r?\n/m)) + sig = sig_separator + '
' + sig; + } + else { + sig = rcmail.env.signatures[id].text; + if (!sig.match(/^--[ -]\r?\n/m)) + sig = sig_separator + '\n' + sig; + + sig = '
' + sig + '
'; + } + + sigElem.innerHTML = sig; + } + } + else { + var input_message = $("#rcmfd_sievevacmag_" + id); + var message = input_message.val(); + + if (rcmail.env.signatures && rcmail.env.signatures[id]) { + sig = rcmail.env.signatures[id]['text']; + sig = sig.replace(/\r\n/g, '\n'); + + if (!sig.match(/^--[ -]\n/)) + sig = sig_separator + '\n' + sig; + + message = message.replace(/[\r\n]+$/, ''); + message += '\n\n' + sig; + } + + input_message.val(message); + } + + return false; + }, false); + + // enable commands + if (rcube_find_object('rules-table').tBodies[0].rows.length > 6) + rcmail.enable_command('plugin.sieverules.del_rule', true); + + if (rcube_find_object('actions-table').tBodies[0].rows.length > 2) + rcmail.enable_command('plugin.sieverules.del_action', true); + + rcmail.enable_command('toggle-editor', true); + + // enable sig button + var acts = document.getElementsByName('_act[]'); + for (var i = 1; i < acts.length; i++) { + var idx = acts[i].selectedIndex; + + if (acts[i][idx].value == 'vacation') + rcmail.enable_sig(document.getElementsByName('_vacfrom[]')[i]); + } + + // add input masks + rcmail.add_onload(function setup_inputmasks() { + // date/time inputs + headers = document.getElementsByName('_selheader[]'); + for (var i = 0; i < headers.length; i++) { + if (headers[i].value.indexOf('date::') == 0) { + var obj = document.getElementsByName('_datepart[]')[i]; + var target_obj = $("input[name='_target[]']")[i]; + + $(target_obj).datepicker("destroy"); + $(target_obj).unmask(); + + if (obj.value == 'date') + $(target_obj).datepicker({ dateFormat: 'yy-mm-dd' }); + else if (obj.value == 'time') + $(target_obj).mask('99:99:99', {example: 'HH:MM:SS', placeholder: '0'}); + } + + } + }); + } + }); + } +}); \ No newline at end of file diff --git a/plugins/sieverules/sieverules.php b/plugins/sieverules/sieverules.php new file mode 100644 index 000000000..adb2bc16b --- /dev/null +++ b/plugins/sieverules/sieverules.php @@ -0,0 +1,2331 @@ + value + private $headers = array('subject' => 'header::Subject', + 'from' => 'address::From', + 'to' => 'address::To', + 'cc' => 'address::Cc', + 'bcc' => 'address::Bcc', + 'envelopeto' => 'envelope::To', + 'envelopefrom' => 'envelope::From' + ); + + private $operators = array('filtercontains' => 'contains', + 'filternotcontains' => 'notcontains', + 'filteris' => 'is', + 'filterisnot' => 'notis', + 'filterexists' => 'exists', + 'filternotexists' => 'notexists' + ); + + private $flags = array('flagread' => '\\\\Seen', + 'flagdeleted' => '\\\\Deleted', + 'flaganswered' => '\\\\Answered', + 'flagdraft' => '\\\\Draft', + 'flagflagged' => '\\\\Flagged' + ); + + function init() + { + $rcmail = rcube::get_instance(); + $this->load_config(); + + // load required plugin + $this->require_plugin('jqueryui'); + + if ($rcmail->config->get('sieverules_multiplerules') && rcube_utils::get_input_value('_ruleset', rcube_utils::INPUT_GET, true)) + $this->current_ruleset = rcube_utils::get_input_value('_ruleset', rcube_utils::INPUT_GET, true); + elseif ($rcmail->config->get('sieverules_multiplerules') && $_SESSION['sieverules_current_ruleset']) + $this->current_ruleset = $_SESSION['sieverules_current_ruleset']; + elseif ($rcmail->config->get('sieverules_multiplerules')) + $this->current_ruleset = false; + else + $this->current_ruleset = $rcmail->config->get('sieverules_ruleset_name'); + + // override default values + if ($rcmail->config->get('sieverules_default_headers')) + $this->headers = $rcmail->config->get('sieverules_default_headers'); + + if ($rcmail->config->get('sieverules_default_operators')) + $this->operators = $rcmail->config->get('sieverules_default_operators'); + + if ($rcmail->config->get('sieverules_default_flags')) + $this->flags = $rcmail->config->get('sieverules_default_flags'); + + $this->action = $rcmail->action; + + $this->add_texts('localization/', array('filters', 'managefilters')); + $this->include_stylesheet($this->local_skin_path() . '/tabstyles.css'); + $this->include_script('sieverules.js'); + + $this->register_action('plugin.sieverules', array($this, 'init_html')); + $this->register_action('plugin.sieverules.add', array($this, 'init_html')); + $this->register_action('plugin.sieverules.edit', array($this, 'init_html')); + $this->register_action('plugin.sieverules.setup', array($this, 'init_setup')); + $this->register_action('plugin.sieverules.advanced', array($this, 'init_html')); + $this->register_action('plugin.sieverules.move', array($this, 'move')); + $this->register_action('plugin.sieverules.save', array($this, 'save')); + $this->register_action('plugin.sieverules.delete', array($this, 'delete')); + $this->register_action('plugin.sieverules.import', array($this, 'import')); + $this->register_action('plugin.sieverules.update_list', array($this, 'gen_js_list')); + $this->register_action('plugin.sieverules.del_ruleset', array($this, 'delete_ruleset')); + $this->register_action('plugin.sieverules.rename_ruleset', array($this, 'rename_ruleset')); + $this->register_action('plugin.sieverules.enable_ruleset', array($this, 'enable_ruleset')); + $this->register_action('plugin.sieverules.copy_filter', array($this, 'copy_filter')); + } + + function init_html() + { + $rcmail = rcube::get_instance(); + + // always include all identities when creating vacation messages + if ($rcmail->config->get('sieverules_force_vacto')) + $this->force_vacto = $rcmail->config->get('sieverules_force_vacto'); + + // include the 'from' option when creating vacation messages + if ($rcmail->config->get('sieverules_show_vacfrom')) + $this->show_vacfrom = $rcmail->config->get('sieverules_show_vacfrom'); + + // include the 'handle' option when creating vacation messages + if ($rcmail->config->get('sieverules_show_vachandle')) + $this->show_vachandle = $rcmail->config->get('sieverules_show_vachandle'); + + $this->_startup(); + + if ($rcmail->config->get('sieverules_multiplerules') && $this->current_ruleset === false) { + if ($ruleset = $this->sieve->get_active()) { + $this->current_ruleset = $this->sieve->get_active(); + } + else { + $this->current_ruleset = $rcmail->config->get('sieverules_ruleset_name'); + $this->_startup(); + $rcmail->overwrite_action('plugin.sieverules.setup'); + $this->action = 'plugin.sieverules.setup'; + } + } + + if ($rcmail->config->get('sieverules_multiplerules')) + $_SESSION['sieverules_current_ruleset'] = $this->current_ruleset; + + $this->api->output->set_env('ruleset', $this->current_ruleset); + if ($rcmail->config->get('sieverules_adveditor') == 2 && rcube_utils::get_input_value('_override', rcube_utils::INPUT_GET) != '1' && $this->action == 'plugin.sieverules') { + $rcmail->overwrite_action('plugin.sieverules.advanced'); + $this->action = 'plugin.sieverules.advanced'; + } + + $this->api->output->add_handlers(array( + 'sieveruleslist' => array($this, 'gen_list'), + 'sieverulesexamplelist' => array($this, 'gen_examples'), + 'sieverulessetup' => array($this, 'gen_setup'), + 'sieveruleform' => array($this, 'gen_form'), + 'advancededitor' => array($this, 'gen_advanced'), + 'advswitch' => array($this, 'gen_advswitch'), + 'rulelist' => array($this, 'gen_rulelist'), + 'sieverulesframe' => array($this, 'sieverules_frame'), + )); + + if ($this->action != 'plugin.sieverules.advanced') + $this->api->output->include_script('list.js'); + + if (sizeof($this->examples) > 0) + $this->api->output->set_env('examples', 'true'); + + if ($this->action == 'plugin.sieverules.add' || $this->action == 'plugin.sieverules.edit') { + $rcmail->html_editor('sieverules'); + $this->api->output->add_script(sprintf("window.rcmail_editor_settings = %s", + json_encode(array( + 'plugins' => 'paste,tabfocus', + 'theme_advanced_buttons1' => 'bold,italic,underline,strikethrough,justifyleft,justifycenter,justifyright,justifyfull,separator,outdent,indent,charmap,hr', + 'theme_advanced_buttons2' => 'link,unlink,code,forecolor,fontselect,fontsizeselect', + ))), 'head'); + + $this->api->output->set_pagetitle($this->action == 'plugin.sieverules.add' ? $this->gettext('newfilter') : $this->gettext('edititem')); + $this->api->output->send('sieverules.editsieverule'); + } + elseif ($this->action == 'plugin.sieverules.setup') { + $this->api->output->set_pagetitle($this->gettext('filters')); + $this->api->output->add_script(rcmail_output::JS_OBJECT_NAME .".add_onload('". rcmail_output::JS_OBJECT_NAME .".sieverules_load_setup()');"); + $this->api->output->send('sieverules.sieverules'); + } + elseif ($this->action == 'plugin.sieverules.advanced') { + $this->api->output->set_pagetitle($this->gettext('filters')); + $this->api->output->send('sieverules.advancededitor'); + } + else { + $this->api->output->set_pagetitle($this->gettext('filters')); + $this->api->output->send('sieverules.sieverules'); + } + } + + function init_setup() + { + $this->_startup(); + + $this->api->output->add_handlers(array( + 'sieverulessetup' => array($this, 'gen_setup'), + )); + + $this->api->output->set_pagetitle($this->gettext('filters')); + $this->api->output->send('sieverules.setupsieverules'); + } + + function sieverules_frame($attrib) + { + if (!$attrib['id']) + $attrib['id'] = 'rcmprefsframe'; + + return $this->api->output->frame($attrib, true); + } + + function gen_advanced($attrib) + { + list($form_start, $form_end) = get_form_tags($attrib, 'plugin.sieverules.save'); + $out = $form_start; + + $input_script = new html_textarea(array('id' => 'sieverules_adv', 'name' => '_script')); + $out .= $input_script->show($this->sieve->script->raw); + + $out .= $form_end; + + return $out; + } + + function gen_list($attrib) + { + $this->api->output->add_label('sieverules.movingfilter', 'loading', 'sieverules.switchtoadveditor', 'sieverules.filterdeleteconfirm'); + $this->api->output->add_gui_object('sieverules_list', 'sieverules-table'); + + $table = new html_table(array('id' => 'sieverules-table', 'class' => 'records-table', 'cellspacing' => '0', 'cols' => 2)); + + if (rcube::get_instance()->config->get('sieverules_multiplerules', false)) { + if ($this->current_ruleset == $this->sieve->get_active()) + $status = html::img(array('id' => 'rulesetstatus', 'src' => $attrib['activeicon'], 'alt' => $this->gettext('isactive'), 'title' => $this->gettext('isactive'))); + else + $status = html::img(array('id' => 'rulesetstatus', 'src' => $attrib['inactiveicon'], 'alt' => $this->gettext('isinactive'), 'title' => $this->gettext('isinactive'))); + + $table->add_header(array('colspan' => '2'), html::span(array('title' => $this->current_ruleset), $this->gettext(array('name' => 'filtersname', 'vars' => array('name' => $this->current_ruleset)))) . $status); + } + else { + $table->add_header(array('colspan' => 2), $this->gettext('filters')); + } + + if (sizeof($this->script) == 0) { + $table->add(array('colspan' => '2'), rcube_utils::rep_specialchars_output($this->gettext('nosieverules'))); + } + else foreach($this->script as $idx => $filter) { + $table->set_row_attribs(array('id' => 'rcmrow' . $idx)); + + if ($filter['disabled'] == 1) + $table->add(null, rcmail::Q($filter['name']) . ' (' . $this->gettext('disabled') . ')'); + else + $table->add(null, rcmail::Q($filter['name'])); + + $dst = $idx - 1; + $up_link = $this->api->output->button(array('command' => 'plugin.sieverules.move', 'prop' => $dst, 'type' => 'link', 'class' => 'up_arrow', 'title' => 'sieverules.moveup', 'content' => ' ')); + $dst = $idx + 2; + $down_link = $this->api->output->button(array('command' => 'plugin.sieverules.move', 'prop' => $dst, 'type' => 'link', 'class' => 'down_arrow', 'title' => 'sieverules.movedown', 'content' => ' ')); + + $table->add('control', $down_link . $up_link); + } + + return html::tag('div', array('id' => 'sieverules-list-filters'), $table->show($attrib)); + } + + function gen_js_list() + { + $this->_startup(); + + if (sizeof($this->script) == 0) { + $this->api->output->command('sieverules_update_list', 'add-first', -1, rcube_utils::rep_specialchars_output($this->gettext('nosieverules'))); + } + else foreach($this->script as $idx => $filter) { + if ($filter['disabled'] == 1) + $filter_name = $filter['name'] . ' (' . $this->gettext('disabled') . ')'; + else + $filter_name = $filter['name']; + + $tmp_output = new rcmail_output_html('settings'); + $dst = $idx - 1; + $up_link = $tmp_output->button(array('command' => 'plugin.sieverules.move', 'prop' => $dst, 'type' => 'link', 'class' => 'up_arrow', 'title' => 'sieverules.moveup', 'content' => ' ')); + $up_link = str_replace("'", "\'", $up_link); + $dst = $idx + 2; + $down_link = $tmp_output->button(array('command' => 'plugin.sieverules.move', 'prop' => $dst, 'type' => 'link', 'class' => 'down_arrow', 'title' => 'sieverules.movedown', 'content' => ' ')); + $down_link = str_replace("'", "\'", $down_link); + + $this->api->output->command('sieverules_update_list', $idx == 0 ? 'add-first' : 'add', 'rcmrow' . $idx, rcmail::JQ($filter_name), $down_link, $up_link); + } + + $this->api->output->send(); + } + + function gen_examples($attrib) + { + if (sizeof($this->examples) > 0) { + $this->api->output->add_gui_object('sieverules_examples', 'sieverules-examples'); + + $examples = new html_table(array('id' => 'sieverules-examples', 'class' => 'records-table', 'cellspacing' => '0', 'cols' => 1)); + $examples->add_header(null, $this->gettext('examplefilters')); + + foreach($this->examples as $idx => $filter) { + $examples->set_row_attribs(array('id' => 'rcmrowex' . $idx)); + $examples->add(null, rcmail::Q($filter['name'])); + } + + return html::tag('div', array('id' => 'sieverules-list-examples'), $examples->show($attrib)); + } + else { + return ''; + } + + } + + function gen_advswitch($attrib) + { + $input_adv = new html_checkbox(array('id' => 'adveditor', 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverules_adveditor(this);', 'value' => '1')); + $out = html::label('adveditor', rcmail::Q($this->gettext('adveditor'))) . $input_adv->show($this->action == 'plugin.sieverules.advanced' ? '1' : ''); + return html::tag('div', array('id' => 'advancedmode'), $out); + } + + function gen_rulelist($attrib) + { + $this->api->output->add_label('sieverules.delrulesetconf', 'sieverules.rulesetexists'); + + $rulesets = array(); + foreach ($this->sieve->list as $ruleset) { + array_push($rulesets, $ruleset); + } + sort($rulesets); + $activeruleset = $this->sieve->get_active(); + + $next_ruleset = ''; + for ($i = 0; $i < sizeof($rulesets); $i++) { + if ($rulesets[$i] == $this->current_ruleset) { + $i++; + + if ($i == sizeof($rulesets)) + $i = sizeof($rulesets) - 2; + + $next_ruleset = $rulesets[$i]; + break; + } + } + + $this->api->output->set_env('ruleset_total', sizeof($rulesets)); + $this->api->output->set_env('ruleset_active', $this->current_ruleset == $activeruleset ? True : False); + $this->api->output->set_env('ruleset_next', $next_ruleset); + + // new/rename ruleset dialog + $out = ''; + $table = new html_table(array('cols' => 2, 'class' => 'propform')); + $table->set_row_attribs(array('id' => 'sieverulesrsdialog_input')); + $table->add('title', html::label('sieverulesrsdialog_name', rcmail::Q($this->gettext('name')))); + $table->add(null, html::tag('input', array('type' => 'text', 'id' => 'sieverulesrsdialog_name', 'name' => '_name', 'value' => ''))); + + $select_ruleset = new html_select(array('id' => 'sieverulesrsdialog_ruleset')); + if (sizeof($this->sieve->list) == 1) { + $select_ruleset->add(rcmail::Q($this->gettext('nosieverulesets')), ''); + } + else foreach ($rulesets as $ruleset) { + if ($ruleset !== $this->current_ruleset) + $select_ruleset->add(rcmail::Q($ruleset), rcmail::Q($ruleset)); + } + + $table->set_row_attribs(array('id' => 'sieverulesrsdialog_select')); + $table->add('title', html::label('sieverulesrsdialog_ruleset', rcmail::Q($this->gettext('selectruleset')))); + $table->add(null, $select_ruleset->show()); + + $buttons = html::tag('input', array('type' => 'hidden', 'id' => 'sieverulesrsdialog_action', 'value' => '')); + $buttons .= html::tag('input', array('type' => 'button', 'class' => 'button mainaction', 'value' => $this->gettext('save'), 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverulesdialog_submit();')) . ' '; + + $out .= html::tag('h3', array('id' => 'sieverulesrsdialog_add'), rcmail::Q($this->gettext('newruleset'))); + $out .= html::tag('h3', array('id' => 'sieverulesrsdialog_edit', 'style' => 'display: none;'), rcmail::Q($this->gettext('renameruleset'))); + $out .= html::tag('h3', array('id' => 'sieverulesrsdialog_copyto', 'style' => 'display: none;'), rcmail::Q($this->gettext('copytoruleset'))); + $out .= html::tag('h3', array('id' => 'sieverulesrsdialog_copyfrom', 'style' => 'display: none;'), rcmail::Q($this->gettext('copyfromruleset'))); + $out .= $table->show(); + $out .= html::p(array('class' => 'formbuttons'), $buttons); + $out = html::tag('form', array(), $out); + $out = html::div(array('id' => 'sieverulesrsdialog', 'style' => 'display: none;'), $out); + + // add overlay input box to html page + $this->api->output->add_footer($out); + + $action = ($this->action == 'plugin.sieverules.advanced') ? 'plugin.sieverules.advanced' : 'plugin.sieverules'; + if ($attrib['type'] == 'link') { + $lis = ''; + + if (sizeof($this->sieve->list) == 0) { + $href = html::a(array('href' => "#", 'class' => 'active', 'onclick' => 'return false;'), rcmail::Q($this->gettext('nosieverulesets'))); + $lis .= html::tag('li', $href); + } + else foreach ($rulesets as $ruleset) { + $class = 'active'; + if ($ruleset === $this->current_ruleset) + $class .= ' selected'; + + $ruleset_text = $ruleset; + if ($ruleset === $activeruleset) + $ruleset_text = str_replace('%s', $ruleset, $this->gettext('activeruleset')); + + $href = html::a(array('href' => "#", 'class' => $class, 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverules_select_ruleset(\''. $ruleset .'\', \''. $action .'\');'), rcmail::Q($ruleset_text)); + $lis .= html::tag('li', null, $href); + } + + return $lis; + } + elseif ($attrib['type'] == 'select') { + $select_ruleset = new html_select(array('id' => 'rulelist', 'onchange' => rcmail_output::JS_OBJECT_NAME . '.sieverules_select_ruleset(this, \''. $action .'\');')); + + if (sizeof($this->sieve->list) == 0) { + $select_ruleset->add(rcmail::Q($this->gettext('nosieverulesets')), ''); + } + else foreach ($rulesets as $ruleset) { + if ($ruleset === $activeruleset) + $ruleset = str_replace('%s', $ruleset, $this->gettext('activeruleset')); + + $select_ruleset->add(rcmail::Q($ruleset), rcmail::Q($ruleset)); + } + + return html::label('rulelist', rcmail::Q($this->gettext('selectruleset'))) . $select_ruleset->show(rcmail::Q($this->current_ruleset)); + } + } + + function gen_setup() + { + $rcmail = rcube::get_instance(); + $text = ''; + $buttons = ''; + + if ($rcmail->config->get('sieverules_default_file', false) && is_readable($rcmail->config->get('sieverules_default_file'))) { + $text .= "

" . $this->gettext('importdefault'); + $buttons .= $this->api->output->button(array('command' => 'plugin.sieverules.import', 'prop' => '_import=_default_', 'type' => 'input', 'class' => 'button', 'label' => 'sieverules.usedefaultfilter')); + } + elseif ($rcmail->config->get('sieverules_default_file', false) && !is_readable($rcmail->config->get('sieverules_default_file'))) { + rcube::raise_error(array( + 'code' => 600, + 'type' => 'php', + 'file' => __FILE__, + 'line' => __LINE__, + 'message' => "SieveRules plugin: Unable to open default rule file" + ), true, false); + } + + $type = ''; + $ruleset = ''; + if (sizeof($this->sieve->list) > 0) { + if ($result = $this->sieve->check_import()) { + list($type, $name, $ruleset) = $result; + $text .= "

" . str_replace('%s', $name, $this->gettext('importother')); + $buttons .= (strlen($buttons) > 0) ? '  ' : ''; + $buttons .= $this->api->output->button(array('command' => 'plugin.sieverules.import', 'prop' => '_type=' . $type . '&_import=' . $ruleset, 'type' => 'input', 'class' => 'button', 'label' => 'sieverules.importfilter')); + } + + if ($rcmail->config->get('sieverules_multiplerules', false)) { + $text .= "

" . $this->gettext('copyexisting'); + $buttons .= (strlen($buttons) > 0) ? '  ' : ''; + $buttons .= $this->api->output->button(array('command' => 'plugin.sieverules.ruleset_dialog_setup', 'prop' => 'copyfrom_ruleset', 'type' => 'input', 'class' => 'button', 'label' => 'sieverules.copyexistingfilter')); + } + } + + if ($rcmail->config->get('sieverules_auto_load_default') && !$rcmail->config->get('sieverules_multiplerules', false) && $type != '' && $ruleset != '' && $ruleset == $this->sieve->get_active()) { + $this->import($type, $ruleset, false); + + if (isset($_GET['_framed']) || isset($_POST['_framed'])) { + $this->api->output->add_script("parent.". rcmail_output::JS_OBJECT_NAME .".goto_url('plugin.sieverules');"); + } + else { + // go to sieverules page + $rcmail->overwrite_action('plugin.sieverules'); + $this->api->output->send('sieverules.sieverules'); + } + } + else if ($rcmail->config->get('sieverules_auto_load_default') && is_readable($rcmail->config->get('sieverules_default_file')) && strlen($text) > 0 && strlen($buttons) > 0 && $type == '' && $ruleset == '') { + $this->import($type, '_default_', false); + + if (isset($_GET['_framed']) || isset($_POST['_framed'])) { + $this->api->output->add_script("parent.". rcmail_output::JS_OBJECT_NAME .".goto_url('plugin.sieverules');"); + } + else { + // go to sieverules page + $rcmail->overwrite_action('plugin.sieverules'); + $this->api->output->send('sieverules.sieverules'); + } + } + else if (strlen($text) > 0 && strlen($buttons) > 0) { + $out = "
". $this->gettext('noexistingfilters') . $text . "


\n"; + $out .= $buttons; + $out .= "  " . $this->api->output->button(array('command' => 'plugin.sieverules.import', 'prop' => '_import=_none_', 'type' => 'input', 'class' => 'button', 'label' => 'cancel')); + + $out = html::tag('p', array('style' => 'text-align: center; padding: 10px;'), "\n" . $out); + $out = html::tag('div', array('id' => 'prefs-title', 'class' => 'boxtitle'), rcmail::Q($this->gettext('importfilters'))) . $out; + + return $out; + } + else { + if ($rcmail->config->get('sieverules_auto_load_default') && !is_readable($rcmail->config->get('sieverules_default_file'))) + rcube::raise_error(array( + 'code' => 600, + 'type' => 'php', + 'file' => __FILE__, + 'line' => __LINE__, + 'message' => "SieveRules plugin: Unable to open default rule file" + ), true, false); + + $this->sieve->save(); + if (!($rcmail->config->get('sieverules_multiplerules', false) && sizeof($this->sieve->list) > 1)) + $this->sieve->set_active($this->current_ruleset); + + if (isset($_GET['_framed']) || isset($_POST['_framed'])) { + $this->api->output->add_script("parent.". rcmail_output::JS_OBJECT_NAME .".goto_url('plugin.sieverules');"); + } + else { + // go to sieverules page + $rcmail->overwrite_action('plugin.sieverules'); + $this->api->output->send('sieverules.sieverules'); + } + } + } + + function gen_form($attrib) + { + $rcmail = rcube::get_instance(); + $this->include_script('jquery.maskedinput.js'); + $this->api->output->add_label( + 'sieverules.norulename', 'sieverules.ruleexists', 'sieverules.noheader', + 'sieverules.headerbadchars', 'sieverules.noheadervalue', 'sieverules.sizewrongformat', + 'sieverules.noredirect', 'sieverules.redirectaddresserror', 'sieverules.noreject', 'sieverules.vacnodays', + 'sieverules.vacdayswrongformat', 'sieverules.vacnomsg', 'sieverules.notifynomethod', 'sieverules.missingfoldername', + 'sieverules.notifynomsg', 'sieverules.ruledeleteconfirm', + 'sieverules.actiondeleteconfirm', 'sieverules.notifyinvalidmethod', 'sieverules.nobodycontentpart', + 'sieverules.badoperator','sieverules.baddateformat','sieverules.badtimeformat','sieverules.vactoexp_err','editorwarning', + 'sieverules.eheadernoname','sieverules.eheadernoval'); + + $ext = $this->sieve->get_extensions(); + $iid = rcube_utils::get_input_value('_iid', rcube_utils::INPUT_GPC); + if ($iid == '') + $iid = sizeof($this->script); + + if (substr($iid, 0, 2) == 'ex') { + $cur_script = $this->examples[substr($iid, 2)]; + $this->api->output->set_env('eid', $iid); + $iid = sizeof($this->script); + $this->api->output->set_env('iid', $iid); + $example = true; + } + else { + $cur_script = $this->script[$iid]; + $this->api->output->set_env('iid', $iid); + $example = false; + + if (isset($this->script[$iid])) + $this->api->output->add_script("parent.". rcmail_output::JS_OBJECT_NAME .".sieverules_ready('".$iid."');"); + } + + if (sizeof($rcmail->config->get('sieverules_predefined_rules')) > 0) { + $predefined = array(); + foreach($rcmail->config->get('sieverules_predefined_rules') as $idx => $data) + array_push($predefined, array($data['type'], $data['header'], $data['operator'], $data['extra'], $data['target'])); + + $this->api->output->set_env('predefined_rules', $predefined); + } + + list($form_start, $form_end) = get_form_tags($attrib, 'plugin.sieverules.save'); + + $out = $form_start; + + $hidden_iid = new html_hiddenfield(array('name' => '_iid', 'value' => $iid)); + $out .= $hidden_iid->show(); + + // 'any' flag + if (sizeof($cur_script['tests']) == 1 && $cur_script['tests'][0]['type'] == 'true' && !$cur_script['tests'][0]['not']) + $any = true; + + // filter disable + $field_id = 'rcmfd_disable'; + $input_disable = new html_checkbox(array('name' => '_disable', 'id' => $field_id, 'value' => 1)); + + $out .= html::span('disableLink', html::label($field_id, rcmail::Q($this->gettext('disablerule'))) + . " " . $input_disable->show($cur_script['disabled'])); + + // filter name input + $field_id = 'rcmfd_name'; + $input_name = new html_inputfield(array('name' => '_name', 'id' => $field_id)); + + $out .= html::label($field_id, rcmail::Q($this->gettext('filtername'))); + $out .= " " . $input_name->show($cur_script['name']); + + $out .= "

"; + + if (sizeof($cur_script['tests']) == 1 && $cur_script['tests'][0]['type'] == 'true' && !$cur_script['tests'][0]['not']) + $join_any = true; + + $field_id = 'rcmfd_join_all'; + $input_join = new html_radiobutton(array('name' => '_join', 'id' => $field_id, 'value' => 'allof', 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverules_rule_join_radio(\'allof\')')); + $join_type = $input_join->show($cur_script['join'] && !$join_any ? 'allof' : ''); + $join_type .= " " . html::label($field_id, rcmail::Q($this->gettext('filterallof'))); + + $field_id = 'rcmfd_join_anyof'; + $input_join = new html_radiobutton(array('name' => '_join', 'id' => $field_id, 'value' => 'anyof', 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverules_rule_join_radio(\'anyof\')')); + $join_type .= " " . $input_join->show($cur_script['join'] && !$join_any ? '' : 'anyof'); + $join_type .= " " . html::label($field_id, rcmail::Q($this->gettext('filteranyof'))); + + $field_id = 'rcmfd_join_any'; + $input_join = new html_radiobutton(array('name' => '_join', 'id' => $field_id, 'value' => 'any', 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverules_rule_join_radio(\'any\')')); + $join_type .= " " . $input_join->show($join_any ? 'any' : ''); + $join_type .= " " . html::label($field_id, rcmail::Q($this->gettext('filterany'))); + + $rules_table = new html_table(array('id' => 'rules-table', 'class' => 'records-table', 'cellspacing' => '0', 'cols' => 5)); + $rules_table = $this->_rule_row($ext, $rules_table, null, $rcmail->config->get('sieverules_predefined_rules'), $attrib); + + if (!$join_any) { + if (!isset($cur_script)) + $rules_table = $this->_rule_row($ext, $rules_table, array(), $rcmail->config->get('sieverules_predefined_rules'), $attrib); + else foreach ($cur_script['tests'] as $rules) + $rules_table = $this->_rule_row($ext, $rules_table, $rules, $rcmail->config->get('sieverules_predefined_rules'), $attrib); + } + + $this->api->output->set_env('sieverules_rules', $rules_table->size()); + + $out .= html::tag('fieldset', null, html::tag('legend', null, rcmail::Q($this->gettext('messagesrules'))) + . rcmail::Q((!$rcmail->config->get('sieverules_use_elsif', true)) ? $this->gettext('sieveruleexp_stop'): $this->gettext('sieveruleexp')) . "

" + . $join_type . "

" + . $rules_table->show($attrib)); + + $rcmail->storage_init(); + $actions_table = new html_table(array('id' => 'actions-table', 'class' => 'records-table', 'cellspacing' => '0', 'cols' => 3)); + $actions_table = $this->_action_row($ext, $actions_table, 'rowid', null, $attrib, $example); + + if (!isset($cur_script)) + $actions_table = $this->_action_row($ext, $actions_table, 0, array(), $attrib, $example); + else foreach ($cur_script['actions'] as $idx => $actions) + $actions_table = $this->_action_row($ext, $actions_table, $idx, $actions, $attrib, $example); + + $this->api->output->set_env('sieverules_actions', $actions_table->size()); + $this->api->output->set_env('sieverules_htmleditor', $rcmail->config->get('htmleditor')); + + $out .= html::tag('fieldset', null, html::tag('legend', null, rcmail::Q($this->gettext('messagesactions'))) + . rcmail::Q($this->gettext('sieveactexp')). "

" + . $actions_table->show($attrib)); + + $out .= $form_end; + + // output sigs for vacation messages + $user_identities = $rcmail->user->list_identities(); + if (count($user_identities)) { + foreach ($user_identities as $sql_arr) { + // add signature to array + if (!empty($sql_arr['signature'])) { + $identity_id = $sql_arr['identity_id']; + $a_signatures[$identity_id]['text'] = $sql_arr['signature']; + + if ($sql_arr['html_signature'] == 1) { + $h2t = new rcube_html2text($a_signatures[$identity_id]['text'], false, false); + $a_signatures[$identity_id]['text'] = trim($h2t->get_text()); + } + } + } + + $this->api->output->set_env('signatures', $a_signatures); + } + + return $out; + } + + function move() + { + $this->_startup(); + + $src = rcube_utils::get_input_value('_src', rcube_utils::INPUT_GET); + $dst = rcube_utils::get_input_value('_dst', rcube_utils::INPUT_GET); + + $result = $this->sieve->script->move_rule($src, $dst); + $result = $this->sieve->save(); + + if ($result === true) + $this->api->output->command('sieverules_update_list', 'move', $src , $dst); + else + $this->api->output->command('display_message', $result !== false ? $result : $this->gettext('filtersaveerror'), 'error'); + + $this->api->output->send(); + } + + function save() + { + $rcmail = rcube::get_instance(); + $this->_startup(); + + $script = trim(rcube_utils::get_input_value('_script', rcube_utils::INPUT_POST, true)); + if ($script != '' && ($rcmail->config->get('sieverules_adveditor') == 1 || $rcmail->config->get('sieverules_adveditor') == 2)) { + $script = $this->_strip_val($script); + $save = $this->sieve->save($script); + + if ($save === true) { + $this->api->output->command('display_message', $this->gettext('filtersaved'), 'confirmation'); + $this->sieve->get_script(); + } + else { + $this->api->output->command('display_message', $save !== false ? $save : $this->gettext('filtersaveerror'), 'error'); + } + + // go to next step + $rcmail->overwrite_action('plugin.sieverules.advanced'); + $this->action = 'plugin.sieverules.advanced'; + $this->init_html(); + } + else { + // check if POST var limits have been reached + // code by Aleksander Machniak + $max_post = max(array( + ini_get('max_input_vars'), + ini_get('suhosin.request.max_vars'), + ini_get('suhosin.post.max_vars'), + )); + + $max_depth = max(array( + ini_get('suhosin.request.max_array_depth'), + ini_get('suhosin.post.max_array_depth'), + )); + + // check request size limit + if ($max_post && count($_POST, COUNT_RECURSIVE) >= $max_post) { + rcube::raise_error(array( + 'code' => 500, + 'type' => 'php', + 'file' => __FILE__, + 'line' => __LINE__, + 'message' => "SieveRules plugin: max_input_vars, suhosin.request.max_vars or suhosin.post.max_vars limit reached." + ), true, false); + + $this->api->output->command('display_message', $this->gettext('filtersaveerror'), 'error'); + + // go to next step + $rcmail->overwrite_action('plugin.sieverules.edit'); + $this->action = 'plugin.sieverules.edit'; + $this->init_html(); + + return; + } + // check request depth limits + else if ($max_depth && count($_POST['_test']) > $max_depth) { + rcube::raise_error(array( + 'code' => 500, + 'type' => 'php', + 'file' => __FILE__, + 'line' => __LINE__, + 'message' => "SieveRules plugin: suhosin.request.max_array_depth or suhosin.post.max_array_depth limit reached." + ), true, false); + + $this->api->output->command('display_message', $this->gettext('filtersaveerror'), 'error'); + + // go to next step + $rcmail->overwrite_action('plugin.sieverules.edit'); + $this->action = 'plugin.sieverules.edit'; + $this->init_html(); + + return; + } + + $name = trim(rcube_utils::get_input_value('_name', rcube_utils::INPUT_POST, true)); + $iid = trim(rcube_utils::get_input_value('_iid', rcube_utils::INPUT_POST)); + $join = trim(rcube_utils::get_input_value('_join', rcube_utils::INPUT_POST)); + $disabled = trim(rcube_utils::get_input_value('_disable', rcube_utils::INPUT_POST)); + + $tests = rcube_utils::get_input_value('_test', rcube_utils::INPUT_POST); + $headers = rcube_utils::get_input_value('_header', rcube_utils::INPUT_POST); + $bodyparts = rcube_utils::get_input_value('_bodypart', rcube_utils::INPUT_POST); + $ops = rcube_utils::get_input_value('_operator', rcube_utils::INPUT_POST); + $sizeops = rcube_utils::get_input_value('_size_operator', rcube_utils::INPUT_POST); + $dateops = rcube_utils::get_input_value('_date_operator', rcube_utils::INPUT_POST); + $spamtestops = rcube_utils::get_input_value('_spamtest_operator', rcube_utils::INPUT_POST); + $targets = rcube_utils::get_input_value('_target', rcube_utils::INPUT_POST, true); + $sizeunits = rcube_utils::get_input_value('_units', rcube_utils::INPUT_POST); + $contentparts = rcube_utils::get_input_value('_body_contentpart', rcube_utils::INPUT_POST); + $comparators = rcube_utils::get_input_value('_comparator', rcube_utils::INPUT_POST); + $advops = rcube_utils::get_input_value('_advoperator', rcube_utils::INPUT_POST); + $advtargets = rcube_utils::get_input_value('_advtarget', rcube_utils::INPUT_POST, true); + $actions = rcube_utils::get_input_value('_act', rcube_utils::INPUT_POST); + $folders = rcube_utils::get_input_value('_folder', rcube_utils::INPUT_POST); + $customfolders = rcube_utils::get_input_value('_customfolder', rcube_utils::INPUT_POST); + $addresses = rcube_utils::get_input_value('_redirect', rcube_utils::INPUT_POST); + $rejects = rcube_utils::get_input_value('_reject', rcube_utils::INPUT_POST); + $vacfroms = rcube_utils::get_input_value('_vacfrom', rcube_utils::INPUT_POST); + $vactos = rcube_utils::get_input_value('_vacto', rcube_utils::INPUT_POST); + $days = rcube_utils::get_input_value('_day', rcube_utils::INPUT_POST); + $handles = rcube_utils::get_input_value('_handle', rcube_utils::INPUT_POST); + $subjects = rcube_utils::get_input_value('_subject', rcube_utils::INPUT_POST, true); + $origsubjects = rcube_utils::get_input_value('_orig_subject', rcube_utils::INPUT_POST, true); + $msgs = rcube_utils::get_input_value('_msg', rcube_utils::INPUT_POST, true); + $htmlmsgs = rcube_utils::get_input_value('_htmlmsg', rcube_utils::INPUT_POST, true); + $charsets = rcube_utils::get_input_value('_vaccharset', rcube_utils::INPUT_POST); + $flags = rcube_utils::get_input_value('_imapflags', rcube_utils::INPUT_POST); + $nfroms = rcube_utils::get_input_value('_nfrom', rcube_utils::INPUT_POST); + $nimpts = rcube_utils::get_input_value('_nimpt', rcube_utils::INPUT_POST); + $nmethods = rcube_utils::get_input_value('_nmethod', rcube_utils::INPUT_POST); + $noptions = rcube_utils::get_input_value('_noption', rcube_utils::INPUT_POST); + $nmsgs = rcube_utils::get_input_value('_nmsg', rcube_utils::INPUT_POST, true); + $dateparts = rcube_utils::get_input_value('_datepart', rcube_utils::INPUT_POST); + $weekdays = rcube_utils::get_input_value('_weekday', rcube_utils::INPUT_POST); + $advweekdays = rcube_utils::get_input_value('_advweekday', rcube_utils::INPUT_POST); + $advweekdays = rcube_utils::get_input_value('_advweekday', rcube_utils::INPUT_POST); + $eheadnames = rcube_utils:: get_input_value('_eheadname', rcube_utils::INPUT_POST, true); + $eheadvals = rcube_utils::get_input_value('_eheadval', rcube_utils::INPUT_POST, true); + $eheadopps = rcube_utils::get_input_value('_eheadopp', rcube_utils::INPUT_POST); + $eheadindexes = rcube_utils::get_input_value('_eheadindex', rcube_utils::INPUT_POST); + + $script = array(); + $script['join'] = ($join == 'allof') ? true : false; + $script['name'] = $name; + $script['disabled'] = $disabled; + $script['tests'] = array(); + $script['actions'] = array(); + + // rules + $i = 0; + if ($join == 'any') { + $script['tests'][0]['type'] = 'true'; + } + else foreach($tests as $idx => $type) { + // ignore the first (default) row + if ($idx == 0) + continue; + + $header = $this->_strip_val($headers[$idx]); + $op = $this->_strip_val($ops[$idx]); + $bodypart = $this->_strip_val($bodyparts[$idx]); + $advop = $this->_strip_val($advops[$idx]); + $contentpart = $this->_strip_val($contentparts[$idx]); + $target = $this->_strip_val($targets[$idx]); + $advtarget = $this->_strip_val($advtargets[$idx]); + $comparator = $this->_strip_val($comparators[$idx]); + $datepart = $this->_strip_val($dateparts[$idx]); + $weekday = $this->_strip_val($weekdays[$idx]); + $advweekday = $this->_strip_val($advweekdays[$idx]); + + switch ($type) { + case 'size': + $sizeop = $this->_strip_val($sizeops[$idx]); + $sizeunit = $this->_strip_val($sizeunits[$idx]); + + $script['tests'][$i]['type'] = 'size'; + $script['tests'][$i]['operator'] = $sizeop; + $script['tests'][$i]['target'] = $target.$sizeunit; + break; + case 'spamtest': + case 'virustest': + $spamtestop = $this->_strip_val($spamtestops[$idx]); + + $script['tests'][$i]['type'] = $type; + $script['tests'][$i]['operator'] = $spamtestop; + $script['tests'][$i]['target'] = $target; + break; + case 'date': + $op = $this->_strip_val($dateops[$idx]); + + if ($datepart == 'weekday') + $target = $weekday; + + $script['tests'][$i]['datepart'] = $datepart; + case 'body': + $script['tests'][$i]['bodypart'] = $bodypart; + + if ($bodypart == 'content') + $script['tests'][$i]['contentpart'] = $contentpart; + else + $script['tests'][$i]['contentpart'] = ''; + case 'exists': + case 'header': + case 'address': + case 'envelope': + if (preg_match('/^not/', $op) || preg_match('/^not/', $advop)) + $script['tests'][$i]['not'] = true; + else + $script['tests'][$i]['not'] = ''; + + $op = preg_replace('/^not/', '', $op); + $advop = preg_replace('/^not/', '', $advop); + $header = preg_match('/[\s,]+/', $header) ? preg_split('/[\s,]+/', $header, -1, PREG_SPLIT_NO_EMPTY) : $header; + + if ($op == 'exists') { + $script['tests'][$i]['type'] = 'exists'; + $script['tests'][$i]['operator'] = 'exists'; + $script['tests'][$i]['header'] = $header; + } + elseif ($op == 'advoptions') { + $script['tests'][$i]['type'] = $type; + $script['tests'][$i]['operator'] = $advop; + $script['tests'][$i]['header'] = $header; + $script['tests'][$i]['target'] = $advtarget; + + if (substr($advop, 0, 5) == 'count' || substr($advop, 0, 5) == 'value') + $script['tests'][$i]['comparator'] = $comparator; + else + $script['tests'][$i]['comparator'] = ''; + } + else { + $script['tests'][$i]['type'] = $type; + $script['tests'][$i]['operator'] = $op; + $script['tests'][$i]['header'] = $header; + $script['tests'][$i]['target'] = $target; + } + break; + } + $i++; + } + + // actions + $i = 0; + foreach($actions as $idx => $type) { + // ignore the first (default) row + if ($idx == 0) + continue; + + $type = $this->_strip_val($type); + + $script['actions'][$i]['type'] = $type; + + switch ($type) { + case 'fileinto': + case 'fileinto_copy': + $folder = $this->_strip_val($folders[$idx], false, false); + $rcmail = rcube::get_instance(); + $rcmail->storage_init(); + $script['actions'][$i]['create'] = false; + if ($folder == '@@newfolder') { + $script['actions'][$i]['create'] = true; + $folder = $this->_strip_val($customfolders[$idx]); + $folder = $rcmail->config->get('sieverules_include_imap_root', true) ? $rcmail->storage->mod_folder($folder, 'IN') : $folder; + } + $script['actions'][$i]['target'] = $rcmail->config->get('sieverules_include_imap_root', true) ? $folder : $rcmail->storage->mod_folder($folder); + if ($rcmail->config->get('sieverules_folder_delimiter', false)) + $script['actions'][$i]['target'] = str_replace($rcmail->storage->get_hierarchy_delimiter(), $rcmail->config->get('sieverules_folder_delimiter'), $script['actions'][$i]['target']); + break; + case 'redirect': + case 'redirect_copy': + $address = $this->_strip_val($addresses[$idx]); + $script['actions'][$i]['target'] = $address; + break; + case 'reject': + case 'ereject': + $rejects = $this->_strip_val($rejects[$idx]); + $script['actions'][$i]['target'] = $rejects; + break; + case 'vacation': + $from = $this->_strip_val($vacfroms[$idx]); + $to = $this->_strip_val($vactos[$idx]); + $day = $this->_strip_val($days[$idx]); + $handle = $this->_strip_val($handles[$idx]); + $subject = $this->_strip_val($subjects[$idx]); + $origsubject = $this->_strip_val($origsubjects[$idx]); + $htmlmsg = $this->_strip_val($htmlmsgs[$idx]); + $msg = ($htmlmsg == "1") ? $msgs[$idx] : $this->_strip_val($msgs[$idx]); + $charset = $this->_strip_val($charsets[$idx]); + + // format from address + if (is_numeric($from)) { + if (is_array($identity_arr = $this->_rcmail_get_identity($from))) { + if ($identity_arr['val_string']) + $from = $identity_arr['val_string']; + } + else { + $from = null; + } + } + + $script['actions'][$i]['days'] = $day; + $script['actions'][$i]['subject'] = $subject; + $script['actions'][$i]['origsubject'] = $origsubject; + $script['actions'][$i]['from'] = $from; + $script['actions'][$i]['addresses'] = $to; + $script['actions'][$i]['handle'] = $handle; + $script['actions'][$i]['msg'] = $msg; + $script['actions'][$i]['htmlmsg'] = ($htmlmsg == "1") ? true : false; + $script['actions'][$i]['charset'] = $charset; + break; + case 'imapflags': + case 'imap4flags': + $flag = $this->_strip_val($flags[$idx]); + $script['actions'][$i]['target'] = $flag; + break; + case 'notify': + case 'enotify': + $from = $this->_strip_val($nfroms[$idx]); + $importance = $this->_strip_val($nimpts[$idx]); + $method = $this->_strip_val($nmethods[$idx]); + $option = $this->_strip_val($noptions[$idx]); + $msg = $this->_strip_val($nmsgs[$idx]); + + // format from address + if (is_numeric($from)) { + if (is_array($identity_arr = $this->_rcmail_get_identity($from))) { + if ($identity_arr['val_string']) + $from = $identity_arr['val_string']; + } + else { + $from = null; + } + } + + $script['actions'][$i]['from'] = $from; + $script['actions'][$i]['importance'] = $importance; + $script['actions'][$i]['method'] = $method; + $script['actions'][$i]['options'] = $option; + $script['actions'][$i]['msg'] = $msg; + break; + case 'editheaderadd': + case 'editheaderrem': + $name = $this->_strip_val($eheadnames[$idx]); + $value = $this->_strip_val($eheadvals[$idx]); + $script['actions'][$i]['name'] = $name; + $script['actions'][$i]['value'] = $value; + $script['actions'][$i]['index'] = $eheadindexes[$idx]; + + if (strlen($script['actions'][$i]['value']) > 0) + $script['actions'][$i]['operator'] = $eheadopps[$idx]; + + break; + } + + $i++; + } + + if (!isset($this->script[$iid])) + $result = $this->sieve->script->add_rule($script); + else + $result = $this->sieve->script->update_rule($iid, $script); + + if ($result === true) + $save = $this->sieve->save(); + + if ($save === true && $result === true && !($rcmail->config->get('sieverules_multiplerules', false) && sizeof($this->sieve->list) > 1)) + $save = $this->sieve->set_active($this->current_ruleset); + + if ($save === true && $result === true) { + $this->api->output->command('display_message', $this->gettext('filtersaved'), 'confirmation'); + + if ($script['disabled'] == 1) + $filter_name = $script['name'] . ' (' . $this->gettext('disabled') . ')'; + else + $filter_name = $script['name']; + + $dst = $iid - 1; + $up_link = $this->api->output->button(array('command' => 'plugin.sieverules.move', 'prop' => $dst, 'type' => 'link', 'class' => 'up_arrow', 'title' => 'sieverules.moveup', 'content' => ' ')); + $up_link = str_replace("'", "\'", $up_link); + $dst = $iid + 2; + $down_link = $this->api->output->button(array('command' => 'plugin.sieverules.move', 'prop' => $dst, 'type' => 'link', 'class' => 'down_arrow', 'title' => 'sieverules.movedown', 'content' => ' ')); + $down_link = str_replace("'", "\'", $down_link); + + if (!isset($this->script[$iid]) && sizeof($this->script) == 0) + $this->api->output->add_script("parent.". rcmail_output::JS_OBJECT_NAME .".sieverules_update_list('add-first', 'rcmrow". $iid ."', '". rcmail::Q($filter_name) ."', '". $down_link ."', '". $up_link ."');"); + elseif (!isset($this->script[$iid])) + $this->api->output->add_script("parent.". rcmail_output::JS_OBJECT_NAME .".sieverules_update_list('add', 'rcmrow". $iid ."', '". rcmail::Q($filter_name) ."', '". $down_link ."', '". $up_link ."');"); + else + $this->api->output->add_script("parent.". rcmail_output::JS_OBJECT_NAME .".sieverules_update_list('update', ". $iid .", '". rcmail::Q($filter_name) ."');"); + } + else { + if ($result === SIEVE_ERROR_BAD_ACTION) + $this->api->output->command('display_message', $this->gettext('filteractionerror'), 'error'); + elseif ($result === SIEVE_ERROR_NOT_FOUND) + $this->api->output->command('display_message', $this->gettext('filtermissingerror'), 'error'); + else + $this->api->output->command('display_message', $save !== false ? $save : $this->gettext('filtersaveerror'), 'error'); + } + + // update rule list + if ($this->sieve_error) + $this->script = array(); + else + $this->script = $this->sieve->script->as_array(); + + // go to next step + $rcmail->overwrite_action('plugin.sieverules.edit'); + $this->action = 'plugin.sieverules.edit'; + $this->init_html(); + } + } + + function delete() + { + $this->_startup(); + + $result = false; + $ids = rcube_utils::get_input_value('_iid', rcube_utils::INPUT_GET); + if (is_numeric($ids) && isset($this->script[$ids]) && !$this->sieve_error) { + $result = $this->sieve->script->delete_rule($ids); + if ($result === true) + $result = $this->sieve->save(); + } + + if ($result === true) { + $this->api->output->command('display_message', $this->gettext('filterdeleted'), 'confirmation'); + $this->api->output->add_script("parent.". rcmail_output::JS_OBJECT_NAME .".sieverules_update_list('delete', ". $ids .");"); + } + elseif ($result === SIEVE_ERROR_NOT_FOUND) + $this->api->output->command('display_message', $this->gettext('filtermissingerror'), 'error'); + else + $this->api->output->command('display_message', $result !== false ? $result : $this->gettext('filterdeleteerror'), 'error'); + + // update rule list + if ($this->sieve_error) + $this->script = array(); + else + $this->script = $this->sieve->script->as_array(); + + if (isset($_GET['_framed']) || isset($_POST['_framed'])) { + $this->api->output->add_script("parent.". rcmail_output::JS_OBJECT_NAME .".show_contentframe(false);"); + } + else { + // go to sieverules page + rcube::get_instance()->overwrite_action('plugin.sieverules'); + $this->action = 'plugin.sieverules'; + $this->init_html(); + } + } + + function import($type = null, $ruleset = null, $redirect = true) + { + $rcmail = rcube::get_instance(); + $this->_startup(); + + if (!$type && !$ruleset) { + $type = rcube_utils::get_input_value('_type', rcube_utils::INPUT_GET); + $ruleset = rcube_utils::get_input_value('_import', rcube_utils::INPUT_GET); + } + + if ($ruleset == '_default_') { + if ($rcmail->config->get('sieverules_default_file', false) && is_readable($rcmail->config->get('sieverules_default_file'))) { + $this->sieve->script->add_text(file_get_contents($rcmail->config->get('sieverules_default_file'))); + $save = $this->sieve->save(); + + if ($save === true && !($rcmail->config->get('sieverules_multiplerules', false) && sizeof($this->sieve->list) > 1)) + $save = $this->sieve->set_active($this->current_ruleset); + + if ($save === true) + $this->api->output->command('display_message', $this->gettext('filterimported'), 'confirmation'); + else + $this->api->output->command('display_message', $save !== false ? $save : $this->gettext('filterimporterror'), 'error'); + + // update rule list + if ($this->sieve_error) + $this->script = array(); + else + $this->script = $this->sieve->script->as_array(); + } + elseif ($rcmail->config->get('sieverules_default_file', false) && !is_readable($rcmail->config->get('sieverules_default_file'))) { + rcube::raise_error(array( + 'code' => 600, + 'type' => 'php', + 'file' => __FILE__, + 'line' => __LINE__, + 'message' => "SieveRules plugin: Unable to open default rule file" + ), true, false); + } + } + elseif ($ruleset == '_example_') { + if (rcube_utils::get_input_value('_eids', rcube_utils::INPUT_GET)) { + $pos = rcube_utils::get_input_value('_pos', rcube_utils::INPUT_GET); + $eids = explode(",", rcube_utils::get_input_value('_eids', rcube_utils::INPUT_GET)); + + if ($pos == 'end') + $pos = null; + else + $pos = substr($pos, 6); + + foreach ($eids as $eid) { + $this->sieve->script->add_rule($this->examples[substr($eid, 2)], $pos); + if ($pos) $pos++; + } + + $this->sieve->save(); + if (!($rcmail->config->get('sieverules_multiplerules', false) && sizeof($this->sieve->list) > 1)) + $this->sieve->set_active($this->current_ruleset); + + // update rule list + if ($this->sieve_error) + $this->script = array(); + else + $this->script = $this->sieve->script->as_array(); + } + } + elseif ($ruleset == '_none_') { + $this->sieve->save(); + if (!($rcmail->config->get('sieverules_multiplerules', false) && sizeof($this->sieve->list) > 1)) + $this->sieve->set_active($this->current_ruleset); + } + elseif ($ruleset == '_copy_') { + $this->rename_ruleset(true); + return; + } + elseif ($type != '' && $ruleset != '') { + $import = $this->sieve->do_import($type, $ruleset); + + if ($import) { + $this->script = $this->sieve->script->as_array(); + $this->sieve->save(); + + if (!($rcmail->config->get('sieverules_multiplerules', false) && sizeof($this->sieve->list) > 1)) + $this->sieve->set_active($this->current_ruleset); + + $this->api->output->command('display_message', $this->gettext('filterimported'), 'confirmation'); + } + else { + $this->script = array(); + if (!$redirect) $this->sieve->save(); + $this->api->output->command('display_message', $this->gettext('filterimporterror'), 'error'); + } + } + + if ($redirect) { + // go to sieverules page + $rcmail->overwrite_action('plugin.sieverules'); + $this->action = 'plugin.sieverules'; + $this->init_html(); + } + } + + function delete_ruleset() + { + $this->_startup(); + $this->sieve->del_script($this->current_ruleset); + + $this->current_ruleset = rcube_utils::get_input_value('_next', rcube_utils::INPUT_GET); + + rcube::get_instance()->overwrite_action('plugin.sieverules'); + $this->action = 'plugin.sieverules'; + $this->init_html(); + } + + function rename_ruleset($makeCopy = false) + { + $this->_startup(); + $script = $this->sieve->script->as_text(); + $active = $this->sieve->get_active() == $this->current_ruleset ? true : false; + + $old_ruleset = $this->current_ruleset; + $this->current_ruleset = rcube_utils::get_input_value('_new', rcube_utils::INPUT_GET, true); + $this->sieve->set_ruleset($this->current_ruleset); + $this->sieve->save($script); + + if (!$makeCopy) { + if ($active) + $this->sieve->set_active($this->current_ruleset); + + $this->sieve->del_script($old_ruleset); + } + + rcube::get_instance()->overwrite_action('plugin.sieverules'); + $this->action = 'plugin.sieverules'; + $this->init_html(); + } + + function enable_ruleset() + { + $this->_startup(); + $activeruleset = rcube_utils::get_input_value('_ruleset', rcube_utils::INPUT_GET, true); + $this->sieve->set_active($activeruleset); + + if (rcube_utils::get_input_value('_reload', rcube_utils::INPUT_GET, true) == "1") { + rcube::get_instance()->overwrite_action('plugin.sieverules'); + $this->action = 'plugin.sieverules'; + $this->init_html(); + } + else { + $rulesets = array(); + foreach ($this->sieve->list as $ruleset) + array_push($rulesets, $ruleset); + + sort($rulesets); + + foreach ($rulesets as $ruleset) { + if ($ruleset === $activeruleset) + $this->api->output->command('sieverules_add_ruleset', rcmail::Q($ruleset), rcmail::Q(str_replace('%s', $ruleset, $this->gettext('activeruleset')))); + else + $this->api->output->command('sieverules_add_ruleset', rcmail::Q($ruleset), rcmail::Q($ruleset)); + } + + $this->api->output->send(); + } + } + + function copy_filter() + { + $this->_startup(); + $script = $this->script[rcube_utils::get_input_value('_iid', rcube_utils::INPUT_GET)]; + $this->current_ruleset = rcube_utils::get_input_value('_dest', rcube_utils::INPUT_GET); + $this->_startup(); + $this->sieve->script->add_rule($script); + $this->sieve->save(); + + $this->api->output->command('display_message', $this->gettext('filtercopied'), 'confirmation'); + $this->api->output->send(); + } + + private function _startup() + { + $rcmail = rcube::get_instance(); + + if (!$this->sieve) { + include('lib/Net/Sieve.php'); + include('include/rcube_sieve.php'); + include('include/rcube_sieve_script.php'); + $rcmail = rcube::get_instance(); + + // try to connect to managesieve server and to fetch the script + $this->sieve = new rcube_sieve($_SESSION['username'], + $rcmail->decrypt($_SESSION['password']), + rcube_utils::idn_to_ascii(rcube_utils::parse_host($rcmail->config->get('sieverules_host'))), + $rcmail->config->get('sieverules_port'), $rcmail->config->get('sieverules_auth_type', NULL), + $rcmail->config->get('sieverules_usetls'), $this->current_ruleset, + $this->home, $rcmail->config->get('sieverules_use_elsif', true), + $rcmail->config->get('sieverules_auth_cid', NULL), $rcmail->config->get('sieverules_auth_pw', NULL)); + + if ($rcmail->config->get('sieverules_debug', false)) + $this->sieve->set_debug(true); + + $this->sieve_error = $this->sieve->error(); + + if ($this->sieve_error == SIEVE_ERROR_NOT_EXISTS) { + // load default rule set + if (($rcmail->config->get('sieverules_default_file', false) && is_readable($rcmail->config->get('sieverules_default_file'))) || sizeof($this->sieve->list) > 0) { + $rcmail->overwrite_action('plugin.sieverules.setup'); + $this->action = 'plugin.sieverules.setup'; + } + elseif ($rcmail->config->get('sieverules_default_file', false) && !is_readable($rcmail->config->get('sieverules_default_file'))) { + rcube::raise_error(array( + 'code' => 600, + 'type' => 'php', + 'file' => __FILE__, + 'line' => __LINE__, + 'message' => "SieveRules plugin: Unable to open default rule file" + ), true, false); + } + + // that's not exactly an error + $this->sieve_error = false; + } + elseif ($this->sieve_error) { + switch ($this->sieve_error) { + case SIEVE_ERROR_CONNECTION: + case SIEVE_ERROR_LOGIN: + $this->api->output->command('display_message', $this->gettext('filterconnerror'), 'error'); + break; + default: + $this->api->output->command('display_message', $this->gettext('filterunknownerror'), 'error'); + break; + } + + $this->api->output->set_env('sieveruleserror', true); + } + + // finally set script objects + if ($this->sieve_error) { + $this->script = array(); + } + else { + $this->script = $this->sieve->script->as_array(); + + // load example filters + if ($rcmail->config->get('sieverules_example_file', false) && is_readable($rcmail->config->get('sieverules_example_file'))) + $this->examples = $this->sieve->script->parse_text(file_get_contents($rcmail->config->get('sieverules_example_file'))); + elseif ($rcmail->config->get('sieverules_example_file', false) && !is_readable($rcmail->config->get('sieverules_example_file'))) + rcube::raise_error(array( + 'code' => 600, + 'type' => 'php', + 'file' => __FILE__, + 'line' => __LINE__, + 'message' => "SieveRules plugin: Unable to open example rule file" + ), true, false); + } + } + else { + $this->sieve->set_ruleset($this->current_ruleset); + $this->script = $this->sieve->script->as_array(); + } + } + + private function _rule_row($ext, $rules_table, $rule, $predefined_rules, $attrib) + { + $rcmail = rcube::get_instance(); + + if (!isset($rule)) + $rules_table->set_row_attribs(array('style' => 'display: none;')); + + if (in_array('regex', $ext) || in_array('relational', $ext) || in_array('subaddress', $ext)) + $this->operators['filteradvoptions'] = 'advoptions'; + + $header_style = 'visibility: hidden;'; + $op_style = ''; + $sizeop_style = 'display: none;'; + $dateop_style = 'display: none;'; + $spamtestop_style = 'display: none;'; + $target_style = ''; + $units_style = 'display: none;'; + $bodypart_style = 'display: none;'; + $datepart_style = 'display: none;'; + $advcontentpart_style = 'display: none;'; + $spam_prob_style = 'display: none;'; + $virus_prob_style = 'display: none;'; + $weekdays_style = 'display: none;'; + $advweekdays_style = 'display: none;'; + $advtarget_style = ''; + + $test = 'header'; + $selheader = 'Subject'; + $header = 'Subject'; + $op = 'contains'; + $sizeop = 'under'; + $spamtestop = 'ge'; + $target = ''; + $target_size = ''; + $units = 'KB'; + $bodypart = ''; + $advcontentpart = ''; + + $predefined = -1; + foreach($predefined_rules as $idx => $data) { + if (($data['type'] == $rule['type'] || $rule['type'] == 'exists') + && $data['header'] == $rule['header'] + && $data['operator'] == ($rule['not'] ? 'not' : '') . $rule['operator'] + && $data['target'] == $rule['target']) { + $predefined = $idx; + break; + } + } + + if ($predefined > -1) { + $op_style = 'display: none;'; + $target_style = 'display: none;'; + $selheader = $rule['type'] . '::predefined_' . $predefined; + $test = $rule['type']; + + if ($rule['type'] == 'size') { + $header = 'size'; + $sizeop = $rule['operator']; + preg_match('/^([0-9]+)(K|M|G)*$/', $rule['target'], $matches); + $target = $matches[1]; + $target_size = 'short'; + $units = $matches[2]; + } + elseif ($rule['type'] == 'spamtest') { + $header = 'spamtest'; + $spamtestop = $rule['operator']; + $target = $rule['target']; + } + elseif ($rule['type'] == 'virustest') { + $header = 'virustest'; + $spamtestop = $rule['operator']; + $target = $rule['target']; + } + elseif ($rule['type'] == 'exists') { + $selheader = $predefined_rules[$predefined]['type'] . '::predefined_' . $predefined; + $header = $rule['header']; + $op = ($rule['not'] ? 'not' : '') . $rule['operator']; + } + else { + $header = $rule['header']; + $op = ($rule['not'] ? 'not' : '') . $rule['operator']; + $target = $rule['target']; + } + } + elseif ((isset($rule['type']) && $rule['type'] != 'exists') && in_array($rule['type'] . '::' . $rule['header'], $this->headers)) { + $target_style = $rule['operator'] == 'exists' ? 'display: none;' : ''; + + $selheader = $rule['type'] . '::' . $rule['header']; + $test = $rule['type']; + $header = $rule['header']; + $op = ($rule['not'] ? 'not' : '') . $rule['operator']; + $target = $rule['target']; + } + elseif ((isset($rule['type']) && $rule['type'] == 'exists') && $this->_in_headerarray($rule['header'], $this->headers) != false) { + $target_style = $rule['operator'] == 'exists' ? 'display: none;' : ''; + + $selheader = $this->_in_headerarray($rule['header'], $this->headers) . '::' . $rule['header']; + $test = $rule['type']; + $header = $rule['header']; + $op = ($rule['not'] ? 'not' : '') . $rule['operator']; + } + elseif (isset($rule['type']) && $rule['type'] == 'size') { + $op_style = 'display: none;'; + $sizeop_style = ''; + $units_style = ''; + + $selheader = 'size::size'; + $header = 'size'; + $test = 'size'; + $sizeop = $rule['operator']; + preg_match('/^([0-9]+)(K|M|G)*$/', $rule['target'], $matches); + $target = $matches[1]; + $target_size = 'short'; + $units = $matches[2]; + } + elseif (isset($rule['type']) && $rule['type'] == 'body') { + $bodypart_style = ''; + $header_style = 'display: none;'; + + $selheader = 'body::body'; + $header = 'body'; + $test = 'body'; + $bodypart = $rule['bodypart']; + $op = ($rule['not'] ? 'not' : '') . $rule['operator']; + $target = $rule['target']; + + if ($rule['contentpart'] != '') { + $advcontentpart = $rule['contentpart']; + $advcontentpart_style = ''; + } + } + elseif (isset($rule['type']) && $rule['type'] == 'spamtest') { + $op_style = 'display: none;'; + $target_style = 'display: none;'; + $spamtestop_style = ''; + $spam_prob_style = ''; + + $test = $rule['type']; + $selheader = 'spamtest::spamtest'; + $header = 'spamtest'; + $spamtestop = $rule['operator']; + $target = $rule['target']; + $spam_probability = $rule['target']; + } + elseif (isset($rule['type']) && $rule['type'] == 'virustest') { + $op_style = 'display: none;'; + $target_style = 'display: none;'; + $spamtestop_style = ''; + $virus_prob_style = ''; + + $test = $rule['type']; + $selheader = 'virustest::virustest'; + $header = 'virustest'; + $spamtestop = $rule['operator']; + $target = $rule['target']; + $virus_probability = $rule['target']; + } + elseif (isset($rule['type']) && $rule['type'] == 'date') { + $op_style = 'display: none;'; + $dateop_style = ''; + $header_style = 'display: none;'; + $datepart_style = ''; + + if ($rule['datepart'] == 'weekday') { + $target_style = 'display: none;'; + $advtarget_style = 'display: none;'; + $weekdays_style = ''; + $advweekdays_style = ''; + } + + $test = $rule['type']; + $selheader = 'date::' . $rule['header']; + $header = $rule['header']; + $datepart = $rule['datepart']; + $dateop = ($rule['not'] ? 'not' : '') . $rule['operator']; + $target = $rule['target']; + } + elseif (isset($rule['type']) && $rule['type'] != 'true') { + $header_style = ''; + $target_style = $rule['operator'] == 'exists' ? 'display: none;' : ''; + + $selheader = 'header::other'; + $test = 'header'; + $header = is_array($rule['header']) ? join(', ', $rule['header']) : $rule['header']; + $op = ($rule['not'] ? 'not' : '') . $rule['operator']; + $target = $rule['target']; + } + + // check for advanced options + $showadvanced = false; + if (!in_array($op, $this->operators) || $rule['comparator'] != '' || $rule['contentpart'] != '') { + $showadvanced = true; + $target_style = 'display: none;'; + } + + $select_header = new html_select(array('name' => "_selheader[]", 'onchange' => rcmail_output::JS_OBJECT_NAME . '.sieverules_header_select(this)')); + foreach($this->headers as $name => $val) { + if (($val == 'envelope' && in_array('envelope', $ext)) || $val != 'envelope') + $select_header->add(rcmail::Q($this->gettext($name)), rcmail::Q($val)); + } + + if (in_array('body', $ext)) + $select_header->add(rcmail::Q($this->gettext('body')), rcmail::Q('body::body')); + + if (in_array('spamtest', $ext)) + $select_header->add(rcmail::Q($this->gettext('spamtest')), rcmail::Q('spamtest::spamtest')); + + if (in_array('virustest', $ext)) + $select_header->add(rcmail::Q($this->gettext('virustest')), rcmail::Q('virustest::virustest')); + + foreach($predefined_rules as $idx => $data) + $select_header->add(rcmail::Q($data['name']), rcmail::Q($data['type'] . '::predefined_' . $idx)); + + if (in_array('date', $ext)) + $select_header->add(rcmail::Q($this->gettext('arrival')), rcmail::Q('date::currentdate')); + + $select_header->add(rcmail::Q($this->gettext('size')), rcmail::Q('size::size')); + $select_header->add(rcmail::Q($this->gettext('otherheader')), rcmail::Q('header::other')); + $input_test = new html_hiddenfield(array('name' => '_test[]', 'value' => $test)); + $rules_table->add('selheader', $select_header->show($selheader) . $input_test->show()); + + $help_button = html::img(array('src' => $attrib['helpicon'], 'alt' => $this->gettext('sieveruleheaders'), 'border' => 0, 'style' => 'margin-left: 4px;')); + $help_button = html::a(array('name' => '_headerhlp', 'href' => "#", 'onclick' => 'return '. rcmail_output::JS_OBJECT_NAME .'.sieverules_xheaders(this);', 'title' => $this->gettext('sieveruleheaders'), 'style' => $header_style), $help_button); + + $input_header = new html_inputfield(array('name' => '_header[]', 'style' => $header_style, 'class' => 'short')); + $select_bodypart = new html_select(array('name' => '_bodypart[]', 'onchange' => rcmail_output::JS_OBJECT_NAME . '.sieverules_bodypart_select(this)', 'style' => $bodypart_style)); + $select_bodypart->add(rcmail::Q($this->gettext('auto')), rcmail::Q('')); + $select_bodypart->add(rcmail::Q($this->gettext('raw')), rcmail::Q('raw')); + $select_bodypart->add(rcmail::Q($this->gettext('text')), rcmail::Q('text')); + $select_bodypart->add(rcmail::Q($this->gettext('other')), rcmail::Q('content')); + $select_datepart = new html_select(array('name' => '_datepart[]', 'onchange' => rcmail_output::JS_OBJECT_NAME . '.sieverules_datepart_select(this)','style' => $datepart_style)); + $select_datepart->add(rcmail::Q($this->gettext('date')), rcmail::Q('date')); + $select_datepart->add(rcmail::Q($this->gettext('time')), rcmail::Q('time')); + $select_datepart->add(rcmail::Q($this->gettext('weekday')), rcmail::Q('weekday')); + $rules_table->add('header', $input_header->show($header) . $help_button . $select_bodypart->show($bodypart) . $select_datepart->show($datepart)); + + $select_op = new html_select(array('name' => "_operator[]", 'onchange' => rcmail_output::JS_OBJECT_NAME . '.sieverules_rule_op_select(this)', 'style' => $op_style)); + foreach($this->operators as $name => $val) + $select_op->add(rcmail::Q($this->gettext($name)), $val); + + $select_size_op = new html_select(array('name' => "_size_operator[]", 'style' => $sizeop_style)); + $select_size_op->add(rcmail::Q($this->gettext('filterunder')), 'under'); + $select_size_op->add(rcmail::Q($this->gettext('filterover')), 'over'); + + $select_date_op = new html_select(array('name' => "_date_operator[]", 'style' => $dateop_style)); + $select_date_op->add(rcmail::Q($this->gettext('filteris')), 'is'); + $select_date_op->add(rcmail::Q($this->gettext('filterisnot')), 'notis'); + + if (in_array('relational', $ext)) { + $select_date_op->add(rcmail::Q($this->gettext('filterbefore')), 'value "lt"'); + $select_date_op->add(rcmail::Q($this->gettext('filterafter')), 'value "gt"'); + } + + $select_spamtest_op = new html_select(array('name' => "_spamtest_operator[]", 'style' => $spamtestop_style)); + $select_spamtest_op->add(rcmail::Q($this->gettext('spamlevelequals')), 'eq'); + $select_spamtest_op->add(rcmail::Q($this->gettext('spamlevelislessthanequal')), 'le'); + $select_spamtest_op->add(rcmail::Q($this->gettext('spamlevelisgreaterthanequal')), 'ge'); + + if ($showadvanced) + $rules_table->add('op', $select_op->show('advoptions') . $select_size_op->show($sizeop) . $select_date_op->show($dateop) . $select_spamtest_op->show($spamtestop)); + else + $rules_table->add('op', $select_op->show($op) . $select_size_op->show($sizeop) . $select_date_op->show($dateop) . $select_spamtest_op->show($spamtestop)); + + $input_target = new html_inputfield(array('name' => '_target[]', 'style' => $target_style, 'class' => $target_size)); + + $select_units = new html_select(array('name' => "_units[]", 'style' => $units_style, 'class' => 'short')); + $select_units->add(rcmail::Q($this->gettext('B')), ''); + $select_units->add(rcmail::Q($this->gettext('KB')), 'K'); + $select_units->add(rcmail::Q($this->gettext('MB')), 'M'); + + $select_spam_probability = new html_select(array('name' => "_spam_probability[]", 'style' => $spam_prob_style, 'class' => 'long')); + $select_spam_probability->add(rcmail::Q($this->gettext('notchecked')), '0'); + $select_spam_probability->add(rcmail::Q("0%"), '1'); + $select_spam_probability->add(rcmail::Q("10%"), '2'); + $select_spam_probability->add(rcmail::Q("20%"), '3'); + $select_spam_probability->add(rcmail::Q("40%"), '4'); + $select_spam_probability->add(rcmail::Q("50%"), '5'); + $select_spam_probability->add(rcmail::Q("60%"), '6'); + $select_spam_probability->add(rcmail::Q("70%"), '7'); + $select_spam_probability->add(rcmail::Q("80%"), '8'); + $select_spam_probability->add(rcmail::Q("90%"), '9'); + $select_spam_probability->add(rcmail::Q("100%"), '10'); + + $select_virus_probability = new html_select(array('name' => "_virus_probability[]", 'style' => $virus_prob_style, 'class' => 'long')); + $select_virus_probability->add(rcmail::Q($this->gettext('notchecked')), '0'); + $select_virus_probability->add(rcmail::Q($this->gettext('novirus')), '1'); + $select_virus_probability->add(rcmail::Q($this->gettext('virusremoved')), '2'); + $select_virus_probability->add(rcmail::Q($this->gettext('viruscured')), '3'); + $select_virus_probability->add(rcmail::Q($this->gettext('possiblevirus')), '4'); + $select_virus_probability->add(rcmail::Q($this->gettext('definitevirus')), '5'); + + $select_weekdays = new html_select(array('name' => "_weekday[]", 'style' => $weekdays_style, 'class' => 'long')); + $select_weekdays->add(rcmail::Q($this->gettext('sunday')), '0'); + $select_weekdays->add(rcmail::Q($this->gettext('monday')), '1'); + $select_weekdays->add(rcmail::Q($this->gettext('tuesday')), '2'); + $select_weekdays->add(rcmail::Q($this->gettext('wednesday')), '3'); + $select_weekdays->add(rcmail::Q($this->gettext('thursday')), '4'); + $select_weekdays->add(rcmail::Q($this->gettext('friday')), '5'); + $select_weekdays->add(rcmail::Q($this->gettext('saturday')), '6'); + + $rules_table->add('target', $select_weekdays->show($target) . $select_spam_probability->show($spam_probability) . $select_virus_probability->show($virus_probability) . $input_target->show($target) . " " . $select_units->show($units)); + + $add_button = $this->api->output->button(array('command' => 'plugin.sieverules.add_rule', 'type' => 'link', 'class' => 'add', 'title' => 'sieverules.addsieverule', 'content' => ' ')); + $delete_button = $this->api->output->button(array('command' => 'plugin.sieverules.del_rule', 'type' => 'link', 'class' => 'delete', 'classact' => 'delete_act', 'title' => 'sieverules.deletesieverule', 'content' => ' ')); + $rules_table->add('control', $delete_button . $add_button); + + if (isset($rule)) + $rowid = $rules_table->size(); + else + $rowid = 'rowid'; + + $headers_table = new html_table(array('class' => 'records-table', 'cellspacing' => '0', 'cols' => 4)); + $headers_table->add(array('colspan' => 4, 'style' => 'white-space: normal;'), rcmail::Q($this->gettext('sieveheadershlp'))); + + $col1 = ''; + $col2 = ''; + $col3 = ''; + $col4 = ''; + $other_headers = $rcmail->config->get('sieverules_other_headers'); + sort($other_headers); + $col_length = sizeof($other_headers) / 4; + $col_length = ceil($col_length); + foreach ($other_headers as $idx => $xheader) { + $input_xheader = new html_radiobutton(array('id' => $xheader . '_' . $rowid, 'name' => '_xheaders_' . $rowid . '[]', 'value' => $xheader, 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverules_set_xheader(this)', 'class' => 'radio')); + $xheader_show = $input_xheader->show($header) . " " . html::label($xheader . '_' . $rowid, rcmail::Q($xheader)); + + if ($idx < $col_length) + $col1 .= $xheader_show . "
"; + elseif ($idx < $col_length * 2) + $col2 .= $xheader_show . "
"; + elseif ($idx < $col_length * 3) + $col3 .= $xheader_show . "
"; + elseif ($idx < $col_length * 4) + $col4 .= $xheader_show . "
"; + } + + $headers_table->add(array('style' => 'vertical-align: top; width: 25%;'), $col1); + $headers_table->add(array('style' => 'vertical-align: top; width: 25%;'), $col2); + $headers_table->add(array('style' => 'vertical-align: top; width: 25%;'), $col3); + $headers_table->add(array('style' => 'vertical-align: top; width: 25%;'), $col4); + + $rules_table->set_row_attribs(array('style' => 'display: none;')); + $rules_table->add(array('colspan' => 5), $headers_table->show()); + + $advanced_table = new html_table(array('class' => 'records-table', 'cellspacing' => '0', 'cols' => 2)); + $advanced_table->add(array('colspan' => 2, 'style' => 'white-space: normal;'), rcmail::Q($this->gettext('advancedoptions'))); + + $help_button = html::img(array('src' => $attrib['helpicon'], 'alt' => $this->gettext('contentpart'), 'border' => 0, 'style' => 'margin-left: 4px;')); + $help_button = html::a(array('href' => "#", 'onclick' => 'return '. rcmail_output::JS_OBJECT_NAME .'.sieverules_help(this, ' . $advanced_table->size() . ');', 'title' => $this->gettext('contentpart')), $help_button); + + $field_id = 'rcmfd_advcontentpart_'. $rowid; + $advanced_table->set_row_attribs(array('style' => $advcontentpart_style)); + $input_advcontentpart = new html_inputfield(array('id' => $field_id, 'name' => '_body_contentpart[]', 'class' => 'short')); + $advanced_table->add(array('style' => 'white-space: normal;', 'class' => 'selheader'), html::label($field_id, rcmail::Q($this->gettext('bodycontentpart')))); + $advanced_table->add(array('style' => 'white-space: normal;'), $input_advcontentpart->show($advcontentpart) . $help_button); + + $advanced_table->set_row_attribs(array('class' => 'advhelp', 'style' => 'display: none;')); + $advanced_table->add(array('colspan' => 2, 'class' => 'vacdaysexp'), $this->gettext('contentpartexp')); + + $field_id = 'rcmfd_advoperator_'. $rowid; + $select_advop = new html_select(array('id' => $field_id, 'name' => "_advoperator[]", 'onchange' => rcmail_output::JS_OBJECT_NAME . '.sieverules_rule_advop_select(this)')); + + if (in_array('regex', $ext)) { + $select_advop->add(rcmail::Q($this->gettext('filterregex')), 'regex'); + $select_advop->add(rcmail::Q($this->gettext('filternotregex')), 'notregex'); + } + + if (in_array('relational', $ext)) { + $select_advop->add(rcmail::Q($this->gettext('countisgreaterthan')), 'count "gt"'); + $select_advop->add(rcmail::Q($this->gettext('countisgreaterthanequal')), 'count "ge"'); + $select_advop->add(rcmail::Q($this->gettext('countislessthan')), 'count "lt"'); + $select_advop->add(rcmail::Q($this->gettext('countislessthanequal')), 'count "le"'); + $select_advop->add(rcmail::Q($this->gettext('countequals')), 'count "eq"'); + $select_advop->add(rcmail::Q($this->gettext('countnotequals')), 'count "ne"'); + $select_advop->add(rcmail::Q($this->gettext('valueisgreaterthan')), 'value "gt"'); + $select_advop->add(rcmail::Q($this->gettext('valueisgreaterthanequal')), 'value "ge"'); + $select_advop->add(rcmail::Q($this->gettext('valueislessthan')), 'value "lt"'); + $select_advop->add(rcmail::Q($this->gettext('valueislessthanequal')), 'value "le"'); + $select_advop->add(rcmail::Q($this->gettext('valueequals')), 'value "eq"'); + $select_advop->add(rcmail::Q($this->gettext('valuenotequals')), 'value "ne"'); + } + + if (in_array('subaddress', $ext)) { + $select_advop->add(rcmail::Q($this->gettext('userpart')), 'user'); + $select_advop->add(rcmail::Q($this->gettext('notuserpart')), 'notuser'); + $select_advop->add(rcmail::Q($this->gettext('detailpart')), 'detail'); + $select_advop->add(rcmail::Q($this->gettext('notdetailpart')), 'notdetail'); + $select_advop->add(rcmail::Q($this->gettext('domainpart')), 'domain'); + $select_advop->add(rcmail::Q($this->gettext('notdomainpart')), 'notdomain'); + } + + $advanced_table->add(array('style' => 'white-space: normal;', 'class' => 'selheader'), html::label($field_id, rcmail::Q($this->gettext('operator')))); + $advanced_table->add(array('style' => 'white-space: normal;'), $select_advop->show($op)); + + $field_id = 'rcmfd_comparator_'. $rowid; + if (substr($op, 0, 5) == 'count' || substr($op, 0, 5) == 'value') + $select_comparator = new html_select(array('id' => $field_id, 'name' => "_comparator[]")); + else + $select_comparator = new html_select(array('id' => $field_id, 'name' => "_comparator[]", 'disabled' => 'disabled')); + + $select_comparator->add(rcmail::Q($this->gettext('i;ascii-casemap')), ''); + $select_comparator->add(rcmail::Q($this->gettext('i;octet')), 'i;octet'); + + foreach ($ext as $extension) { + if (substr($extension, 0, 11) == 'comparator-' && $extension != 'comparator-i;ascii-casemap' && $extension != 'comparator-i;octet') + $select_comparator->add(rcmail::Q($this->gettext(substr($extension, 11))), substr($extension, 11)); + } + + $advanced_table->add(array('style' => 'white-space: normal;', 'class' => 'selheader'), html::label($field_id, rcmail::Q($this->gettext('comparator')))); + $advanced_table->add(array('style' => 'white-space: normal;'), $select_comparator->show($rule['comparator'])); + + $select_advweekdays = new html_select(array('name' => "_advweekday[]", 'style' => $advweekdays_style)); + $select_advweekdays->add(rcmail::Q($this->gettext('sunday')), '0'); + $select_advweekdays->add(rcmail::Q($this->gettext('monday')), '1'); + $select_advweekdays->add(rcmail::Q($this->gettext('tuesday')), '2'); + $select_advweekdays->add(rcmail::Q($this->gettext('wednesday')), '3'); + $select_advweekdays->add(rcmail::Q($this->gettext('thursday')), '4'); + $select_advweekdays->add(rcmail::Q($this->gettext('friday')), '5'); + $select_advweekdays->add(rcmail::Q($this->gettext('saturday')), '6'); + + $field_id = 'rcmfd_advtarget_'. $rowid; + $input_advtarget = new html_inputfield(array('id' => $field_id, 'name' => '_advtarget[]', 'style' => $advtarget_style)); + $advanced_table->add(array('style' => 'white-space: normal;', 'class' => 'selheader'), html::label($field_id, rcmail::Q($this->gettext('teststring')))); + $advanced_table->add(array('style' => 'white-space: normal;'), $input_advtarget->show($target) . $select_advweekdays->show($target)); + + if (!($showadvanced && $predefined == -1)) + $rules_table->set_row_attribs(array('style' => 'display: none;')); + $rules_table->add(array('colspan' => 5), $advanced_table->show()); + + return $rules_table; + } + + private function _action_row($ext, $actions_table, $rowid, $action, $attrib, $example) + { + $rcmail = rcube::get_instance(); + static $a_mailboxes; + + if (!isset($action)) + $actions_table->set_row_attribs(array('style' => 'display: none;')); + + $help_icon = html::img(array('src' => $attrib['helpicon'], 'alt' => $this->gettext('messagehelp'), 'border' => 0)); + + $vacadvstyle = ($action['type'] != 'vacation' && $this->force_vacto) ? '' : 'display: none;'; + $vacadvstyle_from = ($this->show_vacfrom) ? $vacadvstyle : 'display: none;'; + $vacadvstyle_handle = ($this->show_vachandle) ? $vacadvstyle : 'display: none;'; + $vacadvclass_from = ($this->show_vacfrom) ? 'advanced' : 'disabled'; + $vacadvclass_handle = ($this->show_vachandle) ? 'advanced' : 'disabled'; + $vacshowadv = ($action['type'] != 'vacation' && $this->force_vacto) ? '1' : ''; + $noteadvstyle = 'display: none;'; + $noteshowadv = ''; + $eheadadvstyle = 'display: none;'; + $eheadshowadv = ''; + + // setup allowed actions + $allowed_actions = array(); + $config_actions = $rcmail->config->get('sieverules_allowed_actions', array()); + if (in_array('fileinto', $ext) && ($config_actions['fileinto'] || $action['type'] == 'fileinto')) + $allowed_actions['fileinto'] = $this->gettext('messagemoveto'); + if (in_array('fileinto', $ext) && in_array('copy', $ext) && ($config_actions['fileinto'] || $action['type'] == 'fileinto')) + $allowed_actions['fileinto_copy'] = $this->gettext('messagecopyto'); + if (in_array('vacation', $ext) && ($config_actions['vacation'] || $action['type'] == 'vacation')) + $allowed_actions['vacation'] = $this->gettext('messagevacation'); + if (in_array('reject', $ext) && ($config_actions['reject'] || $action['type'] == 'reject')) + $allowed_actions['reject'] = $this->gettext('messagereject'); + elseif (in_array('ereject', $ext) && ($config_actions['reject'] || $action['type'] == 'ereject')) + $allowed_actions['ereject'] = $this->gettext('messagereject'); + if (in_array('imap4flags', $ext) && ($config_actions['imapflags'] || $action['type'] == 'imap4flags')) + $allowed_actions['imap4flags'] = $this->gettext('messageimapflags'); + elseif (in_array('imapflags', $ext) && ($config_actions['imapflags'] || $action['type'] == 'imapflags')) + $allowed_actions['imapflags'] = $this->gettext('messageimapflags'); + if (in_array('notify', $ext) && ($config_actions['notify'] || $action['type'] == 'notify')) + $allowed_actions['notify'] = $this->gettext('messagenotify'); + elseif (in_array('enotify', $ext) && ($config_actions['notify'] || $action['type'] == 'enotify')) + $allowed_actions['enotify'] = $this->gettext('messagenotify'); + if (in_array('editheader', $ext) && ($config_actions['editheaderadd'] || $action['type'] == 'editheaderadd')) + $allowed_actions['editheaderadd'] = $this->gettext('addheader'); + if (in_array('editheader', $ext) && ($config_actions['editheaderrem'] || $action['type'] == 'editheaderrem')) + $allowed_actions['editheaderrem'] = $this->gettext('removeheader'); + if ($config_actions['redirect'] || $action['type'] == 'redirect') + $allowed_actions['redirect'] = $this->gettext('messageredirect'); + if (in_array('copy', $ext) && ($config_actions['redirect'] || $action['type'] == 'redirect_copy')) + $allowed_actions['redirect_copy'] = $this->gettext('messageredirectcopy'); + if ($config_actions['keep'] || $action['type'] == 'keep') + $allowed_actions['keep'] = $this->gettext('messagekeep'); + if ($config_actions['discard'] || $action['type'] == 'discard') + $allowed_actions['discard'] = $this->gettext('messagediscard'); + if ($config_actions['stop'] || $action['type'] == 'stop') + $allowed_actions['stop'] = $this->gettext('messagestop'); + + // set the default action + reset($allowed_actions); + $method = key($allowed_actions); + + $folder = 'INBOX'; + $reject = ''; + + $identity = $rcmail->user->get_identity(); + if ($this->show_vacfrom) + $vacfrom = (in_array('variables', $ext)) ? 'auto' : $identity['email']; + else + $vacfrom = null; + + $vacto = null; + $address = ''; + $days = ''; + $handle = ''; + $subject = ''; + $origsubject = ''; + $msg = ''; + $charset = RCUBE_CHARSET; + $flags = ''; + $nfrom = ''; + $nimpt = ''; + $nmethod = ''; + $noptions = ''; + $nmsg = ''; + + if ($action['type'] == 'fileinto' || $action['type'] == 'fileinto_copy') { + $method = $action['type']; + $folder = $rcmail->config->get('sieverules_include_imap_root', true) ? $action['target'] : $rcmail->storage->mod_folder($action['target'], 'IN'); + + if ($rcmail->config->get('sieverules_folder_delimiter', false)) + $folder = str_replace($rcmail->storage->get_hierarchy_delimiter(), $rcmail->config->get('sieverules_folder_delimiter'), $folder); + } + elseif ($action['type'] == 'reject' || $action['type'] == 'ereject') { + $method = $action['type']; + $reject = $action['target']; + } + elseif ($action['type'] == 'vacation') { + $method = 'vacation'; + $days = $action['days']; + $vacfrom_default = $vacfrom; + $vacfrom = $action['from']; + $vacto = $action['addresses']; + $handle = $action['handle']; + $subject = $action['subject']; + $origsubject = $action['origsubject']; + $msg = $action['msg']; + $htmlmsg = $action['htmlmsg'] ? '1' : ''; + $charset = $action['charset']; + + if ($htmlmsg == '1' && $rcmail->config->get('htmleditor') == '0') { + $h2t = new rcube_html2text($msg, false, true, 0); + $msg = $h2t->get_text(); + $htmlmsg = ''; + } + elseif ($htmlmsg == '' && $rcmail->config->get('htmleditor') == '1') { + $msg = $msg; + $msg = nl2br($msg); + $htmlmsg = '1'; + } + + if (!$example) + $this->force_vacto = false; + + // check advanced enabled + if ((!empty($vacfrom) && $vacfrom != $vacfrom_default) || !empty($vacto) || !empty($handle) || !empty($days) || $charset != RCUBE_CHARSET || $this->force_vacto) { + $vacadvstyle = ''; + $vacadvstyle_from = ($this->show_vacfrom) ? '' : 'display: none;'; + $vacadvstyle_handle = ($this->show_vachandle) ? '' : 'display: none;'; + $vacshowadv = '1'; + } + } + elseif ($action['type'] == 'redirect' || $action['type'] == 'redirect_copy') { + $method = $action['type']; + $address = $action['target']; + } + elseif ($action['type'] == 'imapflags' || $action['type'] == 'imap4flags') { + $method = $action['type']; + $flags = $action['target']; + } + elseif ($action['type'] == 'notify' || $action['type'] == 'enotify') { + $method = $action['type']; + $nfrom = $action['from']; + $nimpt = $action['importance']; + $nmethod = $action['method']; + $noptions = $action['options']; + $nmsg = $action['msg']; + + // check advanced enabled + if (!empty($nfrom) || !empty($nimpt)) { + $noteadvstyle = ''; + $noteshowadv = '1'; + } + } + elseif ($action['type'] == 'editheaderadd' || $action['type'] == 'editheaderrem') { + $method = $action['type']; + $headername = $action['name']; + $headerval = $action['value']; + $headerindex = $action['index']; + $headeropp = $action['operator']; + + if ($action['type'] == 'editheaderrem' && (!empty($headerindex) || !empty($headerval))) { + $eheadadvstyle = ''; + $eheadshowadv = '1'; + } + } + elseif ($action['type'] == 'discard' || $action['type'] == 'keep' || $action['type'] == 'stop') { + $method = $action['type']; + } + + $select_action = new html_select(array('name' => "_act[]", 'onchange' => rcmail_output::JS_OBJECT_NAME . '.sieverules_action_select(this)')); + foreach ($allowed_actions as $value => $text) + $select_action->add(rcmail::Q($text), $value); + + $actions_table->add('action', $select_action->show($method)); + + $vacs_table = new html_table(array('class' => 'records-table', 'cellspacing' => '0', 'cols' => 3, 'style' => ($method == 'vacation') ? '' : 'display: none;')); + + $to_addresses = ""; + $vacto_arr = explode(",", $vacto); + $user_identities = $rcmail->user->list_identities(); + if (count($user_identities)) { + $field_id = 'rcmfd_sievevacfrom_'. $rowid; + $select_id = new html_select(array('id' => $field_id, 'name' => "_vacfrom[]", 'class' => 'short', 'onchange' => rcmail_output::JS_OBJECT_NAME . '.enable_sig(this);')); + + if ($this->show_vacfrom && in_array('variables', $ext)) + $select_id->add(rcmail::Q($this->gettext('autodetect')), "auto"); + elseif (!$this->show_vacfrom) + $select_id->add(rcmail::Q($this->gettext('autodetect')), ""); + + foreach ($user_identities as $sql_arr) { + $from = $this->_rcmail_get_identity($sql_arr['identity_id']); + + // find currently selected from address + if ($vacfrom != '' && $vacfrom == rcmail::Q($from['string'])) + $vacfrom = $sql_arr['identity_id']; + elseif ($vacfrom != '' && $vacfrom == $from['mailto']) + $vacfrom = $sql_arr['identity_id']; + + $select_id->add($from['disp_string'], $sql_arr['identity_id']); + + $ffield_id = 'rcmfd_vac_' . $rowid . '_' . $sql_arr['identity_id']; + + if ($this->force_vacto) { + $curaddress = $sql_arr['email']; + $vacto .= (!empty($vacto) ? ',' : '') . $sql_arr['email']; + } + else { + $curaddress = in_array($sql_arr['email'], $vacto_arr) ? $sql_arr['email'] : ""; + } + + $input_address = new html_checkbox(array('id' => $ffield_id, 'name' => '_vacto_check_' . $rowid . '[]', 'value' => $sql_arr['email'], 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverules_toggle_vac_to(this, '. $rowid .')', 'class' => 'checkbox')); + $to_addresses .= $input_address->show($curaddress) . " " . html::label($ffield_id, rcmail::Q($sql_arr['email'])) . "
"; + } + } + + if ($rcmail->config->get('sieverules_limit_vacto', true) && strlen($to_addresses) > 0) { + $vacs_table->set_row_attribs(array('class' => $vacadvclass_from, 'style' => $vacadvstyle_from)); + $vacs_table->add(null, html::label($field_id, rcmail::Q($this->gettext('from')))); + $vacs_table->add(null, $select_id->show($vacfrom)); + + $sig_button = $this->api->output->button(array('command' => 'plugin.sieverules.vacation_sig', 'prop' => $rowid, 'type' => 'link', 'class' => 'vacsig', 'classact' => 'vacsig_act', 'title' => 'insertsignature', 'content' => ' ')); + $vacs_table->add(null, $sig_button); + + $field_id = 'rcmfd_sievevacto_'. $rowid; + $input_vacto = new html_hiddenfield(array('id' => $field_id, 'name' => '_vacto[]', 'value' => $vacto)); + $vacs_table->set_row_attribs(array('class' => 'advanced', 'style' => $vacadvstyle)); + $vacs_table->add(array('style' => 'vertical-align: top;'), rcmail::Q($this->gettext('sieveto'))); + $vacs_table->add(null, $to_addresses . $input_vacto->show()); + $help_button = html::a(array('href' => "#", 'onclick' => 'return ' . rcmail_output::JS_OBJECT_NAME . '.sieverules_help(this, ' . $vacs_table->size() . ');', 'title' => $this->gettext('messagehelp')), $help_icon); + $vacs_table->add(array('style' => 'vertical-align: top;'), $help_button); + + $vacs_table->set_row_attribs(array('class' => 'advhelp', 'style' => 'display: none;')); + $vacs_table->add(array('colspan' => 3, 'class' => 'vacdaysexp'), $this->gettext('vactoexp')); + } + else { + $field_id = 'rcmfd_sievevacfrom_'. $rowid; + $input_vacfrom = new html_inputfield(array('id' => $field_id, 'name' => '_vacfrom[]')); + $vacs_table->set_row_attribs(array('class' => $vacadvclass_from, 'style' => $vacadvstyle_from)); + $vacs_table->add(null, html::label($field_id, rcmail::Q($this->gettext('from')))); + $vacs_table->add(null, $input_vacfrom->show($vacfrom)); + + $sig_button = $this->api->output->button(array('command' => 'plugin.sieverules.vacation_sig', 'prop' => $rowid, 'type' => 'link', 'class' => 'vacsig', 'classact' => 'vacsig_act', 'title' => 'insertsignature', 'content' => ' ')); + $vacs_table->add(null, $sig_button); + + $field_id = 'rcmfd_sievevacto_'. $rowid; + $input_vacto = new html_inputfield(array('id' => $field_id, 'name' => '_vacto[]', 'class' => 'short')); + $vacs_table->set_row_attribs(array('class' => 'advanced', 'style' => $vacadvstyle)); + $vacs_table->add(null, html::label($field_id, rcmail::Q($this->gettext('sieveto')))); + $vacs_table->add(null, $input_vacto->show($vacto)); + + $help_button = html::a(array('href' => "#", 'onclick' => 'return ' . rcmail_output::JS_OBJECT_NAME . '.sieverules_help(this, ' . $vacs_table->size() . ');', 'title' => $this->gettext('messagehelp')), $help_icon); + $vacs_table->add(null, $help_button); + $vacs_table->set_row_attribs(array('class' => 'advhelp', 'style' => 'display: none;')); + $vacs_table->add(array('colspan' => 3, 'class' => 'vacdaysexp'), $this->gettext('vactoexp') . '

' . $this->gettext('vactoexp_adv')); + } + + $field_id = 'rcmfd_sievevacdays_'. $rowid; + $input_day = new html_inputfield(array('id' => $field_id, 'name' => '_day[]', 'class' => 'short')); + $vacs_table->set_row_attribs(array('class' => 'advanced', 'style' => $vacadvstyle)); + $vacs_table->add(null, html::label($field_id, rcmail::Q($this->gettext('days')))); + $vacs_table->add(null, $input_day->show($days)); + $help_button = html::a(array('href' => "#", 'onclick' => 'return ' . rcmail_output::JS_OBJECT_NAME . '.sieverules_help(this, ' . $vacs_table->size() . ');', 'title' => $this->gettext('messagehelp')), $help_icon); + $vacs_table->add(null, $help_button); + + $vacs_table->set_row_attribs(array('style' => 'display: none;')); + $vacs_table->add(array('colspan' => 3, 'class' => 'vacdaysexp'), $this->gettext('vacdaysexp')); + + $field_id = 'rcmfd_sievevachandle_'. $rowid; + $input_handle = new html_inputfield(array('id' => $field_id, 'name' => '_handle[]', 'class' => 'short')); + $vacs_table->set_row_attribs(array('class' => $vacadvclass_handle, 'style' => $vacadvstyle_handle)); + $vacs_table->add(null, html::label($field_id, rcmail::Q($this->gettext('sievevachandle')))); + $vacs_table->add(null, $input_handle->show($handle)); + $help_button = html::a(array('href' => "#", 'onclick' => 'return ' . rcmail_output::JS_OBJECT_NAME . '.sieverules_help(this, ' . $vacs_table->size() . ');', 'title' => $this->gettext('messagehelp')), $help_icon); + $vacs_table->add(null, $help_button); + + $vacs_table->set_row_attribs(array('class' => 'advhelp', 'style' => 'display: none;')); + $vacs_table->add(array('colspan' => 3, 'class' => 'vacdaysexp'), $this->gettext('vachandleexp')); + + $field_id = 'rcmfd_sievevacsubject_'. $rowid; + $input_subject = new html_inputfield(array('id' => $field_id, 'name' => '_subject[]')); + $vacs_table->add(null, html::label($field_id, rcmail::Q($this->gettext('subject')))); + $vacs_table->add(array('colspan' => 2), $input_subject->show($subject)); + + if (in_array('variables', $ext)) { + $field_id = 'rcmfd_sievevacsubject_orig_'. $rowid; + $input_origsubject = new html_checkbox(array('id' => $field_id, 'value' => '1', 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverules_toggle_vac_osubj(this, '. $rowid .')', 'class' => 'checkbox')); + $input_vacosubj = new html_hiddenfield(array('id' => 'rcmfd_sievevactoh_'. $rowid, 'name' => '_orig_subject[]', 'value' => $origsubject)); + $vacs_table->add(null, ' '); + $vacs_table->add(array('colspan' => 2), $input_origsubject->show($origsubject) . " " . html::label($field_id, rcmail::Q($this->gettext('sieveorigsubj'))) . $input_vacosubj->show()); + } + + $field_id = 'rcmfd_sievevacmag_'. $rowid; + $input_msg = new html_textarea(array('id' => $field_id, 'name' => '_msg[]', 'rows' => '8', 'cols' => '40', 'class' => $htmlmsg == 1 ? 'mce_editor' : '', 'is_escaped' => $htmlmsg == 1 ? true : null)); + $input_html = new html_checkbox(array('id' => 'rcmfd_sievevachtmlcb_'. $rowid, 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverules_toggle_vac_html(this, '. $rowid .', \'' . $field_id .'\');', 'value' => '1', 'class' => 'checkbox')); + $input_htmlhd = new html_hiddenfield(array('id' => 'rcmfd_sievevachtmlhd_'. $rowid, 'name' => '_htmlmsg[]', 'value' => $htmlmsg)); + $vacs_table->add('msg', html::label($field_id, rcmail::Q($this->gettext('message')))); + $vacs_table->add(array('colspan' => 2), $input_msg->show($msg) . html::tag('div', in_array('htmleditor', $rcmail->config->get('dont_override')) ? array('style' => 'display: none;') : null, $input_html->show($htmlmsg) . " " . html::label('rcmfd_sievevachtml_' . $rowid, rcmail::Q($this->gettext('htmlmessage')))) . $input_htmlhd->show()); + + $field_id = 'rcmfd_sievecharset_'. $rowid; + $vacs_table->set_row_attribs(array('class' => 'advanced', 'style' => $vacadvstyle)); + $vacs_table->add(null, html::label($field_id, rcmail::Q($this->gettext('charset')))); + $vacs_table->add(array('colspan' => 2), $rcmail->output->charset_selector(array('id' => $field_id, 'name' => '_vaccharset[]', 'selected' => $charset))); + + $input_advopts = new html_checkbox(array('id' => 'vadvopts' . $rowid, 'name' => '_vadv_opts[]', 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverules_show_adv(this);', 'value' => '1', 'class' => 'checkbox')); + $vacs_table->add(array('colspan' => '3', 'style' => 'text-align: right'), html::label('vadvopts' . $rowid, rcmail::Q($this->gettext('advancedoptions'))) . $input_advopts->show($vacshowadv)); + + $notify_table = new html_table(array('class' => 'records-table', 'cellspacing' => '0', 'cols' => 3, 'style' => ($method == 'notify' || $method == 'enotify') ? '' : 'display: none;')); + + $user_identities = $rcmail->user->list_identities(); + if (count($user_identities)) { + $field_id = 'rcmfd_sievenotifyfrom_'. $rowid; + $select_id = new html_select(array('id' => $field_id, 'name' => "_nfrom[]")); + $select_id->add(rcmail::Q($this->gettext('autodetect')), ""); + + foreach ($user_identities as $sql_arr) { + $from = $this->_rcmail_get_identity($sql_arr['identity_id']); + + // find currently selected from address + if ($nfrom != '' && $nfrom == rcmail::Q($from['string'])) + $nfrom = $sql_arr['identity_id']; + elseif ($nfrom != '' && $nfrom == $from['mailto']) + $nfrom = $sql_arr['identity_id']; + + $select_id->add($from['disp_string'], $sql_arr['identity_id']); + } + + $notify_table->set_row_attribs(array('class' => 'advanced', 'style' => $noteadvstyle)); + $notify_table->add(null, html::label($field_id, rcmail::Q($this->gettext('sievefrom')))); + $notify_table->add(array('colspan' => 2), $select_id->show($nfrom)); + } + + $field_id = 'rcmfd_nmethod_'. $rowid; + $input_method = new html_inputfield(array('id' => $field_id, 'name' => '_nmethod[]')); + $notify_table->add(null, html::label($field_id, rcmail::Q($this->gettext('method')))); + $notify_table->add(array('colspan' => 2), $input_method->show($nmethod)); + + $field_id = 'rcmfd_noption_'. $rowid; + $input_method = new html_inputfield(array('id' => $field_id, 'name' => '_noption[]')); + $notify_table->add(null, html::label($field_id, rcmail::Q($this->gettext('options')))); + $notify_table->add(array('colspan' => 2), $input_method->show($noptions)); + + $notify_table->set_row_attribs(array('style' => 'display: none;')); + $notify_table->add(array('colspan' => 3, 'class' => 'vacdaysexp'), $this->gettext('nmethodexp')); + + $field_id = 'rcmfd_nimpt_'. $rowid; + $input_importance = new html_radiobutton(array('id' => $field_id . '_none', 'name' => '_notify_radio_' . $rowid, 'value' => 'none', 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverules_notify_impt(this, '. $rowid .')', 'class' => 'radio')); + $importance_show = $input_importance->show($nimpt) . " " . html::label($field_id . '_none', rcmail::Q($this->gettext('importancen'))); + $input_importance = new html_radiobutton(array('id' => $field_id . '_1', 'name' => '_notify_radio_' . $rowid, 'value' => '1', 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverules_notify_impt(this, '. $rowid .')', 'class' => 'radio')); + $importance_show .= '  ' . $input_importance->show($nimpt) . " " . html::label($field_id . '_1', rcmail::Q($this->gettext('importance1'))); + $input_importance = new html_radiobutton(array('id' => $field_id . '_2', 'name' => '_notify_radio_' . $rowid, 'value' => '2', 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverules_notify_impt(this, '. $rowid .')', 'class' => 'radio')); + $importance_show .= '  ' . $input_importance->show($nimpt) . " " . html::label($field_id . '_2', rcmail::Q($this->gettext('importance2'))); + $input_importance = new html_radiobutton(array('id' => $field_id . '_3', 'name' => '_notify_radio_' . $rowid, 'value' => '3', 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverules_notify_impt(this, '. $rowid .')', 'class' => 'radio')); + $importance_show .= '  ' . $input_importance->show($nimpt) . " " . html::label($field_id . '_3', rcmail::Q($this->gettext('importance3'))); + $input_importance = new html_hiddenfield(array('id' => 'rcmfd_sievenimpt_'. $rowid, 'name' => '_nimpt[]')); + + $notify_table->set_row_attribs(array('class' => 'advanced', 'style' => $noteadvstyle)); + $notify_table->add(null, rcmail::Q($this->gettext('flag'))); + $notify_table->add(array('colspan' => 2), $importance_show . $input_importance->show($nimpt)); + + $field_id = 'rcmfd_nmsg_'. $rowid; + $input_msg = new html_inputfield(array('id' => $field_id, 'name' => '_nmsg[]')); + $notify_table->add(null, html::label($field_id, rcmail::Q($this->gettext('message')))); + $notify_table->add(array('colspan' => 2), $input_msg->show($nmsg)); + + if (in_array('enotify', $ext)) { + $input_advopts = new html_checkbox(array('id' => 'nadvopts' . $rowid, 'name' => '_nadv_opts[]', 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverules_show_adv(this);', 'value' => '1', 'class' => 'checkbox')); + $notify_table->add(array('colspan' => '3', 'style' => 'text-align: right'), html::label('nadvopts' . $rowid, rcmail::Q($this->gettext('advancedoptions'))) . $input_advopts->show($noteshowadv)); + } + + $headers_table = new html_table(array('class' => 'records-table', 'cellspacing' => '0', 'cols' => 2, 'style' => ($method == 'editheaderadd' || $method == 'editheaderrem') ? '' : 'display: none;')); + + $field_id = 'rcmfd_eheadname_'. $rowid; + $input_header = new html_inputfield(array('id' => $field_id, 'name' => '_eheadname[]')); + $headers_table->add(null, html::label($field_id, rcmail::Q($this->gettext('headername')))); + $headers_table->add(null, $input_header->show($headername)); + + $field_id = 'rcmfd_eheadindex_'. $rowid; + $select_index = new html_select(array('id' => $field_id, 'name' => "_eheadindex[]")); + $select_index->add(rcmail::Q($this->gettext('headerdelall')), ""); + $select_index->add(rcmail::Q("1"), "1"); + $select_index->add(rcmail::Q("2"), "2"); + $select_index->add(rcmail::Q("3"), "3"); + $select_index->add(rcmail::Q("4"), "4"); + $select_index->add(rcmail::Q("5"), "5"); + $select_index->add(rcmail::Q($this->gettext('last')), "last"); + + $headers_table->set_row_attribs(array('class' => 'advanced', 'style' => $eheadadvstyle)); + $headers_table->add(null, html::label($field_id, rcmail::Q($this->gettext('headerindex')))); + $headers_table->add(null, $select_index->show($headerindex)); + + $field_id = 'rcmfd_eheadopp_'. $rowid; + $select_match = new html_select(array('id' => $field_id, 'name' => "_eheadopp[]")); + $select_match->add(rcmail::Q($this->gettext('filteris')), ""); + $select_match->add(rcmail::Q($this->gettext('filtercontains')), "contains"); + + $headers_table->set_row_attribs(array('class' => 'advanced', 'style' => $eheadadvstyle)); + $headers_table->add(null, html::label($field_id, rcmail::Q($this->gettext('operator')))); + $headers_table->add(null, $select_match->show($headeropp)); + + $field_id = 'rcmfd_eheadval_'. $rowid; + $input_header = new html_inputfield(array('id' => $field_id, 'name' => '_eheadval[]')); + + if ($method == 'editheaderrem') + $headers_table->set_row_attribs(array('class' => 'advanced', 'style' => $eheadadvstyle)); + + $headers_table->add(null, html::label($field_id, rcmail::Q($this->gettext('headervalue')))); + $headers_table->add(null, $input_header->show($headerval)); + + if ($method == 'editheaderrem') + $headers_table->set_row_attribs(array('style' => 'display: none;')); + + $field_id = 'rcmfd_eheadaddlast_'. $rowid; + $input_index = new html_checkbox(array('id' => $field_id, 'value' => 'last', 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverules_toggle_eheadlast(this);', 'name' => '_eheadaddlast[]', 'class' => 'checkbox')); + $headers_table->add(null, ' '); + $headers_table->add(null, $input_index->show($headerindex) . " " . html::label($field_id, rcmail::Q($this->gettext('headerappend')))); + + if ($method == 'editheaderadd') + $headers_table->set_row_attribs(array('style' => 'display: none;')); + + $input_advopts = new html_checkbox(array('id' => 'hadvopts' . $rowid, 'name' => '_hadv_opts[]', 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverules_show_adv(this);', 'value' => '1', 'class' => 'checkbox')); + $headers_table->add(array('colspan' => '3', 'style' => 'text-align: right'), html::label('nadvopts' . $rowid, rcmail::Q($this->gettext('advancedoptions'))) . $input_advopts->show($eheadshowadv)); + + // get mailbox list + $mbox_name = $rcmail->storage->get_folder(); + + // build the folders tree + if (empty($a_mailboxes)) { + // get mailbox list + if ($rcmail->config->get('sieverules_fileinto_options', 0) > 0) + $a_folders = $rcmail->storage->list_folders(); + else + $a_folders = $rcmail->storage->list_folders_subscribed(); + + $delimiter = $rcmail->storage->get_hierarchy_delimiter(); + $a_mailboxes = array(); + + foreach ($a_folders as $ifolder) { + if ($rcmail->config->get('sieverules_folder_encoding')) + $ifolder = $this->_mbox_encode($ifolder, $rcmail->config->get('sieverules_folder_encoding')); + + if ($rcmail->config->get('sieverules_folder_delimiter', false)) + $rcmail->build_folder_tree($a_mailboxes, str_replace($delimiter, $rcmail->config->get('sieverules_folder_delimiter'), $ifolder), $rcmail->config->get('sieverules_folder_delimiter')); + else + $rcmail->build_folder_tree($a_mailboxes, $ifolder, $delimiter); + } + + if ($rcmail->config->get('sieverules_fileinto_options', 0) == 2 && in_array('mailbox', $ext)) + array_push($a_mailboxes, array('id' => '@@newfolder', 'name' => $this->gettext('createfolder'), 'virtual' => '', 'folders' => array())); + } + + $input_folderlist = new html_select(array('name' => '_folder[]', 'onchange' => rcmail_output::JS_OBJECT_NAME . '.sieverules_select_folder(this);', 'style' => ($method == 'fileinto' || $method == 'fileinto_copy') ? '' : 'display: none;', 'is_escaped' => true)); + $rcmail->render_folder_tree_select($a_mailboxes, $mbox_name, 100, $input_folderlist, false); + + $show_customfolder = 'display: none;'; + if ($rcmail->config->get('sieverules_fileinto_options', 0) == 2 && !$rcmail->storage->folder_exists($folder)) { + $customfolder = $rcmail->storage->mod_folder($folder); + $folder = '@@newfolder'; + $show_customfolder = ''; + } + + $input_customfolder = new html_inputfield(array('name' => '_customfolder[]')); + $otherfolders = html::span(array('id' => 'customfolder_rowid', 'style' => $show_customfolder), '
' . $input_customfolder->show($customfolder)); + + $input_address = new html_inputfield(array('name' => '_redirect[]', 'style' => ($method == 'redirect' || $method == 'redirect_copy') ? '' : 'display: none;')); + $input_reject = new html_textarea(array('name' => '_reject[]', 'rows' => '5', 'cols' => '40', 'style' => ($method == 'reject' || $method == 'ereject') ? '' : 'display: none;')); + $input_imapflags = new html_select(array('name' => '_imapflags[]', 'style' => ($method == 'imapflags' || $method == 'imap4flags') ? '' : 'display: none;')); + foreach($this->flags as $name => $val) + $input_imapflags->add(rcmail::Q($this->gettext($name)), rcmail::Q($val)); + + $actions_table->add('folder', $input_folderlist->show($folder) . $otherfolders . $input_address->show($address) . $vacs_table->show() . $notify_table->show() . $input_imapflags->show($flags) . $input_reject->show($reject) . $headers_table->show()); + + $add_button = $this->api->output->button(array('command' => 'plugin.sieverules.add_action', 'type' => 'link', 'class' => 'add', 'title' => 'sieverules.addsieveact', 'content' => ' ')); + $delete_button = $this->api->output->button(array('command' => 'plugin.sieverules.del_action', 'type' => 'link', 'class' => 'delete', 'classact' => 'delete_act', 'title' => 'sieverules.deletesieveact', 'content' => ' ')); + + if ($rcmail->config->get('sieverules_multiple_actions')) + $actions_table->add('control', $delete_button . $add_button); + else + $actions_table->add('control', " "); + + return $actions_table; + } + + private function _in_headerarray($needle, $haystack) + { + foreach ($haystack as $data) { + $args = explode("::", $data); + if ($args[1] == $needle) + return $args[0]; + } + + return false; + } + + private function _strip_val($str, $allow_html = false, $trim = true) + { + $str = !$allow_html ? htmlspecialchars_decode($str) : $str; + $str = $trim ? trim($str) : $str; + + return $str; + } + + private function _mbox_encode($text, $encoding) + { + return rcube_charset::convert($text, 'UTF7-IMAP', $encoding); + } + + // get identity record + private function _rcmail_get_identity($id) + { + $rcmail = rcube::get_instance(); + + if ($sql_arr = $rcmail->user->get_identity($id)) { + $out = $sql_arr; + $out['mailto'] = $sql_arr['email']; + $out['string'] = format_email_recipient($sql_arr['email'], rcube_charset::convert($sql_arr['name'], RCUBE_CHARSET, $this->api->output->get_charset())); + + if ($rcmail->config->get('sieverules_from_format', 0) == 1) { + $out['disp_string'] = $out['string']; + $out['val_string'] = $out['string']; + } + else { + $out['disp_string'] = $out['mailto']; + $out['val_string'] = $out['mailto']; + } + + return $out; + } + + return FALSE; + } +} + +?> \ No newline at end of file diff --git a/plugins/sieverules/skins/classic/cross.gif b/plugins/sieverules/skins/classic/cross.gif new file mode 100644 index 000000000..327052a23 Binary files /dev/null and b/plugins/sieverules/skins/classic/cross.gif differ diff --git a/plugins/sieverules/skins/classic/help.gif b/plugins/sieverules/skins/classic/help.gif new file mode 100644 index 000000000..ea7bbb363 Binary files /dev/null and b/plugins/sieverules/skins/classic/help.gif differ diff --git a/plugins/sieverules/skins/classic/icons.gif b/plugins/sieverules/skins/classic/icons.gif new file mode 100644 index 000000000..ba772f2ad Binary files /dev/null and b/plugins/sieverules/skins/classic/icons.gif differ diff --git a/plugins/sieverules/skins/classic/icons.png b/plugins/sieverules/skins/classic/icons.png new file mode 100644 index 000000000..31a26491d Binary files /dev/null and b/plugins/sieverules/skins/classic/icons.png differ diff --git a/plugins/sieverules/skins/classic/ie6hacks.css b/plugins/sieverules/skins/classic/ie6hacks.css new file mode 100644 index 000000000..a6b414034 --- /dev/null +++ b/plugins/sieverules/skins/classic/ie6hacks.css @@ -0,0 +1,10 @@ +/** + * SieveRules plugin styles (IE6 hacks) + */ + +#sieverules-table tbody td.control a, +#rules-table tbody td.control a, +#actions-table tbody td.control a +{ + background-image: url(icons.gif); +} \ No newline at end of file diff --git a/plugins/sieverules/skins/classic/iehacks.css b/plugins/sieverules/skins/classic/iehacks.css new file mode 100644 index 000000000..582f452a3 --- /dev/null +++ b/plugins/sieverules/skins/classic/iehacks.css @@ -0,0 +1,53 @@ +/** + * SieveRules plugin styles (IE hacks) + */ + +#sieverules-list +{ + height: expression(parseInt(this.parentNode.offsetHeight)+'px'); +} + +.sieverules-boxcontent +{ + height: expression(parseInt(this.parentNode.offsetHeight)-25+'px'); +} + +#sieverules-list-filters +{ + height: expression(parseInt(this.parentNode.offsetHeight)+'px'); + width: expression(parseInt(this.parentNode.offsetWidth)+'px'); +} + +#sieverules-list-examples +{ + width: expression(parseInt(this.parentNode.offsetWidth)+'px'); +} + +#sieverules-details +{ + height: expression(parseInt(this.parentNode.offsetHeight)+'px'); + width: expression((parseInt(this.parentNode.offsetWidth)-250)+'px'); +} + +#sieverules-advanced +{ + height: expression((parseInt(document.documentElement.clientHeight)-130)+'px'); + width: expression((parseInt(document.documentElement.clientWidth)-40)+'px'); +} + +table.records-table td.vacdaysexp +{ + word-wrap: break-word; +} + +#sieverules-advancedbox +{ + height: expression((parseInt(document.documentElement.clientHeight)-177)+'px'); + width: expression((parseInt(document.documentElement.clientWidth)-48)+'px'); +} + +#sieverules-advanced textarea +{ + height: expression((parseInt(document.documentElement.clientHeight)-177)+'px'); + width: expression((parseInt(document.documentElement.clientWidth)-48)+'px'); +} \ No newline at end of file diff --git a/plugins/sieverules/skins/classic/safari.css b/plugins/sieverules/skins/classic/safari.css new file mode 100644 index 000000000..0add9e3d2 --- /dev/null +++ b/plugins/sieverules/skins/classic/safari.css @@ -0,0 +1,8 @@ +/** + * SieveRules plugin styles (safari hacks) + */ + +table.records-table td.vacdaysexp +{ + word-wrap: break-word; +} \ No newline at end of file diff --git a/plugins/sieverules/skins/classic/sieverules.css b/plugins/sieverules/skins/classic/sieverules.css new file mode 100644 index 000000000..54a1b0cfa --- /dev/null +++ b/plugins/sieverules/skins/classic/sieverules.css @@ -0,0 +1,406 @@ +/** + * SieveRules plugin styles + */ + +#sieverules-list +{ + position: absolute; + top: 0; + bottom: 0; + width: 240px; +} + +.sieverules-boxcontent +{ + position: absolute; + top: 0; + bottom: 23px; + width: 100%; +} + +#sieverules-list-filters +{ + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + width: 100%; + border: 1px solid #999999; + overflow: auto; +} + +#sieverules-list-filters thead td +{ + height: 20px; +} + +#sieverules-list-filters thead td span +{ + position: absolute; + top: 2px; + left: 4px; + right: 25px; + height: 20px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + + +#sieverules-list-filters thead td img +{ + position: absolute; + top: 2px; + right: 2px; +} + +#sieverules-list-examples +{ + position: absolute; + bottom: 0; + left: 0; + right: 0; + width: 100%; + border: 1px solid #999999; + overflow: auto; +} + +#sieverules-list div.boxfooter +{ + border: 1px solid #999999; + border-top: 0; + width: 100%; +} + +#sieverules-details +{ + position: absolute; + top: 0; + left: 250px; + right: 0; + bottom: 0; + border: 1px solid #999999; +} + +#sieverules-advanced +{ + position: absolute; + top: 0; + left: 0; + bottom: 25px; + right: 0; + overflow: hidden; + border: 1px solid #999999; +} + +span.disableLink +{ + float: right; + width: 200px; + text-align: right; +} + +#sieverules-table, +#sieverules-examples +{ + width: 100%; +} + +#sieverules-table tbody td +{ + cursor: default; +} + +#sieverules-table tbody td.control, +#rules-table tbody td.control, +#actions-table tbody td.control +{ + text-align: right; +} + +#sieverules-table tbody td.control a, +#rules-table tbody td.control a, +#actions-table tbody td.control a +{ + display: block; + float: right; + width: 16px; + height: 16px; + background-image: url(icons.png); +} + +#sieverules-table tbody td.control a.up_arrow +{ + background-position: 0 0; +} + +#sieverules-table tbody td.control a.down_arrow +{ + background-position: 0 -18px; +} + +#rules-table tbody td.control, +#actions-table tbody td.control +{ + vertical-align: top; +} + +#rules-table tbody td.control a.add, +#actions-table tbody td.control a.add +{ + margin-left: 5px; + background-position: 0 -72px; +} + +#rules-table tbody td.control a.delete, +#actions-table tbody td.control a.delete +{ + background-position: 0 -54px; +} + +#rules-table tbody td.control a.delete_act, +#actions-table tbody td.control a.delete_act +{ + background-position: 0 -36px; +} + +#actions-table tbody a.vacsig +{ + display: block; + width: 16px; + height: 16px; + background-image: url(icons.png); + background-position: 0 -108px; +} + +#actions-table tbody a.vacsig_act +{ + display: block; + width: 16px; + height: 16px; + background-image: url(icons.png); + background-position: 0 -90px; +} + +#rules-table, +#actions-table, +#rules-table td table.records-table +{ + width: 100%; +} + +#rules-table td.selheader, +#rules-table td.op +{ + width: 130px; +} + +#rules-table td.header +{ + width: 135px; +} + +#rules-table td.target +{ + width: 160px; +} + +#rules-table input +{ + width: 150px; +} + +#rules-table input.short +{ + width: 100px; +} + +#rules-table select +{ + width: 123px; +} + +#rules-table select.short +{ + width: 45px; +} + +#rules-table select.long +{ + width: 157px; +} + +#rules-table td table.records-table select +{ + width: 432px; +} + +#rules-table td table.records-table input +{ + width: 426px; +} + +#rules-table td table.records-table input.short +{ + width: 406px; +} + +#rules-table td table.records-table input.radio +{ + width: auto; +} + +#actions-table td.action +{ + width: 165px; + vertical-align: top; +} + +#actions-table td.folder +{ + width: 420px; + vertical-align: top; +} + +#actions-table td.action select +{ + width: 160px; +} + +#actions-table td.folder input, +#actions-table td.folder textarea +{ + width: 400px; +} + +#actions-table td.folder select +{ + width: 408px; +} + +#actions-table td.folder table.records-table select +{ + width: 337px; +} + +#actions-table td.folder table.records-table input, +#actions-table td.folder table.records-table textarea +{ + width: 330px; +} + +#actions-table td.folder table.records-table input.short, +#actions-table td.folder table.records-table select.short +{ + width: 310px; +} + +#actions-table td.folder table.records-table input.checkbox, +#actions-table td.folder table.records-table input.radio +{ + width: auto; +} + +table.records-table td.msg +{ + vertical-align: top; +} + +table.records-table td.vacdaysexp +{ + width: 398px; + white-space: -moz-pre-wrap !important; + white-space: pre-wrap !important; + white-space: pre; +} + +#listbuttons +{ + position: absolute; + bottom: 18px; + left: 20px; +} + +#advancedmode +{ + white-space: nowrap; + text-align: right; + position: absolute; + bottom: 30px; + right: 20px; + width: 460px; +} + +#sieverules-advancedbox +{ + position: absolute; + top: 20px; + left: 0; + bottom: 26px; + right: 4px; +} + +#sieverules-advanced textarea +{ + position: absolute; + top: 0; + left: 0; + border: 0; + width: 100%; + height: 100%; +} + +.records-table tbody tr.droptarget td +{ + border-top: 2px solid #000000; +} + +.records-table tbody tr.droptargetend td +{ + border-bottom: 2px solid #000000; +} + +#sieverulesrsdialog h3 +{ + color: #333; + font-size: normal; + margin-top: 0.5em; + margin-bottom: 1em; +} + +#sieverulesrsdialog table td.title +{ + color: #666; + text-align: right; + padding-right: 1em; + white-space: nowrap; +} + +#sieverulesrsdialog table td input +{ + width: 20em; +} + +#sieverulesrsdialog .formbuttons +{ + margin-top: 1.5em; + text-align: center; +} + +input.inputmask +{ + color: #999999; +} + +#sieverulesactionsmenu a.selected +{ + font-weight: bold; +} + +#sieverules-advbuttons +{ + position: absolute; + left: 0; + bottom: 0; +} \ No newline at end of file diff --git a/plugins/sieverules/skins/classic/tabstyles.css b/plugins/sieverules/skins/classic/tabstyles.css new file mode 100644 index 000000000..b1b1c3f95 --- /dev/null +++ b/plugins/sieverules/skins/classic/tabstyles.css @@ -0,0 +1,3 @@ +/** + * SieveRules plugin styles (tab styles) + */ diff --git a/plugins/sieverules/skins/classic/templates/advancededitor.html b/plugins/sieverules/skins/classic/templates/advancededitor.html new file mode 100644 index 000000000..e42e40195 --- /dev/null +++ b/plugins/sieverules/skins/classic/templates/advancededitor.html @@ -0,0 +1,55 @@ + + + +<roundcube:object name="pagetitle" /> + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+ +
+ +
+
    + +
  • + +
  • +
  • +
  • + + > +
+
+ + + \ No newline at end of file diff --git a/plugins/sieverules/skins/classic/templates/editsieverule.html b/plugins/sieverules/skins/classic/templates/editsieverule.html new file mode 100644 index 000000000..58b4c966a --- /dev/null +++ b/plugins/sieverules/skins/classic/templates/editsieverule.html @@ -0,0 +1,29 @@ + + + +<roundcube:object name="pagetitle" /> + + + + + + + + + + + + +
+ +
+ + +


+ + +

+
+ + + \ No newline at end of file diff --git a/plugins/sieverules/skins/classic/templates/setupsieverules.html b/plugins/sieverules/skins/classic/templates/setupsieverules.html new file mode 100644 index 000000000..a9e01f565 --- /dev/null +++ b/plugins/sieverules/skins/classic/templates/setupsieverules.html @@ -0,0 +1,18 @@ + + + +<roundcube:object name="pagetitle" /> + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/sieverules/skins/classic/templates/sieverules.html b/plugins/sieverules/skins/classic/templates/sieverules.html new file mode 100644 index 000000000..66b2c0022 --- /dev/null +++ b/plugins/sieverules/skins/classic/templates/sieverules.html @@ -0,0 +1,93 @@ + + + +<roundcube:object name="pagetitle" /> + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ + +
+
+ + + + + +
+
+ + + +
+ +
+ +
+ +
+
    + +
  • + +
  • +
  • +
  • + + + > + +
+
+ + + \ No newline at end of file diff --git a/plugins/sieverules/skins/classic/tick.gif b/plugins/sieverules/skins/classic/tick.gif new file mode 100644 index 000000000..08c3a3a13 Binary files /dev/null and b/plugins/sieverules/skins/classic/tick.gif differ diff --git a/plugins/sieverules/skins/larry/cross.png b/plugins/sieverules/skins/larry/cross.png new file mode 100644 index 000000000..8d8a13f47 Binary files /dev/null and b/plugins/sieverules/skins/larry/cross.png differ diff --git a/plugins/sieverules/skins/larry/help.png b/plugins/sieverules/skins/larry/help.png new file mode 100644 index 000000000..9f7a6ae44 Binary files /dev/null and b/plugins/sieverules/skins/larry/help.png differ diff --git a/plugins/sieverules/skins/larry/icons.png b/plugins/sieverules/skins/larry/icons.png new file mode 100644 index 000000000..db84da896 Binary files /dev/null and b/plugins/sieverules/skins/larry/icons.png differ diff --git a/plugins/sieverules/skins/larry/iehacks.css b/plugins/sieverules/skins/larry/iehacks.css new file mode 100644 index 000000000..e370e9300 --- /dev/null +++ b/plugins/sieverules/skins/larry/iehacks.css @@ -0,0 +1,53 @@ +/** + * SieveRules plugin styles (IE hacks) + */ + +#sieverules-list +{ + height: expression(parseInt(this.parentNode.offsetHeight)+'px'); +} + +.sieverules-boxcontent +{ + height: expression(parseInt(this.parentNode.offsetHeight)-25+'px'); +} + +#sieverules-list-filters +{ + height: expression(parseInt(this.parentNode.offsetHeight)+'px'); + width: expression(parseInt(this.parentNode.offsetWidth)+'px'); +} + +#sieverules-list-examples +{ + width: expression(parseInt(this.parentNode.offsetWidth)+'px'); +} + +#sieverules-details +{ + height: expression(parseInt(this.parentNode.offsetHeight)+'px'); + width: expression((parseInt(this.parentNode.offsetWidth)-270)+'px'); +} + +#sieverules-advanced +{ + height: expression((parseInt(document.documentElement.clientHeight)-130)+'px'); + width: expression((parseInt(document.documentElement.clientWidth)-40)+'px'); +} + +table.records-table td.vacdaysexp +{ + word-wrap: break-word; +} + +#sieverules-advancedbox +{ + height: expression((parseInt(document.documentElement.clientHeight)-177)+'px'); + width: expression((parseInt(document.documentElement.clientWidth)-48)+'px'); +} + +#sieverules-advanced textarea +{ + height: expression((parseInt(document.documentElement.clientHeight)-177)+'px'); + width: expression((parseInt(document.documentElement.clientWidth)-48)+'px'); +} \ No newline at end of file diff --git a/plugins/sieverules/skins/larry/listicons.png b/plugins/sieverules/skins/larry/listicons.png new file mode 100644 index 000000000..f6889c4a0 Binary files /dev/null and b/plugins/sieverules/skins/larry/listicons.png differ diff --git a/plugins/sieverules/skins/larry/safari.css b/plugins/sieverules/skins/larry/safari.css new file mode 100644 index 000000000..0add9e3d2 --- /dev/null +++ b/plugins/sieverules/skins/larry/safari.css @@ -0,0 +1,8 @@ +/** + * SieveRules plugin styles (safari hacks) + */ + +table.records-table td.vacdaysexp +{ + word-wrap: break-word; +} \ No newline at end of file diff --git a/plugins/sieverules/skins/larry/sieverules.css b/plugins/sieverules/skins/larry/sieverules.css new file mode 100644 index 000000000..c726acfed --- /dev/null +++ b/plugins/sieverules/skins/larry/sieverules.css @@ -0,0 +1,435 @@ +/** + * SieveRules plugin styles + */ + +#sieverules-list +{ + position: absolute; + top: 0; + left: 0; + width: 260px; + bottom: 0; +} + +#sieverules-list-filters +{ + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + width: 100%; + overflow: auto; +} + +#sieverules-list-filters thead td +{ + height: 15px; +} + +#sieverules-list-filters thead td span +{ + position: absolute; + top: 10px; + left: 8px; + right: 30px; + overflow: hidden; + text-overflow: ellipsis; +} + + +#sieverules-list-filters thead td img +{ + position: absolute; + top: 9px; + right: 8px; +} + +#sieverules-list-examples +{ + position: absolute; + bottom: 0; + left: 0; + right: 0; + width: 100%; + overflow: auto; +} + +#sieverules-details +{ + position: absolute; + top: 0; + left: 270px; + right: 0; + bottom: 0; +} + +#sieverules-advanced +{ + position: absolute; + top: 0; + left: 232px; + right: 0; + bottom: 0; +} + +span.disableLink +{ + float: right; + width: 200px; + text-align: right; +} + +#sieverules-table, +#sieverules-examples +{ + width: 100%; +} + +#sieverules-table tbody td +{ + cursor: default; +} + +#sieverules-table tbody td.control, +#rules-table tbody td.control, +#actions-table tbody td.control +{ + text-align: right; +} + +#sieverules-table tbody td.control a, +#rules-table tbody td.control a, +#actions-table tbody td.control a +{ + display: block; + float: right; + width: 16px; + height: 16px; + background-image: url(icons.png); +} + +#sieverules-table tbody td.control a.up_arrow +{ + background-position: 0 0; +} + +#sieverules-table tbody td.control a.down_arrow +{ + background-position: 0 -18px; +} + +#rules-table tbody td.control, +#actions-table tbody td.control +{ + vertical-align: top; +} + +#rules-table tbody td.control a.add, +#actions-table tbody td.control a.add +{ + margin-left: 5px; + background-position: 0 -78px; +} + +#rules-table tbody td.control a.delete, +#actions-table tbody td.control a.delete +{ + background-position: 0 -59px; +} + +#rules-table tbody td.control a.delete_act, +#actions-table tbody td.control a.delete_act +{ + background-position: 0 -39px; +} + +#actions-table tbody a.vacsig +{ + display: block; + width: 16px; + height: 16px; + background-image: url(icons.png); + background-position: -1px -126px; +} + +#actions-table tbody a.vacsig_act +{ + display: block; + width: 16px; + height: 16px; + background-image: url(icons.png); + background-position: -1px -102px; +} + +table.records-table +{ + width: auto; + border: 0; +} + +table.records-table tbody td, +table.records-table thead td +{ + border: 0; +} + +#rules-table, +#actions-table +{ + width: 100%; +} + +#rules-table td table.records-table +{ + width: auto; +} + +#rules-table td, +#actions-table td, +#rules-table td table.records-table td +{ + width: auto; +} + +#rules-table td.selheader, +#rules-table td.op +{ + width: 130px; +} + +#rules-table td.header +{ + width: 135px; +} + +#rules-table td.target +{ + width: 180px; +} + +#rules-table input +{ + width: 150px; +} + +#rules-table input.short +{ + width: 100px; +} + +#rules-table select +{ + width: 123px; +} + +#rules-table select.short +{ + width: 45px; +} + +#rules-table select.long +{ + width: 157px; +} + +#rules-table td table.records-table select +{ + width: 432px; +} + +#rules-table td table.records-table input +{ + width: 426px; +} + +#rules-table td table.records-table input.short +{ + width: 406px; +} + +#rules-table td table.records-table input.radio +{ + width: auto; +} + +#actions-table td.action +{ + width: 165px; + vertical-align: top; +} + +#actions-table td.folder +{ + width: 420px; + vertical-align: top; +} + +#actions-table td.action select +{ + width: 160px; +} + +#actions-table td.folder input, +#actions-table td.folder textarea +{ + width: 400px; +} + +#actions-table td.folder select +{ + width: 408px; +} + +#actions-table td.folder table.records-table select +{ + width: 337px; +} + +#actions-table td.folder table.records-table input, +#actions-table td.folder table.records-table textarea +{ + width: 330px; +} + +#actions-table td.folder table.records-table input.short, +#actions-table td.folder table.records-table select.short +{ + width: 310px; +} + +#actions-table td.folder table.records-table input.checkbox, +#actions-table td.folder table.records-table input.radio +{ + width: auto; +} + +table.records-table td.msg +{ + vertical-align: top; +} + +table.records-table td.vacdaysexp +{ + width: 398px; + white-space: -moz-pre-wrap !important; + white-space: pre-wrap !important; + white-space: pre; +} + +#advancedmode +{ + white-space: nowrap; + text-align: right; + position: absolute; + bottom: 30px; + right: 20px; + width: 460px; +} + +#sieverules-advancedbox +{ + position: absolute; + top: 34px; + left: 0; + bottom: 100px; + right: 8px; +} + +#sieverules-advanced textarea +{ + position: absolute; + top: 0; + left: 0; + border: 0; + width: 100%; + height: 100%; +} + +.listing tbody tr.droptarget td +{ + border-top: 2px solid #0e5266; + background-color: #D9ECF4; +} + +.listing tbody tr.droptargetend td +{ + border-bottom: 2px solid #0e5266; + background-color: #D9ECF4; +} + +#sieverulesrsdialog h3 +{ + color: #333; + font-size: medium; + margin-top: 0.5em; + margin-bottom: 1em; +} + +#sieverulesrsdialog table td input +{ + width: 20em; +} + +#sieverulesrsdialog .formbuttons +{ + margin-top: 1.5em; + text-align: center; +} + +input.inputmask +{ + color: #999999; +} + +#sieverulesactionsmenu a.selected +{ + font-weight: bold; +} + +#sieverules-advbuttons +{ + position: absolute; + left: 0; + bottom: 45px; +} + +#sieverules-advanced .boxfooter +{ + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 27px; + padding-left: 1px; + border-top: 1px solid #ddd; + border-radius: 0 0 4px 4px; + background: #eaeaea; + background: -moz-linear-gradient(top, #eaeaea 0%, #c8c8c8 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#eaeaea), color-stop(100%,#c8c8c8)); + background: -o-linear-gradient(top, #eaeaea 0%, #c8c8c8 100%); + background: -ms-linear-gradient(top, #eaeaea 0%, #c8c8c8 100%); + background: linear-gradient(top, #eaeaea 0%, #c8c8c8 100%); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +#sieverules-advanced .boxfooter .listbutton +{ + background: #C4BEBE; +} + +#sieverules-advanced .boxfooter .listbutton .inner +{ + height: 20px; + background-image: url(listicons.png); + background-position: 5px -52px; +} + +#sieverules-advanced .boxfooter #message +{ + position: absolute; + top: 0; + left: 65px; +} \ No newline at end of file diff --git a/plugins/sieverules/skins/larry/tabstyles.css b/plugins/sieverules/skins/larry/tabstyles.css new file mode 100644 index 000000000..a7c988240 --- /dev/null +++ b/plugins/sieverules/skins/larry/tabstyles.css @@ -0,0 +1,15 @@ +/** + * SieveRules plugin styles (tab styles) + */ + +#settings-sections #settingstabpluginsieverules a +{ + background-image: url(listicons.png); + background-position: 6px -2px; +} + +#settings-sections #settingstabpluginsieverules.selected a +{ + background-image: url(listicons.png); + background-position: 6px -25px; +} \ No newline at end of file diff --git a/plugins/sieverules/skins/larry/templates/advancededitor.html b/plugins/sieverules/skins/larry/templates/advancededitor.html new file mode 100644 index 000000000..38186f049 --- /dev/null +++ b/plugins/sieverules/skins/larry/templates/advancededitor.html @@ -0,0 +1,60 @@ + + + +<roundcube:object name="pagetitle" /> + + + + + + + + + + + + + +
+ + + +
+ +

+ +
+ +
+ +
+
+ +
+
+ +
+ + +
+
+ +
+ + + +
+
    + +
  • + +
  • +
  • +
  • + +> +
+
+ + + \ No newline at end of file diff --git a/plugins/sieverules/skins/larry/templates/editsieverule.html b/plugins/sieverules/skins/larry/templates/editsieverule.html new file mode 100644 index 000000000..5b7fe285c --- /dev/null +++ b/plugins/sieverules/skins/larry/templates/editsieverule.html @@ -0,0 +1,30 @@ + + + +<roundcube:object name="pagetitle" /> + + + + + + + + + + + +

+ +
+ +
+ +
+ + +
+ + + + + \ No newline at end of file diff --git a/plugins/sieverules/skins/larry/templates/setupsieverules.html b/plugins/sieverules/skins/larry/templates/setupsieverules.html new file mode 100644 index 000000000..0b11adbdd --- /dev/null +++ b/plugins/sieverules/skins/larry/templates/setupsieverules.html @@ -0,0 +1,27 @@ + + + +<roundcube:object name="pagetitle" /> + + + + + + + + + + + +

+ +
+ +
+ + + + + + + \ No newline at end of file diff --git a/plugins/sieverules/skins/larry/templates/sieverules.html b/plugins/sieverules/skins/larry/templates/sieverules.html new file mode 100644 index 000000000..694152076 --- /dev/null +++ b/plugins/sieverules/skins/larry/templates/sieverules.html @@ -0,0 +1,78 @@ + + + +<roundcube:object name="pagetitle" /> + + + + + + + + + + + + + +
+ + + +
+ +
+
+ + +
+
+ +
+
+ +
+
+ +
+ +
+ +
+ +
+ + + +
+
    + +
  • + +
  • +
  • +
  • + + +> + +
+
+ + + + + \ No newline at end of file diff --git a/plugins/sieverules/skins/larry/tick.png b/plugins/sieverules/skins/larry/tick.png new file mode 100644 index 000000000..6a26a6a08 Binary files /dev/null and b/plugins/sieverules/skins/larry/tick.png differ -- cgit v1.2.3