pax_global_header00006660000000000000000000000064121146752650014523gustar00rootroot0000000000000052 comment=5bf8f8b04bc65afdf8b3ce4162dc1fcfdbaf2166 Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/000077500000000000000000000000001211467526500217445ustar00rootroot00000000000000Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/.gitignore000066400000000000000000000000171211467526500237320ustar00rootroot00000000000000config.inc.php Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/CHANGELOG000066400000000000000000000054721211467526500231660ustar00rootroot00000000000000Roundcube Webmail SAUserPrefs ============================= Version 1.10 (2013-03-03, rc-0.9) ================================================= * merge PDO branch (de56ea1909) * rename default skin to classic (c40419bdfe) * rcube_ui > rcube_utils (r6091) * Update for Roundcube framework Version 1.9 (2012-07-07, rc-0.8) ================================================= * Versoin ready for rc-0.8 Version 1.8 (2012-04-08, rc-0.8) ================================================= * Make storage class to handle SQL work * Add new config option sauserprefs_bayes_delete to seperate function from SQL * Remove sauserprefs_deprecated_prefs config option * Make username configurable Version 1.7 (2012-01-22, rc-0.8) ================================================= * Add inital support for Larry Version 1.6 (2011-12-04, rc-0.7) ================================================= * Use core function to sanitize input * Add plugin hook sauserprefs_save * Fix double request when clicking on tab using Firefox (from r4472) * Seperate ok_locales and ok_langs Version 1.5 (2011-01-14, rc-0.5) ================================================= * Update hooks (r3883) Version 1.4 (2010-08-16, rc-0.4) ================================================= * Update hooks (r3840) Version 1.3 (2010-08-01, rc-0.4) ================================================= * Skin update after r3757 * Use core config function (WARNING: Complete re-write of config file!) Version 1.2 (2009-11-04, rc-0.4) ================================================= * Bug fix: remove error message when saving without changes * Allow disabling of entire sections via dont_override * Allow whitelist to synchronise with any address book * Make GLOBAL users configable * Allow overriding of prefs name in db (deprecated_prefs) * Fix localisation of scores Version 1.0 (2009-09-23, rc-0.3) ================================================= * Added panel for Bayes settings * Replace general_settings config option with dont_override * Added contextual help * Re-designed interface to match User Preferences * Added 'Default Score' option to spam score dropdown * Added 'Other' option to spam score dropdown (if value is not in the available options) * Added ability to restore spam settings to default * Remove deprecated pref requred_hits and replace with requred_score * Swap split() for explode(), PHP 5.3 compatibility * Added invert message language selection * Added delete icon * Added support for plugin template system * Removed display_order config var, this is now controlled from the template * Added new contact add/save/delete hooks * Removed need for contact_id field in prefs table * Added import and delete all functions for address rules * Small changes to init functions for when labels are added to UI * Translated from sauserprefs patchRoundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/README.md000066400000000000000000000067661211467526500232420ustar00rootroot00000000000000Roundcube Webmail SAUserPrefs ============================= This plugin adds the ability for users to edit they SpamAssassin user prefs from within Roundcube. It interacts with preferences storied in a database via SQL. For more information on setting up SpamAssassin to work with a database please see the [SpamAssassin Wiki][usingsql]. Tested with SpamAssassin Version 3.2.3 Inspiration for this plugin was taken from: [WebUserPrefs][webuserprefs] License ------- This plugin is released under the [GNU General Public License Version 3+][gpl]. Even if skins might contain some programming work, they are not considered as a linked part of the plugin and therefore skins DO NOT fall under the provisions of the GPL license. See the README file located in the core skins folder for details on the skin license. Install ------- * Place this plugin folder into plugins directory of Roundcube * Add sauserprefs to $rcmail_config['plugins'] in your Roundcube config **NB:** When downloading the plugin from GitHub you will need to create a directory called sauserprefs and place the files in there, ignoring the root directory in the downloaded archive. Config ------ The default config file is plugins/sauserprefs/config.inc.php.dist Rename this to plugins/sauserprefs/config.inc.php * You must set the database connection string * Enter the table name, name of the username field, preference field, and value field Changing the order of the sections ---------------------------------- To change the order of the sections add a sections attribute with the sections listed in the desired order to the sasectionslist object in skins/[skin]/templates/sauserprefs.html. For example: ```html ``` Whitelist Sync -------------- This plugin contains an option to synchronise changes to your RC address book and your SpamAssassin whitelist. Delete user bayesian data stored in database -------------------------------------------- If the bayesian data is stored in the same database as the user prefs then it is possible for users to delete their data from the UI. See config file for example SQL "SERVICE CURRENTLY NOT AVAILABLE! Error No. [500]" Error Message ---------------------------------------------------------------- On some setups users might see "SERVICE CURRENTLY NOT AVAILABLE! Error No. [500]" shows up at the top of the sauserprefs screen. In this case there could be a problem with the database connection. Try adding ?new_link=true to the end of the sauserprefs DSN in the config file. For example: ```php $rcmail_config['sauserprefs_db_dsnw'] = 'mysql://username:password@localhost/database?new_link=true'; ``` sauserprefs_save hook --------------------- Before prefs are saved to the database the plugin hook sauserprefs_save is executed, this allows you to perform any custom actions like extra validation or setting specific values. Arguments: * section: (string) current prefs section * cur_prefs: (array) the current user preferences * new_prefs: (array) the new preferences * global_prefs: (array) the global preferences Return: * new_prefs: (array) the new preferences * abort: (boolean) if true the prefs will not be saved * message: (string) optional reason why the prefs were not saved which will be shown to the user [usingsql]: http://wiki.apache.org/spamassassin/UsingSQL [webuserprefs]: http://sourceforge.net/projects/webuserprefs/ [gpl]: http://www.gnu.org/licenses/gpl.htmlRoundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/config.inc.php.dist000066400000000000000000000136721211467526500254450ustar00rootroot00000000000000 "5", "rewrite_header Subject" => "*****SPAM*****", "ok_languages" => "all", "ok_locales" => "all", "fold_headers" => "1", "add_header all Level" => "_STARS(*)_", "use_razor1" => "0", "use_razor2" => "1", "use_pyzor" => "1", "use_dcc" => "1", "use_bayes" => "1", "skip_rbl_checks" => "0", "report_safe" => "1", "bayes_auto_learn" => "1", "bayes_auto_learn_threshold_nonspam" => "0.1", "bayes_auto_learn_threshold_spam" => "12.0", "use_bayes_rules" => "1" ); // spam score increment - increment values in the the score threshold drop down by this, from 0 to 10 $rcmail_config['sauserprefs_score_inc'] = 1; // allow the user to delete bayesian data // please also see sauserprefs_bayes_delete_query option $rcmail_config['sauserprefs_bayes_delete'] = false; // delete user bayesian data stored in database // the query can contain the following macros that will be expanded as follows: // %u is replaced with the username from the sauserprefs_userid setting above // use an array to run multiple queries // eg. $rcmail_config['sauserprefs_bayes_delete_query'] = array( // 'DELETE FROM bayes_seen WHERE id IN (SELECT id FROM bayes_vars WHERE username = %u);', // 'DELETE FROM bayes_token WHERE id IN (SELECT id FROM bayes_vars WHERE username = %u);', // 'DELETE FROM bayes_vars WHERE username = %u;', // ); $rcmail_config['sauserprefs_bayes_delete_query'] = ''; // define languages $rcmail_config['sauserprefs_languages'] = array( "af" => "Afrikaans", "sq" => "Albanian", "am" => "Amharic", "ar" => "Arabic", "hy" => "Armenian", "eu" => "Basque", "bs" => "Bosnian", "bg" => "Bulgarian", "be" => "Byelorussian", "ca" => "Catalan", "zh" => "Chinese", "hr" => "Croatian", "cs" => "Czech", "da" => "Danish", "nl" => "Dutch", "en" => "English", "eo" => "Esperanto", "et" => "Estonian", "fi" => "Finnish", "fr" => "French", "fy" => "Frisian", "ka" => "Georgian", "de" => "German", "el" => "Greek", "he" => "Hebrew", "hi" => "Hindi", "hu" => "Hungarian", "is" => "Icelandic", "id" => "Indonesian", "ga" => "Irish Gaelic", "it" => "Italian", "ja" => "Japanese", "ko" => "Korean", "la" => "Latin", "lv" => "Latvian", "lt" => "Lithuanian", "ms" => "Malay", "mr" => "Marathi", "ne" => "Nepali", "no" => "Norwegian", "fa" => "Persian", "pl" => "Polish", "pt" => "Portuguese", "qu" => "Quechua", "rm" => "Rhaeto-Romance", "ro" => "Romanian", "ru" => "Russian", "sa" => "Sanskrit", "sco" => "Scots", "gd" => "Scottish Gaelic", "sr" => "Serbian", "sk" => "Slovak", "sl" => "Slovenian", "es" => "Spanish", "sw" => "Swahili", "sv" => "Swedish", "tl" => "Tagalog", "ta" => "Tamil", "th" => "Thai", "tr" => "Turkish", "uk" => "Ukrainian", "vi" => "Vietnamese", "cy" => "Welsh", "yi" => "Yiddish" ); ?>Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/include/000077500000000000000000000000001211467526500233675ustar00rootroot00000000000000Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/include/rcube_sauserprefs_storage.php000066400000000000000000000165761211467526500313650ustar00rootroot00000000000000db_dsnw = $db_dsnw; $this->db_dsnr = $db_dsnr; $this->db_persistent = $db_persistent; $this->sa_user = $sa_user; $this->table_name = $table_name; $this->username_field = $username_field; $this->preference_field = $preference_field; $this->value_field = $value_field; $this->bayes_delete_query = $bayes_delete_query; } function load_prefs($user) { $this->_db_connect('r'); $prefs = array(); $sql_result = $this->db->query( "SELECT ". $this->preference_field. ", ". $this->value_field. " FROM ". $this->table_name. " WHERE ". $this->username_field ." = ?;", $user); while ($sql_result && ($sql_arr = $this->db->fetch_assoc($sql_result))) { $pref_name = $sql_arr[$this->preference_field]; $pref_name = sauserprefs::map_pref_name($pref_name, true); $pref_value = $sql_arr[$this->value_field]; if ($pref_name == 'whitelist_from' || $pref_name == 'blacklist_from' || $pref_name == 'whitelist_to') $prefs['addresses'][] = array('field' => $pref_name, 'value' => $pref_value); else $prefs[$pref_name] = $pref_value; // update deprecated prefs in db if ($sql_arr[$this->preference_field] != sauserprefs::map_pref_name($pref_name)) { $this->_db_connect('w'); $this->db->query( "UPDATE ". $this->table_name. " SET ". $this->preference_field ." = ?". " WHERE ". $this->username_field ." = ?". " AND ". $this->preference_field ." = ?;", sauserprefs::map_pref_name($pref_name), $user, $sql_arr[$this->preference_field]); } } return $prefs; } function save_prefs($new_prefs, $cur_prefs, $global_prefs) { $this->_db_connect('w'); $result = true; // save prefs foreach ($new_prefs as $preference => $value) { if ($preference == 'addresses') { foreach ($value as $address) { if ($address['action'] == "DELETE") { $result = false; $this->db->query( "DELETE FROM ". $this->table_name. " WHERE ". $this->username_field ." = ?". " AND ". $this->preference_field ." = ?". " AND ". $this->value_field ." = ?;", $this->sa_user, sauserprefs::map_pref_name($address['field']), $address['value']); $result = $this->db->affected_rows(); if (!$result) { rcube::write_log('errors', 'sauserprefs error: cannot delete "' . sauserprefs::map_pref_name($prefs[$idx]) . '" = "' . $vals[$idx] . '" for ' . $this->sa_user); break; } } elseif ($address['action'] == "INSERT") { $result = false; $this->db->query( "INSERT INTO ". $this->table_name. " (". $this->username_field. ", ". $this->preference_field. ", ". $this->value_field. ") VALUES (?, ?, ?);", $this->sa_user, sauserprefs::map_pref_name($address['field']), $address['value']); $result = $this->db->affected_rows(); if (!$result) { rcube::write_log('errors', 'sauserprefs error: cannot insert "' . sauserprefs::map_pref_name($prefs[$idx]) . '" = "' . $vals[$idx] . '" for ' . $this->sa_user); break; } } } } elseif (array_key_exists($preference, $cur_prefs) && ($value == "" || $value == $global_prefs[$preference])) { $result = false; $this->db->query( "DELETE FROM ". $this->table_name. " WHERE ". $this->username_field ." = ?". " AND ". $this->preference_field ." = ?;", $this->sa_user, sauserprefs::map_pref_name($preference)); $result = $this->db->affected_rows(); if (!$result) { rcube::write_log('errors', 'sauserprefs error: cannot delete "' . sauserprefs::map_pref_name($preference) . '" for "' . $this->sa_user); break; } } elseif (array_key_exists($preference, $cur_prefs) && $value != $cur_prefs[$preference]) { $result = false; $this->db->query( "UPDATE ". $this->table_name. " SET ". $this->value_field ." = ?". " WHERE ". $this->username_field ." = ?". " AND ". $this->preference_field ." = ?;", $value, $this->sa_user, sauserprefs::map_pref_name($preference)); $result = $this->db->affected_rows(); if (!$result) { rcube::write_log('errors', 'sauserprefs error: cannot update "' . sauserprefs::map_pref_name($preference) . '" = "' . $value . '" for ' . $this->sa_user); break; } } elseif (!array_key_exists($preference, $cur_prefs) && $value != $global_prefs[$preference]) { $result = false; $this->db->query( "INSERT INTO ". $this->table_name. " (". $this->username_field. ", ". $this->preference_field. ", ". $this->value_field. ") VALUES (?, ?, ?);", $this->sa_user, sauserprefs::map_pref_name($preference), $value); $result = $this->db->affected_rows(); if (!$result) { rcube::write_log('errors', 'sauserprefs error: cannot insert "' . sauserprefs::map_pref_name($preference) . '" = "' . $value . '" for ' . $this->sa_user); break; } } } return $result; } function whitelist_add($emails) { $this->_db_connect('w'); foreach ($emails as $email) { // check address is not already whitelisted $sql_result = $this->db->query( "SELECT ". $this->value_field. " FROM ". $this->table_name. " WHERE ". $this->username_field ." = ?". " AND ". $this->preference_field ." = ?". " AND ". $this->value_field ." = ?;", $this->sa_user, sauserprefs::map_pref_name('whitelist_from'), $email); if (!$this->db->fetch_array($sql_result)) $this->db->query( "INSERT INTO ". $this->table_name. " (". $this->username_field. ", ". $this->preference_field. ", ". $this->value_field. ") VALUES (?, ?, ?);", $this->sa_user, sauserprefs::map_pref_name('whitelist_from'), $email); } } function whitelist_delete($emails) { $this->_db_connect('w'); foreach ($emails as $email) $this->db->query( "DELETE FROM ". $this->table_name. " WHERE ". $this->username_field ." = ?". " AND ". $this->preference_field ." = ?". " AND ". $this->value_field ." = ?;", $this->sa_user, sauserprefs::map_pref_name('whitelist_from'), $email); } function purge_bayes() { $this->_db_connect('w'); $queries = !is_array($this->bayes_delete_query) ? array($this->bayes_delete_query) : $this->bayes_delete_query; foreach ($queries as $sql) { $sql = str_replace('%u', $this->db->quote($this->sa_user, 'text'), $sql); $this->db->query($sql); if ($this->db->is_error()) break; } if (!$this->db->is_error()) return true; else return false; } private function _db_connect($mode) { if (!$this->db) $this->db = rcube_db::factory($this->db_dsnw, $this->db_dsnr, $this->db_persistent); $this->db->db_connect($mode); // check DB connections and exit on failure if ($err_str = $this->db->is_error()) { raise_error(array( 'code' => 603, 'type' => 'db', 'message' => $err_str), false, true); } } } ?>Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/localization/000077500000000000000000000000001211467526500244345ustar00rootroot00000000000000Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/localization/cs_CZ.inc000066400000000000000000000172361211467526500261410ustar00rootroot00000000000000Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/localization/de_CH.inc000066400000000000000000000163111211467526500260730ustar00rootroot00000000000000Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/localization/de_DE.inc000066400000000000000000000163111211467526500260710ustar00rootroot00000000000000Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/localization/en_GB.inc000066400000000000000000000161201211467526500261010ustar00rootroot00000000000000Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/localization/en_US.inc000066400000000000000000000161201211467526500261400ustar00rootroot00000000000000Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/localization/es_ES.inc000066400000000000000000000172041211467526500261310ustar00rootroot00000000000000Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/localization/fr_FR.inc000066400000000000000000000203151211467526500261260ustar00rootroot00000000000000Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/localization/gl_ES.inc000066400000000000000000000177201211467526500261270ustar00rootroot00000000000000Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/localization/hu_HU.inc000066400000000000000000000076761211467526500261570ustar00rootroot00000000000000Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/localization/it_IT.inc000066400000000000000000000176131211467526500261470ustar00rootroot00000000000000Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/localization/pl_PL.inc000066400000000000000000000167101211467526500261420ustar00rootroot00000000000000Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/localization/pt_BR.inc000066400000000000000000000150151211467526500261370ustar00rootroot00000000000000Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/localization/ro_RO.inc000066400000000000000000000163561211467526500261620ustar00rootroot00000000000000Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/localization/ru_RU.inc000066400000000000000000000315661211467526500261760ustar00rootroot00000000000000Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/localization/sk_SK.inc000066400000000000000000000171331211467526500261460ustar00rootroot00000000000000Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/localization/sv_SE.inc000066400000000000000000000172671211467526500261630ustar00rootroot00000000000000Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/package.xml000066400000000000000000000077431211467526500240740ustar00rootroot00000000000000 sauserprefs http://github.com/JohnDoh/Roundcube-Plugin-SpamAssassin-User-Prefs-SQL/ Control SpamAssassin settings from within Roundcube Adds a 'Spam' tab to the 'Personal Settings' to allow the user to change their SpamAssassin preferences. Preferences must be stored in a SQL database. Default preferences are used when no user preference is found. Philip Weir JohnDoh roundcube@tehinterweb.co.uk yes 2013-02-24 1.10 1.10 stable stable GNU GPLv3+ - 5.2.1 1.7.0 Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/sauserprefs.js000066400000000000000000000372631211467526500246570ustar00rootroot00000000000000/** * SAUserPrefs plugin script */ rcube_webmail.prototype.sauserprefs_toggle_level_char = function(checkbox) { var level_char; if (level_char = rcube_find_object('rcmfd_spamlevelchar')) level_char.disabled = !checkbox.checked; } rcube_webmail.prototype.sauserprefs_toggle_bayes = function(checkbox) { var tickbox; var dropdown; if (tickbox = rcube_find_object('rcmfd_spambayesrules')) tickbox.disabled = !checkbox.checked; if (tickbox = rcube_find_object('rcmfd_spambayesautolearn')) tickbox.disabled = !checkbox.checked; if ((dropdown = rcube_find_object('rcmfd_bayesnonspam')) && (tickbox.checked || !checkbox.checked)) dropdown.disabled = !checkbox.checked; if ((dropdown = rcube_find_object('rcmfd_bayesspam')) && (tickbox.checked || !checkbox.checked)) dropdown.disabled = !checkbox.checked; } rcube_webmail.prototype.sauserprefs_toggle_bayes_auto = function(checkbox) { var dropdown; if (dropdown = rcube_find_object('rcmfd_bayesnonspam')) dropdown.disabled = !checkbox.checked; if (dropdown = rcube_find_object('rcmfd_bayesspam')) dropdown.disabled = !checkbox.checked; } rcube_webmail.prototype.sauserprefs_addressrule_import = function(address) { parent.rcmail.set_busy(false, null, rcmail.env.sauserprefs_whitelist); var adrTable = rcube_find_object('address-rules-table').tBodies[0]; var actions = document.getElementsByName('_address_rule_act[]'); var prefs = document.getElementsByName('_address_rule_field[]'); var addresses = document.getElementsByName('_address_rule_value[]'); var insHere; for (var i = 1; i < addresses.length; i++) { if (addresses[i].value == address && actions[i].value != "DELETE") { return false; } else if (addresses[i].value > address) { insHere = adrTable.rows[i + 1]; break; } } var newNode = adrTable.rows[0].cloneNode(true); adrTable.rows[1].style.display = 'none'; if (insHere) adrTable.insertBefore(newNode, insHere); else adrTable.appendChild(newNode); newNode.style.display = ""; newNode.cells[0].className = "whitelist_from"; newNode.cells[0].innerHTML = rcmail.gettext('whitelist_from','sauserprefs'); newNode.cells[1].innerHTML = address; actions[newNode.rowIndex - 2].value = "INSERT"; prefs[newNode.rowIndex - 2].value = "whitelist_from"; addresses[newNode.rowIndex - 2].value = address; rcmail.env.address_rule_count++; } rcube_webmail.prototype.sauserprefs_help = function(sel) { var help = rcube_find_object(sel); help.style.display = (help.style.display == 'none' ? '' : 'none'); return false; } $(document).ready(function() { if (window.rcmail) { rcmail.addEventListener('init', function(evt) { var tab = $('').attr('id', 'settingstabpluginsauserprefs').addClass('tablink'); var button = $('').attr('href', rcmail.env.comm_path+'&_action=plugin.sauserprefs').attr('title', rcmail.gettext('managespam', 'sauserprefs')).html(rcmail.gettext('sauserprefs','sauserprefs')).appendTo(tab); // add button and register command rcmail.add_element(tab, 'tabs'); if (rcmail.env.action == 'plugin.sauserprefs.edit') { rcmail.register_command('plugin.sauserprefs.select_all_langs', function() { var langlist = document.getElementsByName('_spamlang[]'); var obj; for (var i = 0; i < langlist.length; i++) { langlist[i].checked = true; obj = rcube_find_object('spam_lang_'+ i); obj.title = rcmail.gettext('enabled','sauserprefs'); obj.className = 'enabled'; } return false; }, true); rcmail.register_command('plugin.sauserprefs.select_invert_langs', function() { var langlist = document.getElementsByName('_spamlang[]'); var obj; for (var i = 0; i < langlist.length; i++) { if (langlist[i].checked) { langlist[i].checked = false; obj = rcube_find_object('spam_lang_'+ i); obj.title = rcmail.gettext('disabled','sauserprefs'); obj.className = 'disabled'; } else { langlist[i].checked = true; obj = rcube_find_object('spam_lang_'+ i); obj.title = rcmail.gettext('enabled','sauserprefs'); obj.className = 'enabled'; } } return false; }, true); rcmail.register_command('plugin.sauserprefs.select_no_langs', function() { var langlist = document.getElementsByName('_spamlang[]'); var obj; for (var i = 0; i < langlist.length; i++) { langlist[i].checked = false; obj = rcube_find_object('spam_lang_'+ i); obj.title = rcmail.gettext('disabled','sauserprefs'); obj.className = 'disabled'; } return false; }, true); rcmail.register_command('plugin.sauserprefs.message_lang', function(lang_code, obj) { var langlist = document.getElementsByName('_spamlang[]'); var i = obj.parentNode.parentNode.rowIndex - 1; if (langlist[i].checked) { langlist[i].checked = false; obj.title = rcmail.gettext('disabled','sauserprefs'); obj.className = 'disabled'; } else { langlist[i].checked = true; obj.title = rcmail.gettext('enabled','sauserprefs'); obj.className = 'enabled'; } return false; }, true); rcmail.register_command('plugin.sauserprefs.addressrule_del', function(props, obj) { var adrTable = rcube_find_object('address-rules-table').tBodies[0]; var rowidx = obj.parentNode.parentNode.rowIndex - 1; var fieldidx = rowidx - 1; if (!confirm(rcmail.gettext('spamaddressdelete','sauserprefs'))) return false; if (document.getElementsByName('_address_rule_act[]')[fieldidx].value == "INSERT") { adrTable.deleteRow(rowidx); } else { adrTable.rows[rowidx].style.display = 'none'; document.getElementsByName('_address_rule_act[]')[fieldidx].value = "DELETE"; } rcmail.env.address_rule_count--; if (rcmail.env.address_rule_count < 1) adrTable.rows[1].style.display = ''; return false; }, true); rcmail.register_command('plugin.sauserprefs.addressrule_add', function() { var adrTable = rcube_find_object('address-rules-table').tBodies[0]; var input_spamaddressrule = rcube_find_object('_spamaddressrule'); var selrule = input_spamaddressrule.selectedIndex; var input_spamaddress = rcube_find_object('_spamaddress'); if (input_spamaddress.value.replace(/^\s+|\s+$/g, '') == '') { alert(rcmail.gettext('spamenteraddress','sauserprefs')); input_spamaddress.focus(); return false; } else if (!rcube_check_email(input_spamaddress.value.replace(/^\s+/, '').replace(/[\s,;]+$/, ''), true)) { alert(rcmail.gettext('spamaddresserror','sauserprefs')); input_spamaddress.focus(); return false; } else { var actions = document.getElementsByName('_address_rule_act[]'); var prefs = document.getElementsByName('_address_rule_field[]'); var addresses = document.getElementsByName('_address_rule_value[]'); var insHere; for (var i = 1; i < addresses.length; i++) { if (addresses[i].value == input_spamaddress.value && actions[i].value != "DELETE") { alert(rcmail.gettext('spamaddressexists','sauserprefs')); input_spamaddress.focus(); return false; } else if (addresses[i].value > input_spamaddress.value) { insHere = adrTable.rows[i + 1]; break; } } var newNode = adrTable.rows[0].cloneNode(true); adrTable.rows[1].style.display = 'none'; if (insHere) adrTable.insertBefore(newNode, insHere); else adrTable.appendChild(newNode); newNode.style.display = ""; newNode.cells[0].className = input_spamaddressrule.options[selrule].value; newNode.cells[0].innerHTML = input_spamaddressrule.options[selrule].text; newNode.cells[1].innerHTML = input_spamaddress.value; actions[newNode.rowIndex - 2].value = "INSERT"; prefs[newNode.rowIndex - 2].value = input_spamaddressrule.options[selrule].value; addresses[newNode.rowIndex - 2].value = input_spamaddress.value; input_spamaddressrule.selectedIndex = 0; input_spamaddress.value = ''; rcmail.env.address_rule_count++; } }, true); rcmail.register_command('plugin.sauserprefs.whitelist_delete_all', function(props, obj) { var adrTable = rcube_find_object('address-rules-table').tBodies[0]; if (!confirm(rcmail.gettext('spamaddressdeleteall','sauserprefs'))) return false; for (var i = adrTable.rows.length - 1; i > 1; i--) { if (document.getElementsByName('_address_rule_act[]')[i-1].value == "INSERT") { adrTable.deleteRow(i); rcmail.env.address_rule_count--; } else if (document.getElementsByName('_address_rule_act[]')[i-1].value != "DELETE") { adrTable.rows[i].style.display = 'none'; document.getElementsByName('_address_rule_act[]')[i-1].value = "DELETE"; rcmail.env.address_rule_count--; } } adrTable.rows[1].style.display = ''; return false; }, true); rcmail.register_command('plugin.sauserprefs.import_whitelist', function(props, obj) { rcmail.env.sauserprefs_whitelist = rcmail.set_busy(true, 'sauserprefs.importingaddresses'); rcmail.http_request('plugin.sauserprefs.whitelist_import', '', rcmail.env.sauserprefs_whitelist); return false; }, true); rcmail.register_command('plugin.sauserprefs.purge_bayes', function(props, obj) { if (confirm(rcmail.gettext('purgebayesconfirm','sauserprefs'))) { var lock = rcmail.set_busy(true, 'sauserprefs.purgingbayes'); rcmail.http_request('plugin.sauserprefs.purge_bayes', '', lock); } return false; }, true); rcmail.register_command('plugin.sauserprefs.save', function() { rcmail.gui_objects.editform.submit(); }, true); rcmail.register_command('plugin.sauserprefs.default', function() { if (confirm(rcmail.gettext('usedefaultconfirm','sauserprefs'))) { // Score if (rcube_find_object('rcmfd_spamthres')) rcube_find_object('rcmfd_spamthres').selectedIndex = 0; // Subject tag if (rcube_find_object('rcmfd_spamsubject')) rcube_find_object('rcmfd_spamsubject').value = rcmail.env.rewrite_header_Subject // Languages var langlist = document.getElementsByName('_spamlang[]'); var obj; var dlangs = " " + rcmail.env.ok_languages + " "; for (var i = 0; i < langlist.length; i++) { langlist[i].checked = false; obj = rcube_find_object('spam_lang_' + i); obj.title = rcmail.gettext('disabled','sauserprefs'); obj.className = 'disabled'; if (dlangs.indexOf(" " + langlist[i].value + " ") > -1) { langlist[i].checked = true; obj = rcube_find_object('spam_lang_' + i); obj.title = rcmail.gettext('enabled','sauserprefs'); obj.className = 'enabled'; } } // Tests if (rcube_find_object('rcmfd_spamuserazor1')) { if (rcmail.env.use_razor1 == '1') rcube_find_object('rcmfd_spamuserazor1').checked = true; else rcube_find_object('rcmfd_spamuserazor1').checked = false; } if (rcube_find_object('rcmfd_spamuserazor2')) { if (rcmail.env.use_razor2 == '1') rcube_find_object('rcmfd_spamuserazor2').checked = true; else rcube_find_object('rcmfd_spamuserazor2').checked = false; } if (rcube_find_object('rcmfd_spamusepyzor')) { if (rcmail.env.use_pyzor == '1') rcube_find_object('rcmfd_spamusepyzor').checked = true; else rcube_find_object('rcmfd_spamusepyzor').checked = false; } if (rcube_find_object('rcmfd_spamusedcc')) { if (rcmail.env.use_dcc == '1') rcube_find_object('rcmfd_spamusedcc').checked = true; else rcube_find_object('rcmfd_spamusedcc').checked = false; } if (rcube_find_object('rcmfd_spamskiprblchecks')) { if (rcmail.env.skip_rbl_checks == '1') rcube_find_object('rcmfd_spamskiprblchecks').checked = true; else rcube_find_object('rcmfd_spamskiprblchecks').checked = false; } // Bayes if (rcube_find_object('rcmfd_spamusebayes')) { if (rcmail.env.use_bayes == '1') rcube_find_object('rcmfd_spamusebayes').checked = true; else rcube_find_object('rcmfd_spamusebayes').checked = false; } if (rcube_find_object('rcmfd_spambayesautolearn')) { if (rcmail.env.bayes_auto_learn == '1') rcube_find_object('rcmfd_spambayesautolearn').checked = true; else rcube_find_object('rcmfd_spambayesautolearn').checked = false; } if (rcube_find_object('rcmfd_bayesnonspam')) rcube_find_object('rcmfd_bayesnonspam').selectedIndex = 0; if (rcube_find_object('rcmfd_bayesspam')) rcube_find_object('rcmfd_bayesspam').selectedIndex = 0; if (rcube_find_object('rcmfd_spambayesrules')) { if (rcmail.env.use_bayes_rules == '1') rcube_find_object('rcmfd_spambayesrules').checked = true; else rcube_find_object('rcmfd_spambayesrules').checked = false; } // Headers if (rcube_find_object('rcmfd_spamfoldheaders')) { if (rcmail.env.skip_rbl_checks == '1') rcube_find_object('rcmfd_spamfoldheaders').checked = true; else rcube_find_object('rcmfd_spamfoldheaders').checked = false; } if (rcube_find_object('rcmfd_spamlevelstars')) { if (rcmail.env.add_header_all_Level != '') { rcube_find_object('rcmfd_spamlevelstars').checked = true; rcube_find_object('rcmfd_spamlevelchar').value = rcmail.env.add_header_all_Level.substr(7, 1); } else { rcube_find_object('rcmfd_spamlevelstars').checked = false; rcube_find_object('rcmfd_spamlevelchar').value = "*"; } } // Report if (rcube_find_object('rcmfd_spamreport_0')) { if (rcmail.env.report_safe == '0') rcube_find_object('rcmfd_spamreport_0').checked = true; else rcube_find_object('rcmfd_spamreport_0').checked = false; } if (rcube_find_object('rcmfd_spamreport_1')) { if (rcmail.env.report_safe == '1') rcube_find_object('rcmfd_spamreport_1').checked = true; else rcube_find_object('rcmfd_spamreport_1').checked = false; } if (rcube_find_object('rcmfd_spamreport_2')) { if (rcmail.env.report_safe == '2') rcube_find_object('rcmfd_spamreport_2').checked = true; else rcube_find_object('rcmfd_spamreport_2').checked = false; } // Delete whitelist if (rcube_find_object('address-rules-table')) { var adrTable = rcube_find_object('address-rules-table').tBodies[0]; for (var i = adrTable.rows.length - 1; i > 1; i--) { if (document.getElementsByName('_address_rule_act[]')[i-1].value == "INSERT") { adrTable.deleteRow(i); rcmail.env.address_rule_count--; } else if (document.getElementsByName('_address_rule_act[]')[i-1].value != "DELETE") { adrTable.rows[i].style.display = 'none'; document.getElementsByName('_address_rule_act[]')[i-1].value = "DELETE"; rcmail.env.address_rule_count--; } } adrTable.rows[1].style.display = ''; } } }, true); rcmail.enable_command('plugin.sauserprefs.save','plugin.sauserprefs.default', true); } }); if (rcmail.env.action == 'plugin.sauserprefs') { rcmail.section_select = function(list) { var id = list.get_single_selection() if (id) { var add_url = ''; var target = window; this.set_busy(true); if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) { add_url = '&_framed=1'; target = window.frames[this.env.contentframe]; } target.location.href = this.env.comm_path + '&_action=plugin.sauserprefs.edit&_section=' + id + add_url; } return true; } } } });Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/sauserprefs.php000066400000000000000000001217221211467526500250240ustar00rootroot00000000000000 'required_score'); function init() { $rcmail = rcube::get_instance(); $this->load_config(); $this->sa_user = $rcmail->config->get('sauserprefs_userid', "%u"); $identity_arr = $rcmail->user->get_identity(); $identity = $identity_arr['email']; $this->sa_user = str_replace('%u', $_SESSION['username'], $this->sa_user); $this->sa_user = str_replace('%l', $rcmail->user->get_username('local'), $this->sa_user); $this->sa_user = str_replace('%d', $rcmail->user->get_username('domain'), $this->sa_user); $this->sa_user = str_replace('%i', $identity, $this->sa_user); // init storage include('include/rcube_sauserprefs_storage.php'); $this->storage = new rcube_sauserprefs_storage($rcmail->config->get('sauserprefs_db_dsnw'), $rcmail->config->get('sauserprefs_db_dsnr'), $rcmail->config->get('sauserprefs_db_persistent'), $this->sa_user, $rcmail->config->get('sauserprefs_sql_table_name'), $rcmail->config->get('sauserprefs_sql_username_field'), $rcmail->config->get('sauserprefs_sql_preference_field'), $rcmail->config->get('sauserprefs_sql_value_field'), $rcmail->config->get('sauserprefs_bayes_delete_query')); if ($rcmail->config->get('sauserprefs_whitelist_abook_id', false)) $this->addressbook = $rcmail->config->get('sauserprefs_whitelist_abook_id'); if ($rcmail->task == 'settings') { $this->add_texts('localization/', array('sauserprefs', 'managespam')); $this->include_stylesheet($this->local_skin_path() . '/tabstyles.css'); $this->sections = array( 'general' => array('id' => 'general', 'section' => $this->gettext('spamgeneralsettings')), 'tests' => array('id' => 'tests', 'section' => $this->gettext('spamtests')), 'bayes' => array('id' => 'bayes', 'section' => $this->gettext('bayes')), 'headers' => array('id' => 'headers', 'section' => $this->gettext('headers')), 'report' => array('id' => 'report','section' => $this->gettext('spamreportsettings')), 'addresses' => array('id' => 'addresses', 'section' => $this->gettext('spamaddressrules')), ); $this->cur_section = rcube_utils::get_input_value('_section', rcube_utils::INPUT_GPC); $this->register_action('plugin.sauserprefs', array($this, 'init_html')); $this->register_action('plugin.sauserprefs.edit', array($this, 'init_html')); $this->register_action('plugin.sauserprefs.save', array($this, 'save')); $this->register_action('plugin.sauserprefs.whitelist_import', array($this, 'whitelist_import')); $this->register_action('plugin.sauserprefs.purge_bayes', array($this, 'purge_bayes')); $this->include_script('sauserprefs.js'); } elseif ($rcmail->config->get('sauserprefs_whitelist_sync')) { $this->add_hook('contact_create', array($this, 'contact_add')); $this->add_hook('contact_update', array($this, 'contact_save')); $this->add_hook('contact_delete', array($this, 'contact_delete')); } } function init_html() { $this->_load_global_prefs(); $this->_load_user_prefs(); $this->api->output->set_pagetitle($this->gettext('sauserprefssettings')); if (rcube::get_instance()->action == 'plugin.sauserprefs.edit') { $this->user_prefs = array_merge($this->global_prefs, $this->user_prefs); $this->api->output->add_handler('userprefs', array($this, 'gen_form')); $this->api->output->add_handler('sectionname', array($this, 'prefs_section_name')); $this->api->output->send('sauserprefs.settingsedit'); } else { $this->api->output->add_handler('sasectionslist', array($this, 'section_list')); $this->api->output->add_handler('saprefsframe', array($this, 'preference_frame')); $this->api->output->send('sauserprefs.sauserprefs'); } } function section_list($attrib) { $no_override = array_flip(rcube::get_instance()->config->get('sauserprefs_dont_override')); // add id to message list table if not specified if (!strlen($attrib['id'])) $attrib['id'] = 'rcmsectionslist'; $sections = array(); $blocks = $attrib['sections'] ? preg_split('/[\s,;]+/', strip_quotes($attrib['sections'])) : array_keys($this->sections); foreach ($blocks as $block) { if (!isset($no_override['{' . $block . '}'])) $sections[$block] = $this->sections[$block]; } // create XHTML table $out = rcube::get_instance()->table_output($attrib, $sections, array('section'), 'id'); // set client env $this->api->output->add_gui_object('sectionslist', $attrib['id']); $this->api->output->include_script('list.js'); return $out; } function preference_frame($attrib) { if (!$attrib['id']) $attrib['id'] = 'rcmprefsframe'; return $this->api->output->frame($attrib, true); } function gen_form($attrib) { $this->api->output->add_label( 'sauserprefs.spamaddressexists', 'sauserprefs.spamenteraddress', 'sauserprefs.spamaddresserror', 'sauserprefs.spamaddressdelete', 'sauserprefs.spamaddressdeleteall', 'sauserprefs.enabled', 'sauserprefs.disabled', 'sauserprefs.importingaddresses', 'sauserprefs.usedefaultconfirm', 'sauserprefs.purgebayesconfirm', 'sauserprefs.whitelist_from'); // output global prefs as default in env foreach($this->global_prefs as $key => $val) $this->api->output->set_env(str_replace(" ", "_", $key), $val); unset($attrib['form']); list($form_start, $form_end) = get_form_tags($attrib, 'plugin.sauserprefs.save', null, array('name' => '_section', 'value' => $this->cur_section)); $out = $form_start; $out .= $this->_prefs_block($this->cur_section, $attrib); return $out . $form_end; } function prefs_section_name() { return $this->sections[$this->cur_section]['section']; } function save() { $rcmail = rcube::get_instance(); $this->_load_global_prefs(); $this->_load_user_prefs(); $no_override = array_flip($rcmail->config->get('sauserprefs_dont_override')); $new_prefs = array(); $result = true; switch ($this->cur_section) { case 'general': if (!isset($no_override['required_hits'])) $new_prefs['required_hits'] = rcube_utils::get_input_value('_spamthres', rcube_utils::INPUT_POST); if (!isset($no_override['rewrite_header Subject'])) $new_prefs['rewrite_header Subject'] = rcube_utils::get_input_value('_spamsubject', rcube_utils::INPUT_POST); if (!isset($no_override['ok_locales'])) { $new_prefs['ok_locales'] = ''; if (is_array(rcube_utils::get_input_value('_spamlang', rcube_utils::INPUT_POST))) { $locales = array_intersect(rcube_utils::get_input_value('_spamlang', rcube_utils::INPUT_POST), $this->sa_locales); $new_prefs['ok_locales'] = implode(" ", $locales); } } if (!isset($no_override['ok_languages'])) $new_prefs['ok_languages'] = is_array(rcube_utils::get_input_value('_spamlang', rcube_utils::INPUT_POST)) ? implode(" ", rcube_utils::get_input_value('_spamlang', rcube_utils::INPUT_POST)) : ''; break; case 'headers': if (!isset($no_override['fold_headers'])) $new_prefs['fold_headers'] = empty($_POST['_spamfoldheaders']) ? "0" : "1"; if (!isset($no_override['add_header all Level'])) { $spamchar = empty($_POST['_spamlevelchar']) ? "*" : rcube_utils::get_input_value('_spamlevelchar', rcube_utils::INPUT_POST); if (rcube_utils::get_input_value('_spamlevelstars', rcube_utils::INPUT_POST) == "1") { $new_prefs['add_header all Level'] = "_STARS(". $spamchar .")_"; $new_prefs['remove_header all'] = "0"; } else { $new_prefs['add_header all Level'] = ""; $new_prefs['remove_header all'] = "Level"; } } break; case 'tests': if (!isset($no_override['use_razor1'])) $new_prefs['use_razor1'] = empty($_POST['_spamuserazor1']) ? "0" : "1"; if (!isset($no_override['use_razor2'])) $new_prefs['use_razor2'] = empty($_POST['_spamuserazor2']) ? "0" : "1"; if (!isset($no_override['use_pyzor'])) $new_prefs['use_pyzor'] = empty($_POST['_spamusepyzor']) ? "0" : "1"; if (!isset($no_override['use_dcc'])) $new_prefs['use_dcc'] = empty($_POST['_spamusedcc']) ? "0" : "1"; if (!isset($no_override['skip_rbl_checks'])) $new_prefs['skip_rbl_checks'] = empty($_POST['_spamskiprblchecks']) ? "1" : "0"; break; case 'bayes': if (!isset($no_override['use_bayes'])) $new_prefs['use_bayes'] = empty($_POST['_spamusebayes']) ? "0" : "1"; if (!isset($no_override['bayes_auto_learn'])) $new_prefs['bayes_auto_learn'] = empty($_POST['_spambayesautolearn']) ? "0" : "1"; if (!isset($no_override['bayes_auto_learn_threshold_nonspam']) && !empty($_POST['_bayesnonspam'])) $new_prefs['bayes_auto_learn_threshold_nonspam'] = rcube_utils::get_input_value('_bayesnonspam', rcube_utils::INPUT_POST); if (!isset($no_override['bayes_auto_learn_threshold_spam']) && !empty($_POST['_bayesspam'])) $new_prefs['bayes_auto_learn_threshold_spam'] = rcube_utils::get_input_value('_bayesspam', rcube_utils::INPUT_POST); if (!isset($no_override['use_bayes_rules'])) $new_prefs['use_bayes_rules'] = empty($_POST['_spambayesrules']) ? "0" : "1"; break; case 'report': if (!isset($no_override['report_safe'])) $new_prefs['report_safe'] = rcube_utils::get_input_value('_spamreport', rcube_utils::INPUT_POST); break; case 'addresses': $acts = rcube_utils::get_input_value('_address_rule_act', rcube_utils::INPUT_POST); $prefs = rcube_utils::get_input_value('_address_rule_field', rcube_utils::INPUT_POST); $vals = rcube_utils::get_input_value('_address_rule_value', rcube_utils::INPUT_POST); foreach ($acts as $idx => $act) $new_prefs['addresses'][] = array('field' => $prefs[$idx], 'value' => $vals[$idx], 'action' => $act); break; } // allow additional actions before prefs are saved $data = $rcmail->plugins->exec_hook('sauserprefs_save', array( 'section' => $this->cur_section, 'cur_prefs' => $this->user_prefs, 'new_prefs' => $new_prefs, 'global_prefs' => $this->global_prefs)); if (!$data['abort']) { // save prefs if ($this->storage->save_prefs($data['new_prefs'], $this->user_prefs, $this->global_prefs)) $this->api->output->command('display_message', $this->gettext('sauserprefchanged'), 'confirmation'); else $this->api->output->command('display_message', $this->gettext('sauserpreffailed'), 'error'); } else { $this->api->output->command('display_message', $data['message'] ? $data['message'] : $this->gettext('sauserpreffailed'), 'error'); } // go to next step $rcmail->overwrite_action('plugin.sauserprefs.edit'); $this->_load_user_prefs(); $this->init_html(); } function whitelist_import() { $contacts = rcube::get_instance()->get_address_book($this->addressbook); $contacts->set_page(1); $contacts->set_pagesize(99999); $result = $contacts->list_records(null, 0, true); if (empty($result) || $result->count == 0) return; $records = $result->records; foreach ($records as $row_data) { foreach ($this->_gen_email_arr($row_data) as $email) $this->api->output->command('sauserprefs_addressrule_import', $email, '', ''); } $contacts->close(); } function purge_bayes() { $rcmail = rcube::get_instance(); if (!$rcmail->config->get('sauserprefs_bayes_delete', false)) { $this->api->output->command('display_message', $this->gettext('servererror'), 'error'); return; } if ($this->storage->purge_bayes()) $this->api->output->command('display_message', $this->gettext('done'), 'confirmation'); else $this->api->output->command('display_message', $this->gettext('servererror'), 'error'); } function contact_add($args) { $rcmail = rcube::get_instance(); // only works with specified address book if ($args['source'] != $this->addressbook && $args['source'] != null) return; $emails = $this->_gen_email_arr($args['record']); $this->storage->whitelist_add($emails); } function contact_save($args) { $this->contact_delete($args); $this->contact_add($args); } function contact_delete($args) { $rcmail = rcube::get_instance(); // only works with specified address book if ($args['source'] != $this->addressbook && $args['source'] != null) return; if (!is_array($args['id'])) $args['id'] = array($args['id']); $contacts = $rcmail->get_address_book($this->addressbook); foreach ($args['id'] as $id) { $emails = $this->_gen_email_arr($contacts->get_record($id, true)); $this->storage->whitelist_delete($emails); } $contacts->close(); } private function _load_global_prefs() { $rcmail = rcube::get_instance(); $this->global_prefs = $this->_load_prefs($rcmail->config->get('sauserprefs_global_userid')); $this->global_prefs = array_merge($rcmail->config->get('sauserprefs_default_prefs'), $this->global_prefs); } private function _load_user_prefs() { $this->user_prefs = $this->_load_prefs($this->sa_user); } private function _load_prefs($user) { $rcmail = rcube::get_instance(); $prefs = $this->storage->load_prefs($user); // sort address rules $prefs['addresses'] = $this->_subval_sort($prefs['addresses'], 'value'); return $prefs; } private function _prefs_block($part, $attrib) { $rcmail = rcube::get_instance(); $no_override = array_flip($rcmail->config->get('sauserprefs_dont_override')); $locale_info = localeconv(); switch ($part) { // General tests case 'general': $out = ''; $data = ''; $table = new html_table(array('class' => 'generalprefstable', 'cols' => 2)); if (!isset($no_override['required_hits'])) { $field_id = 'rcmfd_spamthres'; $input_spamthres = new html_select(array('name' => '_spamthres', 'id' => $field_id)); $input_spamthres->add($this->gettext('defaultscore'), ''); $decPlaces = 0; if ($rcmail->config->get('sauserprefs_score_inc') - (int)$rcmail->config->get('sauserprefs_score_inc') > 0) $decPlaces = strlen($rcmail->config->get('sauserprefs_score_inc') - (int)$rcmail->config->get('sauserprefs_score_inc')) - 2; $score_found = false; for ($i = 1; $i <= 10; $i = $i + $rcmail->config->get('sauserprefs_score_inc')) { $input_spamthres->add(number_format($i, $decPlaces, $locale_info['decimal_point'], ''), number_format($i, $decPlaces, '.', '')); if (!$score_found && $this->user_prefs['required_hits'] && (float)$this->user_prefs['required_hits'] == (float)$i) $score_found = true; } if (!$score_found && $this->user_prefs['required_hits']) $input_spamthres->add(str_replace('%s', $this->user_prefs['required_hits'], $this->gettext('otherscore')), (float)$this->user_prefs['required_hits']); $table->add('title', html::label($field_id, rcmail::Q($this->gettext('spamthres')))); $table->add(null, $input_spamthres->show(number_format($this->user_prefs['required_hits'], $decPlaces, '.', ''))); $table->add(array('colspan' => 2), rcmail::Q($this->gettext('spamthresexp'))); } if (!isset($no_override['rewrite_header Subject'])) { $field_id = 'rcmfd_spamsubject'; $input_spamsubject = new html_inputfield(array('name' => '_spamsubject', 'id' => $field_id, 'value' => $this->user_prefs['rewrite_header Subject'], 'style' => 'width:200px;')); $table->add('title', html::label($field_id, rcmail::Q($this->gettext('spamsubject')))); $table->add(null, $input_spamsubject->show()); $table->add('title', " "); $table->add(null, rcmail::Q($this->gettext('spamsubjectblank'))); } if ($table->size() > 0) $out .= html::tag('fieldset', null, html::tag('legend', null, rcmail::Q($this->gettext('mainoptions'))) . $table->show()); if (!isset($no_override['ok_languages']) || !isset($no_override['ok_locales'])) { $data = html::p(null, rcmail::Q($this->gettext('spamlangexp'))); $table = new html_table(array('class' => 'langprefstable', 'cols' => 1)); $select_all = $this->api->output->button(array('command' => 'plugin.sauserprefs.select_all_langs', 'type' => 'link', 'label' => 'all')); $select_none = $this->api->output->button(array('command' => 'plugin.sauserprefs.select_no_langs', 'type' => 'link', 'label' => 'none')); $select_invert = $this->api->output->button(array('command' => 'plugin.sauserprefs.select_invert_langs', 'type' => 'link', 'label' => 'invert')); $table->add(array('id' => 'listcontrols'), $this->gettext('select') .":  ". $select_all ."  ". $select_invert ."  ". $select_none); $lang_table = new html_table(array('id' => 'spam-langs-table', 'class' => 'records-table', 'cellspacing' => '0', 'cols' => 2)); $lang_table->add_header(array('colspan' => 2), $this->gettext('language')); if (!isset($no_override['ok_locales'])) { if ($this->user_prefs['ok_locales'] == "all") $ok_locales = $this->sa_locales; else $ok_locales = explode(" ", $this->user_prefs['ok_locales']); } else { $ok_locales = array(); } if (!isset($no_override['ok_languages'])) { if ($this->user_prefs['ok_languages'] == "all") $ok_languages = array_keys($rcmail->config->get('sauserprefs_languages')); else $ok_languages = explode(" ", $this->user_prefs['ok_languages']); } else { $tmp_array = $rcmail->config->get('sauserprefs_languages'); $rcmail->config->set('sauserprefs_languages', array_intersect_key($tmp_array, array_flip($this->sa_locales))); $ok_languages = array(); } $i = 0; $locales_langs = array_merge($ok_locales, $ok_languages); foreach ($rcmail->config->get('sauserprefs_languages') as $lang_code => $name) { if (in_array($lang_code, $locales_langs)) $button = $this->api->output->button(array('command' => 'plugin.sauserprefs.message_lang', 'prop' => $lang_code, 'type' => 'link', 'class' => 'enabled', 'id' => 'spam_lang_' . $i, 'title' => 'sauserprefs.enabled', 'content' => ' ')); else $button = $this->api->output->button(array('command' => 'plugin.sauserprefs.message_lang', 'prop' => $lang_code, 'type' => 'link', 'class' => 'disabled', 'id' => 'spam_lang_' . $i, 'title' => 'sauserprefs.disabled', 'content' => ' ')); $input_spamlang = new html_checkbox(array('style' => 'display: none;', 'name' => '_spamlang[]', 'value' => $lang_code)); $lang_table->add('lang', $name); $lang_table->add('tick', $button . $input_spamlang->show(in_array($lang_code, $locales_langs) ? $lang_code : '')); $i++; } $table->add('scroller', html::div(array('id' => 'spam-langs-cont'), $lang_table->show())); $out .= html::tag('fieldset', null, html::tag('legend', null, rcmail::Q($this->gettext('langoptions'))) . $data . $table->show()); } break; // Header settings case 'headers': $data = html::p(null, rcmail::Q($this->gettext('headersexp'))); $table = new html_table(array('class' => 'headersprefstable', 'cols' => 3)); if (!isset($no_override['fold_headers'])) { $help_button = html::img(array('class' => $imgclass, '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 .'.sauserprefs_help("fold_help");', 'title' => $this->gettext('help')), $help_button); $field_id = 'rcmfd_spamfoldheaders'; $input_spamreport = new html_checkbox(array('name' => '_spamfoldheaders', 'id' => $field_id, 'value' => '1')); $table->add('title', html::label($field_id, rcmail::Q($this->gettext('foldheaders')))); $table->add(null, $input_spamreport->show($this->user_prefs['fold_headers'])); $table->add('help', $help_button); $table->set_row_attribs(array('id' => 'fold_help', 'style' => 'display: none;')); $table->add(array('colspan' => '3'), rcmail::Q($this->gettext('foldhelp'))); } if (!isset($no_override['add_header all Level'])) { $help_button = html::img(array('class' => $imgclass, '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 .'.sauserprefs_help("level_help");', 'title' => $this->gettext('help')), $help_button); if ($this->user_prefs['remove_header all'] != 'Level') { $enabled = "1"; $char = $this->user_prefs['add_header all Level']; $char = substr($char, 7, 1); } else { $enabled = "0"; $char = "*"; } $field_id = 'rcmfd_spamlevelstars'; $input_spamreport = new html_checkbox(array('name' => '_spamlevelstars', 'id' => $field_id, 'value' => '1', 'onchange' => rcmail_output::JS_OBJECT_NAME . '.sauserprefs_toggle_level_char(this)')); $table->add('title', html::label($field_id, rcmail::Q($this->gettext('spamlevelstars')))); $table->add(null, $input_spamreport->show($enabled)); $table->add('help', $help_button); $table->set_row_attribs(array('id' => 'level_help', 'style' => 'display: none;')); $table->add(array('colspan' => '3'), rcmail::Q($this->gettext('levelhelp'))); $field_id = 'rcmfd_spamlevelchar'; $input_spamsubject = new html_inputfield(array('name' => '_spamlevelchar', 'id' => $field_id, 'value' => $char, 'style' => 'width:20px;', 'disabled' => $enabled?0:1)); $table->add('title', html::label($field_id, rcmail::Q($this->gettext('spamlevelchar')))); $table->add(null, $input_spamsubject->show()); $table->add('help', ' '); } $out = html::tag('fieldset', null, html::tag('legend', null, rcmail::Q($this->gettext('mainoptions'))) . $data . $table->show()); break; // Test settings case 'tests': $data = html::p(null, rcmail::Q($this->gettext('spamtestssexp'))); $table = new html_table(array('class' => 'testsprefstable', 'cols' => 3)); if (!isset($no_override['use_razor1'])) { $help_button = html::img(array('class' => $imgclass, '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 .'.sauserprefs_help("raz1_help");', 'title' => $this->gettext('help')), $help_button); $field_id = 'rcmfd_spamuserazor1'; $input_spamtest = new html_checkbox(array('name' => '_spamuserazor1', 'id' => $field_id, 'value' => '1')); $table->add('title', html::label($field_id, rcmail::Q($this->gettext('userazor1')))); $table->add(null, $input_spamtest->show($this->user_prefs['use_razor1'])); $table->add('help', $help_button); $table->set_row_attribs(array('id' => 'raz1_help', 'style' => 'display: none;')); $table->add(array('colspan' => '3'), rcmail::Q($this->gettext('raz1help'))); } if (!isset($no_override['use_razor2'])) { $help_button = html::img(array('class' => $imgclass, '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 .'.sauserprefs_help("raz2_help");', 'title' => $this->gettext('help')), $help_button); $field_id = 'rcmfd_spamuserazor2'; $input_spamtest = new html_checkbox(array('name' => '_spamuserazor2', 'id' => $field_id, 'value' => '1')); $table->add('title', html::label($field_id, rcmail::Q($this->gettext('userazor2')))); $table->add(null, $input_spamtest->show($this->user_prefs['use_razor2'])); $table->add('help', $help_button); $table->set_row_attribs(array('id' => 'raz2_help', 'style' => 'display: none;')); $table->add(array('colspan' => '3'), rcmail::Q($this->gettext('raz2help'))); } if (!isset($no_override['use_pyzor'])) { $help_button = html::img(array('class' => $imgclass, '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 .'.sauserprefs_help("pyz_help");', 'title' => $this->gettext('help')), $help_button); $field_id = 'rcmfd_spamusepyzor'; $input_spamtest = new html_checkbox(array('name' => '_spamusepyzor', 'id' => $field_id, 'value' => '1')); $table->add('title', html::label($field_id, rcmail::Q($this->gettext('usepyzor')))); $table->add(null, $input_spamtest->show($this->user_prefs['use_pyzor'])); $table->add('help', $help_button); $table->set_row_attribs(array('id' => 'pyz_help', 'style' => 'display: none;')); $table->add(array('colspan' => '3'), rcmail::Q($this->gettext('pyzhelp'))); } if (!isset($no_override['use_dcc'])) { $help_button = html::img(array('class' => $imgclass, '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 .'.sauserprefs_help("dcc_help");', 'title' => $this->gettext('help')), $help_button); $field_id = 'rcmfd_spamusedcc'; $input_spamtest = new html_checkbox(array('name' => '_spamusedcc', 'id' => $field_id, 'value' => '1')); $table->add('title', html::label($field_id, rcmail::Q($this->gettext('usedcc')))); $table->add(null, $input_spamtest->show($this->user_prefs['use_dcc'])); $table->add('help', $help_button); $table->set_row_attribs(array('id' => 'dcc_help', 'style' => 'display: none;')); $table->add(array('colspan' => '3'), rcmail::Q($this->gettext('dcchelp'))); } if (!isset($no_override['skip_rbl_checks'])) { $help_button = html::img(array('class' => $imgclass, '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 .'.sauserprefs_help("rbl_help");', 'title' => $this->gettext('help')), $help_button); $field_id = 'rcmfd_spamskiprblchecks'; $enabled = $this->user_prefs['skip_rbl_checks'] == "1" ? "0" : "1"; $input_spamtest = new html_checkbox(array('name' => '_spamskiprblchecks', 'id' => $field_id, 'value' => '1')); $table->add('title', html::label($field_id, rcmail::Q($this->gettext('skiprblchecks')))); $table->add(null, $input_spamtest->show($enabled)); $table->add('help', $help_button); $table->set_row_attribs(array('id' => 'rbl_help', 'style' => 'display: none;')); $table->add(array('colspan' => '3'), rcmail::Q($this->gettext('rblhelp'))); } $out = html::tag('fieldset', null, html::tag('legend', null, rcmail::Q($this->gettext('mainoptions'))) . $data . $table->show()); break; // Bayes settings case 'bayes': $data = html::p(null, rcmail::Q($this->gettext('bayeshelp'))); $table = new html_table(array('class' => 'bayesprefstable', 'cols' => 3)); if (!isset($no_override['use_bayes'])) { $help_button = html::img(array('class' => $imgclass, '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 .'.sauserprefs_help("bayes_help");', 'title' => $this->gettext('help')), $help_button); $field_id = 'rcmfd_spamusebayes'; $input_spamtest = new html_checkbox(array('name' => '_spamusebayes', 'id' => $field_id, 'value' => '1', 'onchange' => rcmail_output::JS_OBJECT_NAME . '.sauserprefs_toggle_bayes(this)')); if ($rcmail->config->get('sauserprefs_bayes_delete', false)) $delete_link = "   " . html::span(array('id' => 'listcontrols'), $this->api->output->button(array('command' => 'plugin.sauserprefs.purge_bayes', 'type' => 'link', 'label' => 'sauserprefs.purgebayes', 'title' => 'sauserprefs.purgebayesexp'))); $table->add('title', html::label($field_id, rcmail::Q($this->gettext('usebayes')))); $table->add(null, $input_spamtest->show($this->user_prefs['use_bayes']) . $delete_link); $table->add('help', ' '); $table->set_row_attribs(array('id' => 'bayes_help', 'style' => 'display: none;')); $table->add(array('colspan' => '3'), rcmail::Q($this->gettext('bayeshelp'))); } if (!isset($no_override['use_bayes_rules'])) { $help_button = html::img(array('class' => $imgclass, '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 .'.sauserprefs_help("bayesrules_help");', 'title' => $this->gettext('help')), $help_button); $field_id = 'rcmfd_spambayesrules'; $input_spamtest = new html_checkbox(array('name' => '_spambayesrules', 'id' => $field_id, 'value' => '1', 'disabled' => $this->user_prefs['use_bayes']?0:1)); $table->add('title', html::label($field_id, rcmail::Q($this->gettext('bayesrules')))); $table->add(null, $input_spamtest->show($this->user_prefs['use_bayes_rules'])); $table->add('help', $help_button); $table->set_row_attribs(array('id' => 'bayesrules_help', 'style' => 'display: none;')); $table->add(array('colspan' => '3'), rcmail::Q($this->gettext('bayesruleshlp'))); } if (!isset($no_override['bayes_auto_learn'])) { $help_button = html::img(array('class' => $imgclass, '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 .'.sauserprefs_help("bayesauto_help");', 'title' => $this->gettext('help')), $help_button); $field_id = 'rcmfd_spambayesautolearn'; $input_spamtest = new html_checkbox(array('name' => '_spambayesautolearn', 'id' => $field_id, 'value' => '1', 'onchange' => rcmail_output::JS_OBJECT_NAME . '.sauserprefs_toggle_bayes_auto(this)', 'disabled' => $this->user_prefs['use_bayes']?0:1)); $table->add('title', html::label($field_id, rcmail::Q($this->gettext('bayesautolearn')))); $table->add(null, $input_spamtest->show($this->user_prefs['bayes_auto_learn'])); $table->add('help', $help_button); $table->set_row_attribs(array('id' => 'bayesauto_help', 'style' => 'display: none;')); $table->add(array('colspan' => '3'), rcmail::Q($this->gettext('bayesautohelp'))); } if ($table->size() > 0) $out = html::tag('fieldset', null, html::tag('legend', null, rcmail::Q($this->gettext('mainoptions'))) . $table->show()); $table = new html_table(array('class' => 'bayesprefstable', 'cols' => 2)); $data = ""; if (!isset($no_override['bayes_auto_learn_threshold_nonspam'])) { $field_id = 'rcmfd_bayesnonspam'; $input_bayesnthres = new html_select(array('name' => '_bayesnonspam', 'id' => $field_id, 'disabled' => (!$this->user_prefs['bayes_auto_learn'] || !$this->user_prefs['use_bayes'])?1:0)); $input_bayesnthres->add($this->gettext('defaultscore'), ''); $decPlaces = 1; //if ($rcmail->config->get('sauserprefs_score_inc') - (int)$rcmail->config->get('sauserprefs_score_inc') > 0) // $decPlaces = strlen($rcmail->config->get('sauserprefs_score_inc') - (int)$rcmail->config->get('sauserprefs_score_inc')) - 2; $score_found = false; for ($i = -1; $i <= 1; $i = $i + 0.1) { $input_bayesnthres->add(number_format($i, $decPlaces, $locale_info['decimal_point'], ''), number_format($i, $decPlaces, '.', '')); if (!$score_found && $this->user_prefs['bayes_auto_learn_threshold_nonspam'] && (float)$this->user_prefs['bayes_auto_learn_threshold_nonspam'] == (float)$i) $score_found = true; } if (!$score_found && $this->user_prefs['bayes_auto_learn_threshold_nonspam']) $input_bayesnthres->add(str_replace('%s', $this->user_prefs['bayes_auto_learn_threshold_nonspam'], $this->gettext('otherscore')), (float)$this->user_prefs['bayes_auto_learn_threshold_nonspam']); $table->add('title', html::label($field_id, rcmail::Q($this->gettext('bayesnonspam')))); $table->add(null, $input_bayesnthres->show(number_format($this->user_prefs['bayes_auto_learn_threshold_nonspam'], $decPlaces, '.', ''))); $table->add(array('colspan' => '2'), rcmail::Q($this->gettext('bayesnonspamexp'))); } if (!isset($no_override['bayes_auto_learn_threshold_spam'])) { $field_id = 'rcmfd_bayesspam'; $input_bayesthres = new html_select(array('name' => '_bayesspam', 'id' => $field_id, 'disabled' => (!$this->user_prefs['bayes_auto_learn'] || !$this->user_prefs['use_bayes'])?1:0)); $input_bayesthres->add($this->gettext('defaultscore'), ''); $decPlaces = 0; if ($rcmail->config->get('sauserprefs_score_inc') - (int)$rcmail->config->get('sauserprefs_score_inc') > 0) $decPlaces = strlen($rcmail->config->get('sauserprefs_score_inc') - (int)$rcmail->config->get('sauserprefs_score_inc')) - 2; $score_found = false; for ($i = 1; $i <= 20; $i = $i + $rcmail->config->get('sauserprefs_score_inc')) { $input_bayesthres->add(number_format($i, $decPlaces, $locale_info['decimal_point'], ''), number_format($i, $decPlaces, '.', '')); if (!$score_found && $this->user_prefs['bayes_auto_learn_threshold_spam'] && (float)$this->user_prefs['bayes_auto_learn_threshold_spam'] == (float)$i) $score_found = true; } if (!$score_found && $this->user_prefs['required_hits']) $input_bayesthres->add(str_replace('%s', $this->user_prefs['bayes_auto_learn_threshold_spam'], $this->gettext('otherscore')), (float)$this->user_prefs['bayes_auto_learn_threshold_spam']); $table->add('title', html::label($field_id, rcmail::Q($this->gettext('bayesspam')))); $table->add(null, $input_bayesthres->show(number_format($this->user_prefs['bayes_auto_learn_threshold_spam'], $decPlaces, '.', ''))); $table->add(array('colspan' => '2'), rcmail::Q($this->gettext('bayesspamexp'))); } if ($table->size() > 0) $out .= html::tag('fieldset', null, html::tag('legend', null, rcmail::Q($this->gettext('bayesautooptions'))) . $table->show()); break; // Report settings case 'report': $data = html::p(null, rcmail::Q($this->gettext('spamreport'))); $table = new html_table(array('class' => 'reportprefstable', 'cols' => 2)); if (!isset($no_override['report_safe'])) { $field_id = 'rcmfd_spamreport'; $input_spamreport0 = new html_radiobutton(array('name' => '_spamreport', 'id' => $field_id.'_0', 'value' => '0')); $table->add('title', html::label($field_id.'_0', rcmail::Q($this->gettext('spamreport0')))); $table->add(null, $input_spamreport0->show($this->user_prefs['report_safe'])); $input_spamreport1 = new html_radiobutton(array('name' => '_spamreport', 'id' => $field_id.'_1', 'value' => '1')); $table->add('title', html::label($field_id.'_1', rcmail::Q($this->gettext('spamreport1')))); $table->add(null, $input_spamreport1->show($this->user_prefs['report_safe'])); $data .= $input_spamreport1->show($this->user_prefs['report_safe']) ." ". html::label($field_id .'_1', rcmail::Q($this->gettext('spamreport1'))) . "
"; $input_spamreport2 = new html_radiobutton(array('name' => '_spamreport', 'id' => $field_id.'_2', 'value' => '2')); $table->add('title', html::label($field_id.'_2', rcmail::Q($this->gettext('spamreport2')))); $table->add(null, $input_spamreport2->show($this->user_prefs['report_safe'])); } $out = html::tag('fieldset', null, html::tag('legend', null, rcmail::Q($this->gettext('mainoptions'))) . $table->show()); break; // Address settings case 'addresses': $data = html::p(null, rcmail::Q($this->gettext('whitelistexp'))); if ($rcmail->config->get('sauserprefs_whitelist_sync')) $data .= rcmail::Q($this->gettext('autowhitelist')) . "

"; $table = new html_table(array('class' => 'addressprefstable', 'cols' => 4)); $field_id = 'rcmfd_spamaddressrule'; $input_spamaddressrule = new html_select(array('name' => '_spamaddressrule', 'id' => $field_id)); $input_spamaddressrule->add($this->gettext('whitelist_from'),'whitelist_from'); $input_spamaddressrule->add($this->gettext('blacklist_from'), 'blacklist_from'); $input_spamaddressrule->add($this->gettext('whitelist_to'), 'whitelist_to'); $field_id = 'rcmfd_spamaddress'; $input_spamaddress = new html_inputfield(array('name' => '_spamaddress', 'id' => $field_id, 'style' => 'width:200px;')); $field_id = 'rcmbtn_add_address'; $button_addaddress = $this->api->output->button(array('command' => 'plugin.sauserprefs.addressrule_add', 'type' => 'input', 'class' => 'button', 'label' => 'sauserprefs.addrule')); $table->add('ruletype', $input_spamaddressrule->show()); $table->add('address', $input_spamaddress->show()); $table->add('action', $button_addaddress); $table->add(null, " "); $import = $this->api->output->button(array('command' => 'plugin.sauserprefs.import_whitelist', 'type' => 'link', 'label' => 'import', 'title' => 'sauserprefs.importfromaddressbook')); $delete_all = $this->api->output->button(array('command' => 'plugin.sauserprefs.whitelist_delete_all', 'type' => 'link', 'label' => 'sauserprefs.deleteall')); $table->add(array('colspan' => 4, 'id' => 'listcontrols'), $import ."  ". $delete_all); $address_table = new html_table(array('id' => 'address-rules-table', 'class' => 'records-table', 'cellspacing' => '0', 'cols' => 3)); $address_table->add_header('rule', $this->gettext('rule')); $address_table->add_header('email', $this->gettext('email')); $address_table->add_header('control', ' '); $this->_address_row($address_table, null, null, $attrib); if (sizeof($this->user_prefs['addresses']) > 0) $norules = 'display: none;'; $address_table->set_row_attribs(array('style' => $norules)); $address_table->add(array('colspan' => '3'), rcube_utils::rep_specialchars_output($this->gettext('noaddressrules'))); $this->api->output->set_env('address_rule_count', sizeof($this->user_prefs['addresses'])); foreach ($this->user_prefs['addresses'] as $address) $this->_address_row($address_table, $address['field'], $address['value'], $attrib); $table->add(array('colspan' => 4, 'class' => 'scroller'), html::div(array('id' => 'address-rules-cont'), $address_table->show())); if ($table->size()) $out = html::tag('fieldset', null, html::tag('legend', null, rcmail::Q($this->gettext('mainoptions'))) . $data . $table->show()); break; default: $out = ''; } return $out; } private function _address_row($address_table, $field, $value, $attrib) { if (!isset($field)) $address_table->set_row_attribs(array('style' => 'display: none;')); $hidden_action = new html_hiddenfield(array('name' => '_address_rule_act[]', 'value' => '')); $hidden_field = new html_hiddenfield(array('name' => '_address_rule_field[]', 'value' => $field)); $hidden_text = new html_hiddenfield(array('name' => '_address_rule_value[]', 'value' => $value)); switch ($field) { case "whitelist_from": $fieldtxt = rcube_utils::rep_specialchars_output($this->gettext('whitelist_from')); break; case "blacklist_from": $fieldtxt = rcube_utils::rep_specialchars_output($this->gettext('blacklist_from')); break; case "whitelist_to": $fieldtxt = rcube_utils::rep_specialchars_output($this->gettext('whitelist_to')); break; } $address_table->add(array('class' => $field), $fieldtxt); $address_table->add(array('class' => 'email'), $value); $del_button = $this->api->output->button(array('command' => 'plugin.sauserprefs.addressrule_del', 'type' => 'link', 'class' => 'delete', 'label' => 'delete', 'content' => ' ')); $address_table->add('control', $del_button . $hidden_action->show() . $hidden_field->show() . $hidden_text->show()); return $address_table; } static function map_pref_name($pref, $reverse = false) { if (!$reverse) { if (array_key_exists($pref, self::$deprecated_prefs)) $pref = self::$deprecated_prefs[$pref]; } else { if (($orig_pref = array_search($pref, self::$deprecated_prefs)) != FALSE) $pref = $orig_pref; } return $pref; } private function _subval_sort($a, $subkey) { if (sizeof($a) == 0) return array(); foreach ($a as $k => $v) $b[$k] = strtolower($v[$subkey]); asort($b); foreach ($b as $k => $v) $c[] = $a[$k]; return $c; } private function _gen_email_arr($contact) { $emails = array(); if (!is_array($contact)) return $emails; foreach ($contact as $key => $value) { if (preg_match('/^email(:(.+))?$/i', $key, $matches)) { foreach ((array)$value as $subkey => $subval) { if ($matches[2]) $emails[$matches[2] . $subkey] = $subval; else $emails['email' . $subkey] = $subval; } } } return $emails; } } ?>Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/skins/000077500000000000000000000000001211467526500230735ustar00rootroot00000000000000Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/skins/classic/000077500000000000000000000000001211467526500245145ustar00rootroot00000000000000Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/skins/classic/help.gif000066400000000000000000000020001211467526500261230ustar00rootroot00000000000000GIF89af_bjqqrͺxlǮczfkŶcm״i暻bʼn镮̡Cq߻ڜm膬{ҁѹ䞻ߜeXqdckiÿklmg{ꑴ֣~՛쉮^~egHvڜhwڿQ|kuLyEsXqab!,@C H8Hb/LAy!".&I4Њ&DЙ3G: yPDp%P1Ϧ+f#  d0tQ#l2( K!881` bC䎦8g H@  $'.g-$$GGSq˗UJdP&@!5@@Xz7j(f"d ;Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/skins/classic/icons.gif000066400000000000000000000025011211467526500263140ustar00rootroot00000000000000GIF89a6;;UUVͥCCD͢VV@@d[jjyyy<6v^UFFxKKKcc:}4h^YYZRvl$$j`,,lb|ρvv砠ʞə>8GGzmc{{[[mmmooq??^_`///صccc`Wʚ~wwy\\溺~~[[԰cYܭ00YY__ɂ\S\SWOttYY묮BBiiiaXQQttuMMRRJJ⾍ll@9т|҄ػbbֹmmٱ66ѹ99{{ssG@DDEEZQVV\T֝999Ғ,,>>Ӣgg˘~ٰFFymʭYYzڷԭaaѠѧǘظ@@ֲ۵ZZAA~t{{|}}}ٿQI::ș[[//ğݥɜDD}88QQʡXX[[ݑWWXyVV”qqrsstǗ!,6 H rAvSzɠr0<SZp-l XU&L6lWr P`)7q0Xj#KpXAq@@xh`fۂ@ _<UrFL>  <Ȝ0` 6^䵻U }W $Ũx #H;PȎ`o=0D a"_' ,F!mv]P0Xh -b*_μ\`HRerp,h( iѥKR+@e#M,P40=L@%ð@СABD3TP "7 h` !d\G͙C 2Gyn9(Yoc ^p o__ϟ3|aI5/]>}ʔ w`(6K"wsI1 ]{ՀMJD]RU<dm,(A5ٙKXP띛o>˄7U`L DÏ'Oeɽ+ v-#?_zׯ/(]۷ 2D5 55Ou09"-0K 9IKKyO'564te|2ëW/ ]@V"  Z paTo\<Nݻ _>ftQ"11118szŋ稊| ?dy?JKK}!,,Ȑ?Q"ȖbA fįr(O'UwI^DI' dDS=㼋W2ܼ~̝qn;ܽ%o`u.牖s?^__Cǟ 7oa}究?0ҸGA~7ső%Q.;2DGTn!>K06f>.)i L2?~se&N?G/_2x191i+() }㳺AvܢyQ+WM>}_ӷo_{떍Ư_D&K 'J`8%mll@1! @D)v>郖")x2*1ĤMB_7&&ŋ4JQj,.viw[g9F4~{l?37?ڴ <)yGrlefp:PUUT=2 1c088HK w_ZKՖ5kk)3!GHM6!V(++Hi4z`4BD;I7tZPB̢Wə$s4Q2>,eA+B `s-gy~@+E.j2;6QTY/M8.TݜIRUȌ1L{p?I (5D161(uƆBRBA^: y[AW VO&/T塡U!#e;ϯz[hT;9H&oHNqoIENDB`Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/skins/classic/ie6hacks.css000066400000000000000000000002301211467526500267160ustar00rootroot00000000000000/** * SAUserPrefs plugin styles (IE6 hacks) */ #spam-langs-table td.tick a, #address-rules-table td.control a { background-image: url(icons.gif); }Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/skins/classic/iehacks.css000066400000000000000000000001711211467526500266340ustar00rootroot00000000000000/** * SAUserPrefs plugin styles (IE hacks) */ #address-rules-table, #spam-langs-table { width: expression('auto'); }Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/skins/classic/safari.css000066400000000000000000000003721211467526500264750ustar00rootroot00000000000000/** * SAUserPrefs plugin styles (safari hacks) */ html>body*#address-rules-table[id$="address-rules-table"]:not([class="none"]) { table-layout: auto; } html>body*#spam-langs-table[id$="spam-langs-table"]:not([class="none"]) { table-layout: auto; }Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/skins/classic/sauserprefs.css000066400000000000000000000050561211467526500275760ustar00rootroot00000000000000/** * SAUserPrefs plugin styles */ #address-rules-cont, #spam-langs-cont { border: 1px solid #999999; background-color: #F9F9F9; height: 200px; overflow: auto; width: 510px; } body.address-rules-table, body.spam-langs-table { margin: 0px; background-color: #F9F9F9; } #address-rules-table, #spam-langs-table { width: 100%; display: table; table-layout: fixed; } #address-rules-table thead td.rule { width: 180px; } #address-rules-table thead td.control { width: 40px; } #spam-langs-table td.lang, #address-rules-table td.rule, #address-rules-table td.email, #address-rules-table td.email { text-align: left; vertical-align: middle; } #spam-langs-table td.tick, #address-rules-table td.control { text-align: right; vertical-align: middle; } #spam-langs-table td.tick a, #address-rules-table td.control a { display: block; float: right; width: 16px; height: 16px; background-image: url(icons.png); } #address-rules-table td.control a.delete { background-position: 0 0; } #spam-langs-table td.tick a.enabled { background-position: 0 -18px; } #spam-langs-table td.tick a.disabled { background-position: 0 -36px; } .whitelist_from, .whitelist_to { color: #008800; text-align: left; vertical-align: middle; } .blacklist_from { color: #BB0000; text-align: left; vertical-align: middle; } #listcontrols { font-size: 11px; text-align: right; } #listcontrols a, #listcontrols a:active, #listcontrols a:visited { color: #CC0000; font-size: 11px; text-decoration: none; } #listcontrols a:hover { text-decoration: underline; } table.generalprefstable, table.headersprefstable, table.testsprefstable, table.bayesprefstable, table.reportprefstable { width: 100%; } table.generalprefstable td.title { width: 115px; } table.headersprefstable td.title { width: 220px; } table.testsprefstable td.title { width: 175px; } table.bayesprefstable td.title { width: 220px; } table.reportprefstable td.title { width: 320px; } table.generalprefstable td.help, table.langprefstable td.help, table.headersprefstable td.help, table.testsprefstable td.help, table.bayesprefstable td.help, table.reportprefstable td.help, table.addressprefstable td.help { text-align: right; } table.addressprefstable td.ruletype { width: 180px; padding-bottom: 10px; } table.addressprefstable td.address { width: 220px; padding-bottom: 10px; } table.addressprefstable td.action { width: 100px; text-align: right; padding-bottom: 10px; } table.langprefstable td.scroller, table.addressprefstable td.scroller { padding: 0; }Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/skins/classic/tabstyles.css000066400000000000000000000000621211467526500272360ustar00rootroot00000000000000/** * SAUserPrefs plugin styles (tab styles) */ Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/skins/classic/templates/000077500000000000000000000000001211467526500265125ustar00rootroot00000000000000Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/skins/classic/templates/sauserprefs.html000066400000000000000000000037031211467526500317450ustar00rootroot00000000000000 <roundcube:object name="pagetitle" />
Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/skins/classic/templates/settingsedit.html000066400000000000000000000025071211467526500321120ustar00rootroot00000000000000 <roundcube:object name="pagetitle" />

 

Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/skins/larry/000077500000000000000000000000001211467526500242245ustar00rootroot00000000000000Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/skins/larry/help.png000066400000000000000000000007331211467526500256650ustar00rootroot00000000000000PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<}IDATxb?%]\N(D02226 &L`;33s.PHϟ?kiiǿiȆ}q!d)_r͛7"""`LȪ~r  >ngϞl.|'B\\\ AWbHRH]] |||>}Ā@bÁp_tˁ JJJ666$ē@3Dֲ(bc6(~ ^ @jV2-+Te %LhTDVe4L@94BAFFQ IENDB`Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/skins/larry/icons.png000066400000000000000000000017021211467526500260450ustar00rootroot00000000000000PNG  IHDR6wtEXtSoftwareAdobe ImageReadyqe<dIDATxOhAguJLK&ZJE/W6 T'Aci"&BzDBj(Ĕ540)l>vv߼yͦ677ٟ\]L&Ex2 "reYCRiƦ @|mt]?B F64loii}Xrb'x1 <+++zR9Rskioo{ ` D nV-fgzcb8LlNBw~+Gd9" B]H_w|$ 5k'q{=j`l8)AwG =PVAv7I@ٖ#8l# j]!>`č.#JBiߣ}B釠b>L@p|}Dϑ8wSS|LN>G"Zϝ BVհuI dϟВ84 ҨUJ1ⶦVNz:j*ASɰ\+fʉTnנ7bbj_̿ӐW1%}%M `IENDB`Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/skins/larry/iehacks.css000066400000000000000000000001711211467526500263440ustar00rootroot00000000000000/** * SAUserPrefs plugin styles (IE hacks) */ #address-rules-table, #spam-langs-table { width: expression('auto'); }Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/skins/larry/listicons.png000066400000000000000000000114331211467526500267430ustar00rootroot00000000000000PNG  IHDR04j%tEXtSoftwareAdobe ImageReadyqe<IDATx] \G֯AaP ԈArEZPcBf1٘(QՍ&$QP#` " B@E9EfzfX_Tuռ׫]-h4+'3@<\<.HRT 3G+gNJ5|RmيVs@buqVEdc|^z`W/Z7yW$Tl]'bt^z`ٮCh:':wVD5c۪ *prRRY9hnIWfፐzuXZH!& UY-gmɭ,(d08-oegq6SI6y[U&+nIo]8~1{=| Ƽmxvx~_ǰ6y!WewAz{>d_lo-oQ|awS}Xu [ɛ )j M@jn rE-ˠprz/2M"PRjN^pfNer<m/e&oihwSiR*ݜw4 )Yc) `&Y])|`FaS{hO"Fdܐ5wz]0ٿd0MփQ5yB~^~1p?^|C8xMNɛ z ;iJn'ޭ'+v&0>N4J/gG4V& 濱qyz9`6wW|v:?v(oTB 6w5n6y h@ie'F%NPV~Ė0 tZygF{QBڹ{\/g"6 #_v,ﳜv,f07+ߕjy?bn.ՄrKىSt熸G`o_s8+x"E odٔp~>>u@Nb eKӴDk:)(-[2} Ye!@{P,kēHF^Y;ѳ&`9m`UWh;Pot21(bئ!{{]Oyy\3ۛ#^J2[RQSK.diA)e628s:sSi*knu>ٿUH ) bKx^ g0D-ѿ80\AU&ڄ\񮧳$ћ8d#4NCYr2Ƚyq+t=;8lD`iuy{OVVWoOjO]a%N䗭;E֊ƚ0jK1MByM]C`Sl1~%277+zg嗋n< qUmJ#,w/5F7ŭ3RPUJ$u(3ABN,+Pq.jUT\/, C.P(2]0gֲ&{[Vg)Z-i@ iى[B;7DӨcBt쎃h J/*EmB:5XcY!JX[H ,di!p85DP~I% { zy}[ɚqiC!}AYLJl\4o~L \LF/Y]iWm뫒2t|Ër%D 1Dy8;nQ^jj ֹ *#)󽘧O=cr>6h3&vK`l& ϛW \wtAf^j5iO *+6[;>/Re<]CP`Igh_" C8/7!%1"@PKz+]i~Cˊ0rTpuSsxm͚;r ?R}`& {,#u7}1BЁc?ռkTRY5m#YI& )vw &ܒRW3ne0vȈړY׊S.]=nWע+k![Z]3$9+gkBjlwS*>\]w'RccV. O'1 N\B"F/AQa>^)߂5U'nvrzN2^JC qS$yLVoNˆz ArYj 7%-xЀWmE2!A09+>7o"DL:L&e?r:2pjOqy#}>E@#inCSS0Q}^xrP#ͦx>97\x,d[^}>$Gfe#Ĵ²r.\yIJV<#/112ptMrP;MP@P]||I:ZzEJ)VٮNCZgnt#Gt˜P7美 qԊ_ T)k d)A@+C6 ^UosCE=Б"\gYsϴj/>3nXI\f.*ipP) azd_^Fr?ז(9zD}Z2=vĺxQd[puR( e7WN{W<I#3!s &_{[<ښdCpgF&^xdjRsy#\ cnFgwFU؂ ,w 24z&8- ,^e?"Nads£;G _H*pBәv/Ry\ ,pM4( e ]HTߕ9UtsEe%DJf%|e%C8X a2+ʋF8Y d%T(W1 VV(+AY JPV( ( (K`g,KIENDB`Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/skins/larry/safari.css000066400000000000000000000003721211467526500262050ustar00rootroot00000000000000/** * SAUserPrefs plugin styles (safari hacks) */ html>body*#address-rules-table[id$="address-rules-table"]:not([class="none"]) { table-layout: auto; } html>body*#spam-langs-table[id$="spam-langs-table"]:not([class="none"]) { table-layout: auto; }Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/skins/larry/sauserprefs.css000066400000000000000000000100731211467526500273010ustar00rootroot00000000000000/** * SAUserPrefs plugin styles */ #address-rules-cont, #spam-langs-cont { height: 200px; overflow: auto; width: 100%; } body.address-rules-table, body.spam-langs-table { margin: 0px; } #address-rules-table, #spam-langs-table { width: 100%; display: table; table-layout: fixed; border: 0; } #address-rules-table thead td, #spam-langs-table thead td { background-color: #CCC; font-weight: bold; color: #000; } #address-rules-table thead td.rule { width: 180px; } #address-rules-table thead td.control { width: 40px; } #spam-langs-table td.lang, #address-rules-table td.rule, #address-rules-table td.email, #address-rules-table td.email { text-align: left; vertical-align: middle; border-left: 0; border-right: 0; } #spam-langs-table td.tick, #address-rules-table td.control { text-align: right; vertical-align: middle; border-left: 0; border-right: 0; } #spam-langs-table td.tick a, #address-rules-table td.control a { display: block; float: right; width: 16px; height: 16px; background-image: url(icons.png); cursor: pointer; } #address-rules-table td.control a.delete { background-position: 0 -1px; } #spam-langs-table td.tick a.enabled { background-position: 0 -18px; } #spam-langs-table td.tick a.disabled { background-position: 0 -36px; } .whitelist_from, .whitelist_to { color: #008800; text-align: left; vertical-align: middle; } .blacklist_from { color: #BB0000; text-align: left; vertical-align: middle; } #listcontrols { font-size: 11px; text-align: right; } #listcontrols a, #listcontrols a:active, #listcontrols a:visited { color: #2D5986; font-size: 11px; text-decoration: none; } #listcontrols a:hover { text-decoration: underline; } table.generalprefstable, table.langprefstable, table.headersprefstable, table.testsprefstable, table.bayesprefstable, table.reportprefstable, table.addressprefstable { width: 100%; border-spacing: 0; border-collapse: collapse; } table.generalprefstable td, table.langprefstable td, table.headersprefstable td, table.testsprefstable td, table.bayesprefstable td, table.reportprefstable td, table.addressprefstable td { width: 80%; padding: 4px 10px; background: #eee; border-bottom: 2px solid #fff; } table.addressprefstable td { width: auto; } table.generalprefstable td.title, table.langprefstable td.title, table.headersprefstable td.title, table.testsprefstable td.title, table.bayesprefstable td.title, table.reportprefstable td.title, table.addressprefstable td.title { width: 20%; color: #333; padding-right: 20px; white-space: nowrap; } table.addressprefstable td.ruletype { width: 180px; } table.addressprefstable td.address { width: 220px; } table.addressprefstable td.action { width: 100px; text-align: right; } table.langprefstable td.scroller, table.addressprefstable td.scroller { padding: 0; } #sections-table #rcmrowtests td.section { background-image: url(listicons.png); background-position: 5px -199px; } #sections-table #rcmrowtests.selected td.section { background-image: url(listicons.png); background-position: 5px -225px; } #sections-table #rcmrowbayes td.section { background-image: url(listicons.png); background-position: 5px -248px; } #sections-table #rcmrowbayes.selected td.section { background-image: url(listicons.png); background-position: 5px -270px; } #sections-table #rcmrowheaders td.section { background-image: url(listicons.png); background-position: 5px -99px; } #sections-table #rcmrowheaders.selected td.section { background-image: url(listicons.png); background-position: 5px -124px; } #sections-table #rcmrowreport td.section { background-image: url(listicons.png); background-position: 5px -150px; } #sections-table #rcmrowreport.selected td.section { background-image: url(listicons.png); background-position: 5px -174px; } #sections-table #rcmrowaddresses td.section { background-image: url(listicons.png); background-position: 4px -50px; } #sections-table #rcmrowaddresses.selected td.section { background-image: url(listicons.png); background-position: 4px -74px; }Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/skins/larry/tabstyles.css000066400000000000000000000004751211467526500267560ustar00rootroot00000000000000/** * SAUserPrefs plugin styles (tab styles) */ #settings-sections #settingstabpluginsauserprefs a { background-image: url(listicons.png); background-position: 3px -3px; } #settings-sections #settingstabpluginsauserprefs.selected a { background-image: url(listicons.png); background-position: 3px -27px; }Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/skins/larry/templates/000077500000000000000000000000001211467526500262225ustar00rootroot00000000000000Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/skins/larry/templates/sauserprefs.html000066400000000000000000000027271211467526500314620ustar00rootroot00000000000000 <roundcube:object name="pagetitle" />
Roundcube-Plugin-SpamAssassin-User-Prefs-SQL-0.9.0/skins/larry/templates/settingsedit.html000066400000000000000000000021231211467526500316140ustar00rootroot00000000000000 <roundcube:object name="pagetitle" />