pax_global_header00006660000000000000000000000064132635775620014532gustar00rootroot0000000000000052 comment=cd554ed3e83678c74df774a590575e38464bf318 roundcube-markasjunk2-1.11.2/000077500000000000000000000000001326357756200160305ustar00rootroot00000000000000roundcube-markasjunk2-1.11.2/.gitignore000066400000000000000000000000171326357756200200160ustar00rootroot00000000000000config.inc.php roundcube-markasjunk2-1.11.2/CHANGELOG000066400000000000000000000076451326357756200172560ustar00rootroot00000000000000Roundcube Webmail MarkAsJunk2 ============================= Version 1.11.2 (2018-04-12, rc-1.3.6) ================================================= * Fix check_request() bypass in places using get_uids() [CVE-2018-9846] (req RC e3dd5b6) Version 1.11.1 (2017-07-29, rc-1.3) ================================================= * Fix icon display on message view screen Version 1.11 (2017-06-14, rc-1.3) ================================================= * "Flattened" the larry theme: fresher look by removing shadows and gradients Version 1.10 (2017-01-02, rc-1.1) ================================================= * Add JS event markasjunk2-update to allow other plugins to influence the spam/ham options show * Add init method to allow drivers to access markasjunk2-update JS event * Replace config options markasjunk2_mb_toolbar and markasjunk2_cp_toolbar with new markasjunk2_toolbar option Version 1.9 (2015-01-06, rc-1.1) ================================================= * Use get_part_body add in 48ba4414b3 * Support multi-folder search results (66536974fe) * Drop IE6 support Version 1.8.2 (2014-03-30, rc-1.0) ================================================= * Add amavis_blacklist driver (by Der-Jan) Version 1.8.1 (2014-01-01, rc-1.0) ================================================= * Improve sa_detach driver, make sure only original message is detached * Correct skin folder structure for Roundcube packaging Version 1.8 (2013-12-01, rc-1.0) ================================================= * Use sauserprefs_userid config setting in sa_blacklist driver * Use plugin API to set message flags (05da157) * Update config file var names to match core * Add support for global sql_debug option * Improve handling of multiple marcos in cmd_learn driver Version 1.7 (2013-05-19, rc-1.0) ================================================= * add option to call markasjunk2 functions on message move * rcmail_deliver_message() > deliver_message() **** code branching/tagging no longer sync'd to roundcube versions **** Version 1.6 (2013-03-03, rc-0.9) ================================================= * merge PDO branch (de56ea1909) * rename default skin to classic (c40419bdfe) * add new edit_headers driver * rcube_ui > rcube_utils (r6091) * Update for Roundcube framework Version 1.5 (2012-06-19, rc-0.8) ================================================= * Fixed drivers namespace issues Version 1.4 (2012-01-21, rc-0.8) ================================================= * Improve spam/ham box configs Version 1.3 (2012-01-21, rc-0.8) ================================================= * Update after r5781 * Add inital support for Larry * Remove the need to always move the message * Remove the requirement to have a spam mailbox set * Allow both buttons to be shown at once * Execute driver before standard actions so standard actions can be overridden * Move SA detach code to driver Version 1.2 (2010-07-02, rc-0.5) ================================================= * Imporve email_learn driver when not sending as attachemnt * Use better command names * Username parsing now in core (r3774) * Respect display_next setting * Fix mark as ham in message view * Fix ham detachment, broken after c585116e7759c94d19fe6713af72cb5b45f7fde2, also see RC ticket #1486584 * Update to r3393 * Better toolbar icons * Update after r3261 * Another update after r3258 * Update after r3258 Version 1.1 (2010-02-07, rc-0.4) ================================================= * Move toolbar config to config file * CSS update after r3141 * Use explode() rather than split() * Create driver based system for different learning methods * Rename plugin to markasjunk2 Version 1.0 (2009-10-31, rc-0.3) ================================================= * Use local_skin_path() (rev 3076) * Added ability to mark ham as unread * Added ability to flag/unflag spam/ham * Added ability to trigger sa-learn * Added config file to control new optionsroundcube-markasjunk2-1.11.2/README.md000066400000000000000000000117331326357756200173140ustar00rootroot00000000000000Roundcube Webmail MarkAsJunk2 ============================= This plugin adds "mark as spam" or "mark as not spam" button to the message menu. Inspiration for this plugin was taken from: [Thomas Bruederli][thomas] - original [Roundcube Mark As Junk plugin][rcmaj] When not in the Junk mailbox: Messages are moved into the Junk mailbox and marked as read When in the Junk mailbox: The buttons are changed to "mark as not spam" or "this message is not spam" and the message is moved to the Inbox 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 markasjunk2 to $config['plugins'] in your Roundcube config **NB:** When downloading the plugin from GitHub you will need to create a directory called markasjunk2 and place the files in there, ignoring the root directory in the downloaded archive. Config ------ The default config file is plugins/markasjunk2/config.inc.php.dist Rename this to plugins/markasjunk2/config.inc.php All config parameters are optional The Learning Driver ------------------- The learning driver allows you to perform additional processing on each message marked as spam/ham. A driver must contain a class named markasjunk2_{driver file name}. The class must contain 3 functions: **spam:** This function should take 2 arguments: an array of UIDs of message(s) being marked as spam, the name of the mailbox containing those messages **ham:** This function should take 2 arguments: an array of UIDs of message(s) being marked as ham, the name of the mailbox containing those messages **init:** Optional, this function should take 0 arguments. eg: allows drivers to add JS to the page to control which of the spam/ham options are displayed An [example driver][jsevents] is available to show how to use the JS events Several drivers are provided by default they are: **cmd_learn:** This driver calls an external command (for example salearn) to process the message **dir_learn:** This driver places a copy of the message in a predefined folder, for example to allow for processing later **email_learn:** This driver emails the message either as an attachment or directly to a set address **sa_blacklist:** This driver adds the sender address of a spam message to the users blacklist (or whitelist of ham messages) Requires SAUserPrefs plugin **amavis_blacklist:** This driver adds the sender address of a spam message to the users blacklist (or whitelist of ham messages) Requires Amacube plugin. Driver by Der-Jan **sa_detach:** If the message is a Spamassassin spam report with the original email attached then this is detached and saved in the Inbox, the spam report is deleted **edit_headers:** Edit the message headers. Headers are edited using preg_replace. **WARNING:** Be sure to match the entire header line, including the name of the header, and include the ^ and $ and test carefully before use on real messages. This driver alters the message source Running multiple drivers ------------------------ **WARNING:** This is very dangerous please always test carefully. Run multiple drivers at your own risk! It may be safer to create one driver that does everything you want. It is possible to run multiple drivers when marking a message as spam/ham. For example running sa_blacklist followed by cmd_learn or edit_headers and cmd_learn. An [example multi-driver][multidriver] is available. This is a starting point only, it requires modification for individual cases. Spam learning commands ---------------------- Spamassassin: ```sa-learn --spam --username=%u %f``` or ```sa-learn --spam --prefs-file=/var/mail/%d/%l/.spamassassin/user_prefs %f``` Ham learning commands --------------------- Spamassassin: ```sa-learn --ham --username=%u %f``` or ```sa-learn --ham --prefs-file=/var/mail/%d/%l/.spamassassin/user_prefs %f``` edit_headers example config --------------------------- **WARNING:** These are simple examples of how to configure the driver options, use at your own risk ```php $config['markasjunk2_spam_patterns'] = array( 'patterns' => array('/^(Subject:\s*)(.*)$/m'), 'replacements' => array('$1[SPAM] $2') ); ``` ```php $config['markasjunk2_ham_patterns'] = array( 'patterns' => array('/^(Subject:\s*)\[SPAM\](.*)$/m'), 'replacements' => array('$1$2') ); ``` [thomas]: mailto:roundcube@gmail.com [rcmaj]: http://github.com/roundcube/roundcubemail/tree/master/plugins/markasjunk [rcplugrepo]: http://plugins.roundcube.net/packages/johndoh/markasjunk2 [releases]: http://github.com/JohnDoh/Roundcube-Plugin-Mark-as-Junk-2/releases [gpl]: http://www.gnu.org/licenses/gpl.html [multidriver]: http://gist.github.com/JohnDoh/8173505 [jsevents]: http://gist.github.com/JohnDoh/37ab8610f9fa63052197c89e5ef89266roundcube-markasjunk2-1.11.2/composer.json000066400000000000000000000012531326357756200205530ustar00rootroot00000000000000{ "name": "johndoh/markasjunk2", "description": "Learn messages as Junk/Not Junk", "keywords": ["junk","spam","lean","move"], "homepage": "http://github.com/JohnDoh/Roundcube-Plugin-Mark-as-Junk-2/", "license": "GPL-3.0", "type": "roundcube-plugin", "version": "1.11.2", "authors": [ { "name": "Philip Weir", "email": "roundcube@tehinterweb.co.uk", "role": "Developer" } ], "repositories": [ { "type": "composer", "url": "http://plugins.roundcube.net" } ], "require": { "php": ">=5.2.1", "roundcube/plugin-installer": ">=0.1.2" }, "extra": { "roundcube": { "min-version": "1.3.6" } } }roundcube-markasjunk2-1.11.2/config.inc.php.dist000066400000000000000000000172331326357756200215260ustar00rootroot00000000000000 array(), 'replacements' => array() ); // Patterns to match and replace headers for spam messages // Replacement method uses preg_replace - http://www.php.net/manual/function.preg-replace.php // WARNING: Be sure to match the entire header line, including the name of the header, also use ^ and $ and the 'm' flag // see the README for an example // TEST CAREFULLY BEFORE USE ON REAL MESSAGES $config['markasjunk2_ham_patterns'] = array( 'patterns' => array(), 'replacements' => array() ); roundcube-markasjunk2-1.11.2/drivers/000077500000000000000000000000001326357756200175065ustar00rootroot00000000000000roundcube-markasjunk2-1.11.2/drivers/amavis_blacklist.php000066400000000000000000000120021326357756200235220ustar00rootroot00000000000000_do_list($uids, true); } public function ham($uids, $mbox) { $this->_do_list($uids, false); } private function _do_list($uids, $spam) { $rcmail = rcmail::get_instance(); $this->user_email = $rcmail->user->data['username']; if (is_file($rcmail->config->get('markasjunk2_amacube_config')) && !$rcmail->config->load_from_file($rcmail->config->get('markasjunk2_amacube_config'))) { rcube::raise_error(array('code' => 527, 'type' => 'php', 'file' => __FILE__, 'line' => __LINE__, 'message' => "Failed to load config from " . $rcmail->config->get('markasjunk2_amacube_config')), true, false); return false; } $db = rcube_db::factory($rcmail->config->get('amacube_db_dsn'), '' , TRUE); $db->set_debug((bool)$rcmail->config->get('sql_debug')); $db->db_connect('w'); // check DB connections and exit on failure if ($err_str = $db->is_error()) { rcube::raise_error(array( 'code' => 603, 'type' => 'db', 'message' => $err_str), FALSE, TRUE); } $sql_result = $db->query( "SELECT `id` FROM `users` WHERE `email` = ?", $this->user_email); if ($sql_result && ($res_array = $db->fetch_assoc($sql_result))) { $rid = $res_array['id']; } else { if ($rcmail->config->get('markasjunk2_debug')) { rcube::write_log('markasjunk2', $this->user_email . ' not found in users table'); } return false; } foreach ($uids as $uid) { $message = new rcube_message($uid); $email = $message->sender['mailto']; $sql_result = $db->query("SELECT `id` FROM `mailaddr` WHERE `email` = ? ORDER BY `priority` DESC", $email); if ($sql_result && ($res_array = $db->fetch_assoc($sql_result))) { $sid = $res_array['id']; } else { if ($rcmail->config->get('markasjunk2_debug')) { rcube::write_log('markasjunk2', $email . ' not found in mailaddr table - add it'); } $sql_result = $db->query("INSERT INTO `mailaddr` ( `priority`, `email` ) VALUES ( 20, ? )", $email); if ($sql_result) { $sid = $db->insert_id(); } else { if ($rcmail->config->get('markasjunk2_debug')) { rcube::write_log('markasjunk2', 'Cannot add ' . $email . ' to mailaddr table: ' . $db->is_error($sql_result)); } return false; } } $wb = ''; $sql_result = $db->query("SELECT `wb` FROM `wblist` WHERE `sid` = ? AND `rid` =?", $sid, $rid); if ($sql_result && ($res_array = $db->fetch_assoc($sql_result))) { $wb = $res_array['wb']; } if (!$wb || (!$spam && preg_match('/^([BbNnFf])[ ]*\z/', $wb ) ) || ($spam && preg_match('/^([WwYyTt])[ ]*\z/', $wb ))) { $newwb = 'w'; if ($spam) $newwb = 'b'; if ($wb) { $sql_result = $db->query('UPDATE `wblist` SET `wb` = ? WHERE `sid` = ? AND `rid` = ?', $newwb, $sid, $rid); } else { $sql_result = $db->query('INSERT INTO `wblist` (`sid`, `rid`, `wb`) VALUES (?,?,?)', $sid, $rid,$newwb); } if (!$sql_result) { if ($rcmail->config->get('markasjunk2_debug')) { rcube::write_log('markasjunk2', 'Cannot update wblist for user ' . $this->user_email . ' with ' . $email ); } return false; } } } } } ?>roundcube-markasjunk2-1.11.2/drivers/cmd_learn.php000066400000000000000000000062421326357756200221470ustar00rootroot00000000000000 * * Copyright (C) 2009-2014 Philip Weir * * This driver is part of the MarkASJunk2 plugin for Roundcube. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Roundcube. If not, see http://www.gnu.org/licenses/. */ class markasjunk2_cmd_learn { public function spam($uids, $mbox) { $this->_do_salearn($uids, true); } public function ham($uids, $mbox) { $this->_do_salearn($uids, false); } private function _do_salearn($uids, $spam) { $rcmail = rcube::get_instance(); $temp_dir = realpath($rcmail->config->get('temp_dir')); if ($spam) $command = $rcmail->config->get('markasjunk2_spam_cmd'); else $command = $rcmail->config->get('markasjunk2_ham_cmd'); if (!$command) return; $command = str_replace('%u', $_SESSION['username'], $command); $command = str_replace('%l', $rcmail->user->get_username('local'), $command); $command = str_replace('%d', $rcmail->user->get_username('domain'), $command); if (preg_match('/%i/', $command)) { $identity_arr = $rcmail->user->get_identity(); $command = str_replace('%i', $identity_arr['email'], $command); } foreach ($uids as $uid) { // reset command for next message $tmp_command = $command; // get DSPAM signature from header (if %xds macro is used) if (preg_match('/%xds/', $command)) { if (preg_match('/^X\-DSPAM\-Signature:\s+((\d+,)?([a-f\d]+))\s*$/im', $rcmail->storage->get_raw_headers($uid), $dspam_signature)) $tmp_command = str_replace('%xds', $dspam_signature[1], $tmp_command); else continue; // no DSPAM signature found in headers -> continue with next uid/message } if (preg_match('/%f/', $command)) { $tmpfname = tempnam($temp_dir, 'rcmSALearn'); file_put_contents($tmpfname, $rcmail->storage->get_raw_body($uid)); $tmp_command = str_replace('%f', $tmpfname, $tmp_command); } exec($tmp_command, $output); if ($rcmail->config->get('markasjunk2_debug')) { rcube::write_log('markasjunk2', $tmp_command); rcube::write_log('markasjunk2', $output); } if (preg_match('/%f/', $command)) unlink($tmpfname); $output = ''; } } } ?>roundcube-markasjunk2-1.11.2/drivers/dir_learn.php000066400000000000000000000041251326357756200221600ustar00rootroot00000000000000_do_messagemove($uids, true); } public function ham($uids, $mbox) { $this->_do_messagemove($uids, false); } private function _do_messagemove($uids, $spam) { $rcmail = rcube::get_instance(); if ($spam) $dest_dir = unslashify($rcmail->config->get('markasjunk2_spam_dir')); else $dest_dir = unslashify($rcmail->config->get('markasjunk2_ham_dir')); if (!$dest_dir) return; $filename = $rcmail->config->get('markasjunk2_filename'); $filename = str_replace('%u', $_SESSION['username'], $filename); $filename = str_replace('%t', ($spam) ? 'spam' : 'ham', $filename); $filename = str_replace('%l', $rcmail->user->get_username('local'), $filename); $filename = str_replace('%d', $rcmail->user->get_username('domain'), $filename); foreach ($uids as $uid) { $tmpfname = tempnam($dest_dir, $filename); file_put_contents($tmpfname, $rcmail->storage->get_raw_body($uid)); if ($rcmail->config->get('markasjunk2_debug')) rcube::write_log('markasjunk2', $tmpfname); } } } ?>roundcube-markasjunk2-1.11.2/drivers/edit_headers.php000066400000000000000000000040241326357756200226370ustar00rootroot00000000000000_edit_headers($uids, true); } public function ham(&$uids, $mbox) { $this->_edit_headers($uids, false); } private function _edit_headers(&$uids, $spam, $mbox) { $rcmail = rcube::get_instance(); $args = $spam ? $rcmail->config->get('markasjunk2_spam_patterns') : $rcmail->config->get('markasjunk2_ham_patterns'); if (count($args['patterns']) == 0) return; $new_uids = array(); foreach ($uids as $uid) { $raw_message = $rcmail->storage->get_raw_body($uid); $raw_headers = $rcmail->storage->get_raw_headers($uid); $updated_headers = preg_replace($args['patterns'], $args['replacements'], $raw_headers); $raw_message = str_replace($raw_headers, $updated_headers, $raw_message); $saved = $rcmail->storage->save_message($mbox, $raw_message); if ($saved !== false) { $rcmail->output->command('rcmail_markasjunk2_move', null, $uid); array_push($new_uids, $saved); } } if (count($new_uids) > 0) $uids = $new_uids; } } ?>roundcube-markasjunk2-1.11.2/drivers/email_learn.php000066400000000000000000000210241326357756200224660ustar00rootroot00000000000000_do_emaillearn($uids, true); } public function ham($uids, $mbox) { $this->_do_emaillearn($uids, false); } private function _do_emaillearn($uids, $spam) { $rcmail = rcube::get_instance(); $identity_arr = $rcmail->user->get_identity(); $from = $identity_arr['email']; if ($spam) $mailto = $rcmail->config->get('markasjunk2_email_spam'); else $mailto = $rcmail->config->get('markasjunk2_email_ham'); $mailto = str_replace('%u', $_SESSION['username'], $mailto); $mailto = str_replace('%l', $rcmail->user->get_username('local'), $mailto); $mailto = str_replace('%d', $rcmail->user->get_username('domain'), $mailto); $mailto = str_replace('%i', $from, $mailto); if (!$mailto) return; $message_charset = $rcmail->output->get_charset(); // chose transfer encoding $charset_7bit = array('ASCII', 'ISO-2022-JP', 'ISO-8859-1', 'ISO-8859-2', 'ISO-8859-15'); $transfer_encoding = in_array(strtoupper($message_charset), $charset_7bit) ? '7bit' : '8bit'; $temp_dir = realpath($rcmail->config->get('temp_dir')); $subject = $rcmail->config->get('markasjunk2_email_subject'); $subject = str_replace('%u', $_SESSION['username'], $subject); $subject = str_replace('%t', ($spam) ? 'spam' : 'ham', $subject); $subject = str_replace('%l', $rcmail->user->get_username('local'), $subject); $subject = str_replace('%d', $rcmail->user->get_username('domain'), $subject); // compose headers array $headers = array(); $headers['Date'] = date('r'); $headers['From'] = format_email_recipient($identity_arr['email'], $identity_arr['name']); $headers['To'] = $mailto; $headers['Subject'] = $subject; foreach ($uids as $uid) { $MESSAGE = new rcube_message($uid); // set message charset as default if (!empty($MESSAGE->headers->charset)) $rcmail->storage->set_charset($MESSAGE->headers->charset); $MAIL_MIME = new Mail_mime($rcmail->config->header_delimiter()); if ($rcmail->config->get('markasjunk2_email_attach', false)) { $tmpPath = tempnam($temp_dir, 'rcmMarkASJunk2'); // send mail as attachment $MAIL_MIME->setTXTBody(($spam ? 'Spam' : 'Ham'). ' report from ' . $rcmail->config->get('product_name'), false, true); $raw_message = $rcmail->storage->get_raw_body($uid); $subject = $MESSAGE->get_header('subject'); if (isset($subject) && $subject !="") $disp_name = $subject . ".eml"; else $disp_name = "message_rfc822.eml"; if (file_put_contents($tmpPath, $raw_message)) { $MAIL_MIME->addAttachment($tmpPath, "message/rfc822", $disp_name, true, $transfer_encoding, 'attachment', '', '', '', $rcmail->config->get('mime_param_folding') ? 'quoted-printable' : NULL, $rcmail->config->get('mime_param_folding') == 2 ? 'quoted-printable' : NULL, '', RCUBE_CHARSET ); } // encoding settings for mail composing $MAIL_MIME->setParam('text_encoding', $transfer_encoding); $MAIL_MIME->setParam('html_encoding', 'quoted-printable'); $MAIL_MIME->setParam('head_encoding', 'quoted-printable'); $MAIL_MIME->setParam('head_charset', $message_charset); $MAIL_MIME->setParam('html_charset', $message_charset); $MAIL_MIME->setParam('text_charset', $message_charset); // pass headers to message object $MAIL_MIME->headers($headers); } else { $headers['Resent-From'] = $headers['From']; $headers['Resent-Date'] = $headers['Date']; $headers['Date'] = $MESSAGE->headers->date; $headers['From'] = $MESSAGE->headers->from; $headers['Subject'] = $MESSAGE->headers->subject; $MAIL_MIME->headers($headers); if ($MESSAGE->has_html_part()) { $body = $MESSAGE->first_html_part(); $MAIL_MIME->setHTMLBody($body); } $body = $MESSAGE->first_text_part(); $MAIL_MIME->setTXTBody($body, false, true); foreach ($MESSAGE->attachments as $attachment) { $MAIL_MIME->addAttachment( $MESSAGE->get_part_body($attachment->mime_id, true), $attachment->mimetype, $attachment->filename, false, $attachment->encoding, $attachment->disposition, '', $attachment->charset ); } foreach ($MESSAGE->mime_parts as $attachment) { if (!empty($attachment->content_id)) { // covert CID to Mail_MIME format $attachment->content_id = str_replace('<', '', $attachment->content_id); $attachment->content_id = str_replace('>', '', $attachment->content_id); if (empty($attachment->filename)) $attachment->filename = $attachment->content_id; $message_body = $MAIL_MIME->getHTMLBody(); $dispurl = 'cid:' . $attachment->content_id; $message_body = str_replace($dispurl, $attachment->filename, $message_body); $MAIL_MIME->setHTMLBody($message_body); $MAIL_MIME->addHTMLImage( $MESSAGE->get_part_body($attachment->mime_id, true), $attachment->mimetype, $attachment->filename, false ); } } // encoding settings for mail composing $MAIL_MIME->setParam('head_encoding', $MESSAGE->headers->encoding); $MAIL_MIME->setParam('head_charset', $MESSAGE->headers->charset); foreach ($MESSAGE->mime_parts as $mime_id => $part) { $mimetype = strtolower($part->ctype_primary . '/' . $part->ctype_secondary); if ($mimetype == 'text/html') { $MAIL_MIME->setParam('text_encoding', $part->encoding); $MAIL_MIME->setParam('html_charset', $part->charset); } else if ($mimetype == 'text/plain') { $MAIL_MIME->setParam('html_encoding', $part->encoding); $MAIL_MIME->setParam('text_charset', $part->charset); } } } $rcmail->deliver_message($MAIL_MIME, $from, $mailto, $smtp_error, $body_file); // clean up if (file_exists($tmpPath)) unlink($tmpPath); if ($rcmail->config->get('markasjunk2_debug')) { if ($spam) rcube::write_log('markasjunk2', $uid . ' SPAM ' . $mailto . ' (' . $subject . ')'); else rcube::write_log('markasjunk2', $uid . ' HAM ' . $mailto . ' (' . $subject . ')'); if ($smtp_error['vars']) rcube::write_log('markasjunk2', $smtp_error['vars']); } } } } ?>roundcube-markasjunk2-1.11.2/drivers/sa_blacklist.php000066400000000000000000000137201326357756200226550ustar00rootroot00000000000000_do_list($uids, true); } public function ham($uids, $mbox) { $this->_do_list($uids, false); } private function _do_list($uids, $spam) { $rcmail = rcube::get_instance(); $this->sa_user = $rcmail->config->get('sauserprefs_userid', "%u"); $this->sa_table = $rcmail->config->get('sauserprefs_sql_table_name'); $this->sa_username_field = $rcmail->config->get('sauserprefs_sql_username_field'); $this->sa_preference_field = $rcmail->config->get('sauserprefs_sql_preference_field'); $this->sa_value_field = $rcmail->config->get('sauserprefs_sql_value_field'); $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); if (is_file($rcmail->config->get('markasjunk2_sauserprefs_config')) && !$rcmail->config->load_from_file($rcmail->config->get('markasjunk2_sauserprefs_config'))) { rcube::raise_error(array('code' => 527, 'type' => 'php', 'file' => __FILE__, 'line' => __LINE__, 'message' => "Failed to load config from " . $rcmail->config->get('markasjunk2_sauserprefs_config')), true, false); return false; } $db = rcube_db::factory($rcmail->config->get('sauserprefs_db_dsnw'), $rcmail->config->get('sauserprefs_db_dsnr'), $rcmail->config->get('sauserprefs_db_persistent')); $db->set_debug((bool)$rcmail->config->get('sql_debug')); $db->db_connect('w'); // check DB connections and exit on failure if ($err_str = $db->is_error()) { rcube::raise_error(array( 'code' => 603, 'type' => 'db', 'message' => $err_str), FALSE, TRUE); } foreach ($uids as $uid) { $message = new rcube_message($uid); $email = $message->sender['mailto']; if ($spam) { // delete any whitelisting for this address $db->query( "DELETE FROM `{$this->sa_table}` WHERE `{$this->sa_username_field}` = ? AND `{$this->sa_preference_field}` = ? AND `{$this->sa_value_field}` = ?;", $this->sa_user, 'whitelist_from', $email); // check address is not already blacklisted $sql_result = $db->query( "SELECT `value` FROM `{$this->sa_table}` WHERE `{$this->sa_username_field}` = ? AND `{$this->sa_preference_field}` = ? AND `{$this->sa_value_field}` = ?;", $this->sa_user, 'blacklist_from', $email); if (!$db->fetch_array($sql_result)) { $db->query( "INSERT INTO `{$this->sa_table}` (`{$this->sa_username_field}`, `{$this->sa_preference_field}`, `{$this->sa_value_field}`) VALUES (?, ?, ?);", $this->sa_user, 'blacklist_from', $email); if ($rcmail->config->get('markasjunk2_debug')) rcube::write_log('markasjunk2', $this->sa_user . ' blacklist ' . $email); } } else { // delete any blacklisting for this address $db->query( "DELETE FROM `{$this->sa_table}` WHERE `{$this->sa_username_field}` = ? AND `{$this->sa_preference_field}` = ? AND `{$this->sa_value_field}` = ?;", $this->sa_user, 'blacklist_from', $email); // check address is not already whitelisted $sql_result = $db->query( "SELECT `value` FROM `{$this->sa_table}` WHERE `{$this->sa_username_field}` = ? AND `{$this->sa_preference_field}` = ? AND `{$this->sa_value_field}` = ?;", $this->sa_user, 'whitelist_from', $email); if (!$db->fetch_array($sql_result)) { $db->query( "INSERT INTO `{$this->sa_table}` (`{$this->sa_username_field}`, `{$this->sa_preference_field}`, `{$this->sa_value_field}`) VALUES (?, ?, ?);", $this->sa_user, 'whitelist_from', $email); if ($rcmail->config->get('markasjunk2_debug')) rcube::write_log('markasjunk2', $this->sa_user . ' whitelist ' . $email); } } } } } ?>roundcube-markasjunk2-1.11.2/drivers/sa_detach.php000066400000000000000000000037321326357756200221370ustar00rootroot00000000000000storage; $new_uids = array(); foreach ($uids as $uid) { $saved = false; $message = new rcube_message($uid); if (count($message->attachments) > 0) { foreach ($message->attachments as $part) { if ($part->ctype_primary == 'message' && $part->ctype_secondary == 'rfc822' && $part->ctype_parameters['x-spam-type'] == 'original') { $orig_message_raw = $message->get_part_body($part->mime_id); $saved = $storage->save_message($mbox, $orig_message_raw); if ($saved !== false) { $rcmail->output->command('rcmail_markasjunk2_move', null, $uid); array_push($new_uids, $saved); } } } } } if (count($new_uids) > 0) $uids = $new_uids; } } ?>roundcube-markasjunk2-1.11.2/localization/000077500000000000000000000000001326357756200205205ustar00rootroot00000000000000roundcube-markasjunk2-1.11.2/localization/bg_BG.inc000066400000000000000000000010751326357756200221560ustar00rootroot00000000000000 0) { spamobj = spamobj.parent(); hamobj = hamobj.parent(); } var disp = {'spam': true, 'ham': true}; if (!rcmail.is_multifolder_listing() && rcmail.env.markasjunk2_spam_mailbox) { if (rcmail.env.mailbox != rcmail.env.markasjunk2_spam_mailbox) { disp.ham = false; } else { disp.spam = false; } } var evt_rtn = rcmail.triggerEvent('markasjunk2-update', {'objs': {'spamobj': spamobj, 'hamobj': hamobj}, 'disp': disp}); if (evt_rtn && evt_rtn.abort) return; disp = evt_rtn ? evt_rtn.disp : disp; disp.spam ? spamobj.show() : spamobj.hide(); disp.ham ? hamobj.show() : hamobj.hide(); } $(document).ready(function() { if (window.rcmail) { rcmail.addEventListener('init', function(evt) { // register command (directly enable in message view mode) rcmail.register_command('plugin.markasjunk2.junk', rcmail_markasjunk2, rcmail.env.uid); rcmail.register_command('plugin.markasjunk2.not_junk', rcmail_markasjunk2_notjunk, rcmail.env.uid); if (rcmail.message_list) { rcmail.message_list.addEventListener('select', function(list) { rcmail.enable_command('plugin.markasjunk2.junk', list.get_selection(false).length > 0); rcmail.enable_command('plugin.markasjunk2.not_junk', list.get_selection(false).length > 0); }); } // make sure the correct icon is displayed even when there is no listupdate event rcmail_markasjunk2_update(); }); rcmail.addEventListener('listupdate', function(props) { rcmail_markasjunk2_update(); } ); rcmail.addEventListener('beforemoveto', function(mbox) { if (mbox && typeof mbox === 'object') mbox = mbox.id; // check if destination mbox equals junk box (and we're not already in the junk box) if (rcmail.env.markasjunk2_move_spam && mbox && mbox == rcmail.env.markasjunk2_spam_mailbox && mbox != rcmail.env.mailbox) { rcmail_markasjunk2(); return false; } // or if destination mbox equals ham box and we are in the junk box else if (rcmail.env.markasjunk2_move_ham && mbox && mbox == rcmail.env.markasjunk2_ham_mailbox && rcmail.env.mailbox == rcmail.env.markasjunk2_spam_mailbox) { rcmail_markasjunk2_notjunk(); return false; } return; } ); } });roundcube-markasjunk2-1.11.2/markasjunk2.php000066400000000000000000000262271326357756200210020ustar00rootroot00000000000000register_action('plugin.markasjunk2.junk', array($this, 'mark_message')); $this->register_action('plugin.markasjunk2.not_junk', array($this, 'mark_message')); $rcmail = rcube::get_instance(); $this->load_config(); $this->ham_mbox = $rcmail->config->get('markasjunk2_ham_mbox', 'INBOX'); $this->spam_mbox = $rcmail->config->get('markasjunk2_spam_mbox', $rcmail->config->get('junk_mbox', null)); $this->toolbar = $this->_set_toolbar_display($rcmail->config->get('markasjunk2_toolbar', -1), $rcmail->action); // register the ham/spam flags with the core $this->add_hook('storage_init', array($this, 'set_flags')); if ($rcmail->action == '' || $rcmail->action == 'show') { $this->include_script('markasjunk2.js'); $this->add_texts('localization', true); $this->include_stylesheet($this->local_skin_path() .'/markasjunk2.css'); if ($this->toolbar) { // add the buttons to the main toolbar $this->add_button(array('command' => 'plugin.markasjunk2.junk', 'type' => 'link', 'class' => 'button buttonPas markasjunk2 disabled', 'classact' => 'button markasjunk2', 'classsel' => 'button markasjunk2Sel', 'title' => 'markasjunk2.buttonjunk', 'innerclass' => 'inner', 'label' => 'junk'), 'toolbar'); $this->add_button(array('command' => 'plugin.markasjunk2.not_junk', 'type' => 'link', 'class' => 'button buttonPas markasnotjunk2 disabled', 'classact' => 'button markasnotjunk2', 'classsel' => 'button markasnotjunk2Sel', 'title' => 'markasjunk2.buttonnotjunk', 'innerclass' => 'inner', 'label' => 'markasjunk2.notjunk'), 'toolbar'); } else { // add the buttons to the mark message menu $markjunk = $this->api->output->button(array('command' => 'plugin.markasjunk2.junk', 'type' => 'link', 'label' => 'markasjunk2.markasjunk', 'id' => 'markasjunk2', 'class' => 'icon markasjunk2', 'classact' => 'icon markasjunk2 active', 'innerclass' => 'icon markasjunk2')); $marknotjunk = $this->api->output->button(array('command' => 'plugin.markasjunk2.not_junk', 'type' => 'link', 'label' => 'markasjunk2.markasnotjunk', 'id' => 'markasnotjunk2', 'class' => 'icon markasnotjunk2', 'classact' => 'icon markasnotjunk2 active', 'innerclass' => 'icon markasnotjunk2')); $this->api->add_content(html::tag('li', array('role' => 'menuitem'), $markjunk), 'markmenu'); $this->api->add_content(html::tag('li', array('role' => 'menuitem'), $marknotjunk), 'markmenu'); } // add markasjunk2 folder settings to the env for JS $this->api->output->set_env('markasjunk2_ham_mailbox', $this->ham_mbox); $this->api->output->set_env('markasjunk2_spam_mailbox', $this->spam_mbox); $this->api->output->set_env('markasjunk2_move_spam', $rcmail->config->get('markasjunk2_move_spam', false)); $this->api->output->set_env('markasjunk2_move_ham', $rcmail->config->get('markasjunk2_move_ham', false)); // check for init method from driver $this->_call_driver('init'); } } function mark_message() { $this->add_texts('localization'); $is_spam = rcube::get_instance()->action == 'plugin.markasjunk2.junk' ? true : false; $multi_folder = $_POST['_multifolder'] == 'true' ? true : false; $messageset = rcmail::get_uids(null, null, $multifolder, rcube_utils::INPUT_POST); $mbox_name = rcube_utils::get_input_value('_mbox', rcube_utils::INPUT_POST); $dest_mbox = $is_spam ? $this->spam_mbox : $this->ham_mbox; $result = $is_spam ? $this->_spam($messageset, $dest_mbox) : $this->_ham($messageset, $dest_mbox); if ($result) { if ($dest_mbox && ($mbox_name !== $dest_mbox || $multi_folder)) { $this->api->output->command('rcmail_markasjunk2_move', $dest_mbox, $this->_messageset_to_uids($messageset, $multi_folder)); } else { $this->api->output->command('command', 'list', $mbox_name); } $this->api->output->command('display_message', $is_spam ? $this->gettext('reportedasjunk') : $this->gettext('reportedasnotjunk'), 'confirmation'); } $this->api->output->send(); } function set_flags($p) { $rcmail = rcube::get_instance(); $flags = array( $this->spam_flag => $rcmail->config->get('markasjunk2_spam_flag'), $this->ham_flag => $rcmail->config->get('markasjunk2_ham_flag') ); $p['message_flags'] = array_merge((array)$p['message_flags'], $flags); return $p; } private function _set_toolbar_display($display, $action) { $ret = true; // backwards compatibility for old config options (removed in 1.10) if ($display < 0) { $rcmail = rcube::get_instance(); $mb = $rcmail->config->get('markasjunk2_mb_toolbar', true); $cp = $rcmail->config->get('markasjunk2_cp_toolbar', true); if ($mb && $cp) { $display = 1; } elseif ($mb && !$cp) { $display = 2; } elseif (!$mb && $cp) { $display = 3; } else { $display = 0; } } switch ($display) { case 0: // always show in mark message menu $ret = false; break; case 1: // always show on toolbar $ret = true; break; case 2: // show in toolbar on mailbox screen, show in mark message menu message on screen $ret = ($action != 'show'); break; case 3: // show in mark message menu on mailbox screen, show in toolbar message on screen $ret = ($action == 'show'); break; } return $ret; } private function _spam(&$messageset, $dest_mbox = NULL) { $rcmail = rcube::get_instance(); $storage = $rcmail->get_storage(); $result = true; foreach ($messageset as $mbox => &$uids) { $storage->set_folder($mbox); if ($rcmail->config->get('markasjunk2_learning_driver', false)) { $result = $this->_call_driver('spam', $uids, $mbox); // abort function of the driver says so if (!$result) break; } if ($rcmail->config->get('markasjunk2_read_spam', false)) $storage->set_flag($uids, 'SEEN', $mbox); if ($rcmail->config->get('markasjunk2_spam_flag', false)) $storage->set_flag($uids, $this->spam_flag, $mbox); if ($rcmail->config->get('markasjunk2_ham_flag', false)) $storage->unset_flag($uids, $this->ham_flag, $mbox); } return $result; } private function _ham(&$messageset, $dest_mbox = NULL) { $rcmail = rcube::get_instance(); $storage = $rcmail->get_storage(); $result = true; foreach ($messageset as $mbox => &$uids) { $storage->set_folder($mbox); if ($rcmail->config->get('markasjunk2_learning_driver', false)) { $result = $this->_call_driver('ham', $uids, $mbox); // abort function of the driver says so if (!$result) break; } if ($rcmail->config->get('markasjunk2_unread_ham', false)) $storage->unset_flag($uids, 'SEEN', $mbox); if ($rcmail->config->get('markasjunk2_spam_flag', false)) $storage->unset_flag($uids, $this->spam_flag, $mbox); if ($rcmail->config->get('markasjunk2_ham_flag', false)) $storage->set_flag($uids, $this->ham_flag, $mbox); } return $result; } private function _call_driver($action, &$uids = null, $mbox = null) { $driver = $this->home.'/drivers/'. rcube::get_instance()->config->get('markasjunk2_learning_driver', 'cmd_learn') .'.php'; $class = 'markasjunk2_' . rcube::get_instance()->config->get('markasjunk2_learning_driver', 'cmd_learn'); if (!is_readable($driver)) { rcube::raise_error(array( 'code' => 600, 'type' => 'php', 'file' => __FILE__, 'line' => __LINE__, 'message' => "MarkasJunk2 plugin: Unable to open driver file $driver" ), true, false); } include_once $driver; if (!class_exists($class, false) || !method_exists($class, 'spam') || !method_exists($class, 'ham')) { rcube::raise_error(array( 'code' => 600, 'type' => 'php', 'file' => __FILE__, 'line' => __LINE__, 'message' => "MarkasJunk2 plugin: Broken driver: $driver" ), true, false); } // call the relevant function from the driver $object = new $class; if ($action == 'spam') $object->spam($uids, $mbox); elseif ($action == 'ham') $object->ham($uids, $mbox); elseif ($action == 'init' && method_exists($object, 'init')) // method_exists check here for backwards compatibility, init method added 20161127 $object->init(); return $object->is_error ? false : true; } private function _messageset_to_uids($messageset, $multi_folder) { $a_uids = array(); foreach ($messageset as $mbox => $uids) { foreach ($uids as $uid) { $a_uids[] = $multi_folder ? $uid . '-' . $mbox : $uid; } } return $a_uids; } } ?>roundcube-markasjunk2-1.11.2/skins/000077500000000000000000000000001326357756200171575ustar00rootroot00000000000000roundcube-markasjunk2-1.11.2/skins/classic/000077500000000000000000000000001326357756200206005ustar00rootroot00000000000000roundcube-markasjunk2-1.11.2/skins/classic/images/000077500000000000000000000000001326357756200220455ustar00rootroot00000000000000roundcube-markasjunk2-1.11.2/skins/classic/images/mail_toolbar.png000066400000000000000000000166151326357756200252300ustar00rootroot00000000000000PNG  IHDR@EtEXtSoftwareAdobe ImageReadyqe</IDATxb?>"~^U_o޼7 ޽cXP*^ b #ywd kw D,Xkk+2"zK3<b/|i1MA~>gD/7Í78/>gx1Ë/  *`O<˷o޺f ?zȰ?1c{u?ûoڼ%KvJsF=ဂ;aӦ7FP [{Jg j87n0l۲ ϥD}6J5 DQLU"BbaՍXIH$McCJH+ bA¢ ]&VYXXTf{̫ q777sn;LmRJ%>sƃAmfj. BPZ!P&CRfr_|~?oek$;jl5Zd_4:1ݾ67₃ct@4 @QUnoWs5:f;??=0 #dbFe۩U,qPn(0X,"f". wpП*"җH/"L*U`9 Bi:ԉ#fI?I&E镓 D $+WӬ°H/ 4[-"S Tt?IiF6W}95ѻ8|{9{<'l'4u'3`LM_|u0̨Y ?>7$yک I26u_׫.l>UQ3ҁ́n ]\ 8 zmi;svW2Ԏx`26O-d^k\Xʇ.C}Q@DA~Dd1=V MEwypr؄$LL8*< Hl@zT]]C""#םlk͕xE7oOPW_i|m. MffėPںzb2q3E7P)ߌ)9q ̰݀nV\=PM$yKRzkF"Tԍ] ʨP`">~H@?JR2f HKħ%>~ ;+)HO߉m +Y (<74w5.FJ/ՂיY8\$6@Y01̮(lf'VژnIdC+nVU||HiTn>/sA|a@ dÊvtִuk4Mrs=I&ݗ}Gr&3i[/vu ' gpqq 4 ȕ{|MnTki*Gaq^!۰ X&/0RFЀcJYl;\GSyuY3Y;GPQ;!10pla{'.irbpKMEܻo< =w:y),Hxln|3>؍Tzc.0x&8i[6C.ane*uCCa"uSeGAﺍmld^"#6w$0P]2*$ Rӱs"1Ng nexVi*Y<əfWNl<~2܋7x'YWOqQꐔCIF^bl@rIF8 NѩtuI9 IUSFJ"Ez~[ZvMWR[_ޥ9E'}0(όx$Nǐ)$tr4{L.v嶜B YlVkr,[N$ʢ!Sļ2h@}JWygHH:q1(1+mav$1nRs_yVr5t)_u"NO^˪jc"6ķ@2FBs&0SN{,U`X_T"g 6Uq붶nl 6l!*&(A A?$DF h>md Wecclkko{r}i{;ؐO|$7sy9y9=q3IaoQ缻aӥorgkN۸40?pu_B0cY[F[NZ;ɓ'577+EEE|R{aԃxݥHRvM$6CA9-kb3KĶLz`u p;ySV:/2QovxAn7z,[\yH7рgV*RSRq`/?&e"_bE4,D* ,ʤꃤBeܪ$H̍&of;nCG62-(yݐhpDF~p.fG!;[6 (![Nk'& }sN5\\KpRt+-$O9/}xt \t@9EȓV]4 UDѼdm]rKtn$! mQL0@au{yj=vۗ Kt7 kT7zOa„40 "Shp (( DM~G"\׀ R?J+qdyg, h#!΢LY/\#qm@Ʉ`0{.`ݝ$=S(qT`ާ~?a2+k `?˖٠0s]$$ ݻ!Ê]__D~,|n?(bьe8p F:̀|juߒC) AZNTX!CaRL 0 <(/ ;QV +53dA lRa]ll 0"ƀ$ Lgekf@ FG7 F*~Ѥ)ZjD6+_ξ!!zƱ>]G'ptČmTwH=(D;NG`l@jTNAx 4saOǜ o;BD+dG+#GnoQW{ly`@``}ERqQkE3Nә:VhuP+mi;/@ZѨ bgfǽ=w 3z3wvs~9sG@dąz1s4 x:Gh<PdT\[|`Ϭ?͙˴>D3R::'#3gPEEy xP0۴fHèiQ)!*x2# `G)ousJ+--=޲~Vx  `ddK(dwB\njy̞Y'R[FMl: -(,*"cFË,0x*iE]絻_)KT2-#9YM Mt?\pp3?XF )4?%>&Q8 0 b|_ZXhҭb(@URV*dKG@qmjGЉD"nҾS"89={6$'EHLȪLF/p9%B VX6|yfpt`Zxdl ~129sք\eyGwPPy #3Op9Ǡ, ]:I4~BAHu^ :8 @->}7Lh.Vgk\Wteǵ4D>hÌ &# PL0j .ݎ#NfcuL[xT(Za ymфP^rN@:ゝF3](׊'ph'M0N!fƍkhCpqa"\ {v!@l0gGE`iqSrOn:ukTUUtTo5V;v/YNtm_\N膟 K8h-# a=:AAʆf^GG- frc{p*4 B=!zty%bI7dEY{7E~x-lFO+r ‘!'JYy y@fV~;֭5=9gk%\T\XY@'K >ѾEU6Ԙʛ~DO/|d QJ5yXsJHgm|}(rhciߵY`7ZE#B$***(BQVVٌpp9mm(ݒne#tw{+嗟Ƈޣ]+=&,D_TKQH yBWvo/W=-hH@-C,S2 ܛ`;'X,*zB&v,&#H *4PCGg}EB}CK1}GWj45J)6mĺ¥BU ϽYhC1%ҷ6],F.?<2ܟhx%+fR;Qz -N2C%E`Wٖ.o՗7ᥗUX4:+KQ0Ln?5"c+BK 2YLWzQț0 W:XBtT6Ϗa ߑL&% #Af q["0 up>e mTJ"QZt4]d0?m+p9t6<~ M p|r<8stXHҹʺr!*9ڃI5Ji-ZBSEGTo>&4+*r=mV[Ue"6o")BGsideVˀ(*m!:Y/ fGc:γh4PMn*F*0=mgoˮ~:ghniD%̯|uhjL(n7]D#D\z?)>Mp5`Eشy3\N׺-[^{, ϯOi+e*NT? 3.VTT [7 ?3)^ )T~R?>؆G6 Qnf$SԟD#myg8 ?>8<]r868ڲ1~̛;^sZlNjp+Nxmϱ}hijNab[9d!V9ޠE"'`4yޠi5or"̞Mx&DO*0 2ge͇^a`4 H_z{` :O8'ð}N߂O>A9R5 P oA܅ Y󕇇${L_ Ȱuf08j?-=sUٹ^zΰ/2htd0`dg>MFfFZFЏ>?333_ [g``kmб_}gx8899,_#չODTIPPd33 ._Qk玍llF ş7_X8iW^t'N_XT>YuuN: S/1pgK gw;Xmv]ǯ1+:0 21-dx  "yi#7qW+=H -ϽH*iE zPEOQQGoZ X1&;?fl3|y}$oFQfI,GX2idQ$jeu}wF4gU49U/2yv AuBS$UP\. s}J0bJps~Y#)4DQ(J*208vx􍸌"}" o"R(g㉀:.ɄBce|~x"SfHL}Kbl.G4|bhoS{22qd C:+/;pY1;H#]=F wYu4u7k?wCɽQ(V?nz^/AmD@_Is-]VZF}ѿ;^Z}/MQl^\j.b I$(¢ zW!"@(^zA7$ҭiNvwwvtߵ{?8Ϲt'g(= 50Y,. +++g.Ukë fzl12FC=iU8u?f[f[2)Ŷm e2+5MyJ+E1Xߧp> Ĥ|Q FrX, :;44r<_h(xIxZnb82rbON r[`vnvq)jF07Z[/{=^w & Ӣ1-Y uvdY jG Yo@YKj$/EV |7bG|58Y/3F97O/B[W_('ݽjp@ݓdtmzO'- 5`j*=_me߸60r8Q$dtɬR5:Rǚ|pt/k`h( e&'вqk`tt]]˻5ZTᲺҲ-:^L(odi<;$ZVtqNou gW!$aWȳ'pLҰ4Y|ZZ_'F7who'\yՆy:VBK!pVa:4=|b))::\hǣ2{ODCIENDB`roundcube-markasjunk2-1.11.2/skins/classic/markasjunk2.css000066400000000000000000000015371326357756200235500ustar00rootroot00000000000000/** * MarkAsJunk2 plugin styles */ #messagetoolbar a.markasjunk2, #messagetoolbar a.markasjunk2Sel, #messagetoolbar a.markasnotjunk2, #messagetoolbar a.markasnotjunk2Sel { text-indent: -5000px; background-image: url(images/mail_toolbar.png); } #messagetoolbar a.markasjunk2 { background-position: -32px 0; } #messagetoolbar a.markasjunk2Sel { background-position: -32px -32px; } #messagetoolbar a.markasnotjunk2 { background-position: 0 0; } #messagetoolbar a.markasnotjunk2Sel { background-position: 0 -32px; } ul.toolbarmenu li a.markasjunk2, ul.toolbarmenu li a.markasnotjunk2 { background-image: url(images/messageactions.png) !important; background-repeat: no-repeat; } ul.toolbarmenu li a.markasjunk2 { background-position: 6px -17px !important; } ul.toolbarmenu li a.markasnotjunk2 { background-position: 6px 1px !important; }roundcube-markasjunk2-1.11.2/skins/larry/000077500000000000000000000000001326357756200203105ustar00rootroot00000000000000roundcube-markasjunk2-1.11.2/skins/larry/images/000077500000000000000000000000001326357756200215555ustar00rootroot00000000000000roundcube-markasjunk2-1.11.2/skins/larry/images/mail_toolbar.png000066400000000000000000000017661326357756200247410ustar00rootroot00000000000000PNG  IHDR4h4gtEXtSoftwareAdobe ImageReadyqe<IDATxKQjn&RA] ARYPVj/oھAPSDv@ʈ HA b0ߡqwfg]gfssL UIV*HHHHHHBlAΜ=| 5z: rX圔uB}%7= pQ-j-3}%tΧvʱ|R)7Q1])_¦]XVv8?uC]P`o ~Xnu3Pa9Ʋ((Bf̧(k(JVW="h-vqG %7vp#:=L2tc 5c9u]=g1=z$<4PJ) Y)j . ]^6-BuZqHn-ݨfTWbCDyS_6@&Q3%)h tk{?m ^e-~u@7tCXBgtd>xNM{^_xS@aj%Dƶwsni5'V ^\3쎧RUYTm5K+kc#98q=~}G@:VC_=}^*k$hZȈ@?LC7a_f% ģ@; T }T  ̖f6>}Fζ=g:Y#6͈=AgS?sJ! gr HQ'KHHHHHH #޴>VIENDB`roundcube-markasjunk2-1.11.2/skins/larry/images/messageactions.png000066400000000000000000000012001326357756200252610ustar00rootroot00000000000000PNG  IHDR(/tEXtSoftwareAdobe ImageReadyqe<"IDATx?HQo"Y`$T zGZj("p7qhhZĖʡ@BJ{>{ṇ^ <=" yOX4:Ѥ|Ŋ5K4^kA{m#ȯlcF>bOqzW68RX5(^7>²Σ(8BxmfV-W*o!Pܣ˺VB 0m8@vδAW6}8k?0փӪxI$syMn}b/)hUEs7ttt}Gn(2~7