pax_global_header00006660000000000000000000000064124530262110014506gustar00rootroot0000000000000052 comment=6c6c87f27a30876267cfe24c366067a126947868 Roundcube-Plugin-Mark-as-Junk-2-1.9/000077500000000000000000000000001245302621100170765ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-1.9/.gitignore000066400000000000000000000000171245302621100210640ustar00rootroot00000000000000config.inc.php Roundcube-Plugin-Mark-as-Junk-2-1.9/CHANGELOG000066400000000000000000000061341245302621100203140ustar00rootroot00000000000000Roundcube Webmail MarkAsJunk2 ============================= 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-Plugin-Mark-as-Junk-2-1.9/README.md000066400000000000000000000112471245302621100203620ustar00rootroot00000000000000Roundcube 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 2 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 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/8173505Roundcube-Plugin-Mark-as-Junk-2-1.9/composer.json000066400000000000000000000012531245302621100216210ustar00rootroot00000000000000{ "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.9", "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.1-beta" } } }Roundcube-Plugin-Mark-as-Junk-2-1.9/config.inc.php.dist000066400000000000000000000166261245302621100226010ustar00rootroot00000000000000 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-Plugin-Mark-as-Junk-2-1.9/drivers/000077500000000000000000000000001245302621100205545ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-1.9/drivers/amavis_blacklist.php000066400000000000000000000067351245302621100246100ustar00rootroot00000000000000_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-Plugin-Mark-as-Junk-2-1.9/drivers/cmd_learn.php000066400000000000000000000040551245302621100232150ustar00rootroot00000000000000 */ 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-Plugin-Mark-as-Junk-2-1.9/drivers/dir_learn.php000066400000000000000000000022761245302621100232330ustar00rootroot00000000000000_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-Plugin-Mark-as-Junk-2-1.9/drivers/edit_headers.php000066400000000000000000000021551245302621100237100ustar00rootroot00000000000000_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 (sizeof($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 (sizeof($new_uids) > 0) $uids = $new_uids; } } ?>Roundcube-Plugin-Mark-as-Junk-2-1.9/drivers/email_learn.php000066400000000000000000000142251245302621100235410ustar00rootroot00000000000000_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-Plugin-Mark-as-Junk-2-1.9/drivers/sa_blacklist.php000066400000000000000000000103421245302621100237200ustar00rootroot00000000000000_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-Plugin-Mark-as-Junk-2-1.9/drivers/sa_detach.php000066400000000000000000000017341245302621100232050ustar00rootroot00000000000000storage; $new_uids = array(); foreach ($uids as $uid) { $saved = false; $message = new rcube_message($uid); if (sizeof($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 (sizeof($new_uids) > 0) $uids = $new_uids; } } ?>Roundcube-Plugin-Mark-as-Junk-2-1.9/localization/000077500000000000000000000000001245302621100215665ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-1.9/localization/ca_ES.inc000066400000000000000000000006171245302621100232370ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-1.9/localization/cs_CZ.inc000066400000000000000000000006011245302621100232570ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-1.9/localization/de_CH.inc000066400000000000000000000006701245302621100232260ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-1.9/localization/de_DE.inc000066400000000000000000000006701245302621100232240ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-1.9/localization/en_GB.inc000066400000000000000000000006371245302621100232410ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-1.9/localization/en_US.inc000066400000000000000000000006371245302621100233000ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-1.9/localization/es_AR.inc000066400000000000000000000006061245302621100232540ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-1.9/localization/es_ES.inc000066400000000000000000000006141245302621100232600ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-1.9/localization/fa_IR.inc000066400000000000000000000007151245302621100232440ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-1.9/localization/fr_FR.inc000066400000000000000000000005641245302621100232640ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-1.9/localization/gl_ES.inc000066400000000000000000000006651245302621100232610ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-1.9/localization/hu_HU.inc000066400000000000000000000007521245302621100232750ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-1.9/localization/it_IT.inc000066400000000000000000000006561245302621100233000ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-1.9/localization/ja_JP.inc000066400000000000000000000010441245302621100232430ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-1.9/localization/lv_LV.inc000066400000000000000000000006731245302621100233110ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-1.9/localization/nl_NL.inc000066400000000000000000000005721245302621100232670ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-1.9/localization/pl_PL.inc000066400000000000000000000006711245302621100232730ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-1.9/localization/pt_BR.inc000066400000000000000000000006201245302621100232650ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-1.9/localization/ro_RO.inc000066400000000000000000000005771245302621100233120ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-1.9/localization/ru_RU.inc000066400000000000000000000007601245302621100233200ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-1.9/localization/tr_TR.inc000066400000000000000000000006251245302621100233160ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-1.9/localization/zh_TW.inc000066400000000000000000000005611245302621100233160ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-1.9/markasjunk2.js000066400000000000000000000113171245302621100216670ustar00rootroot00000000000000/** * MarkAsJunk2 plugin script */ function rcmail_markasjunk2(prop) { if (!rcmail.env.uid && (!rcmail.message_list || !rcmail.message_list.get_selection().length)) return; if (!prop || prop == 'markasjunk2') prop = 'junk'; var prev_sel = null; // also select childs of (collapsed) threads if (rcmail.message_list) { if (rcmail.env.uid) { if (rcmail.message_list.rows[rcmail.env.uid].has_children && !rcmail.message_list.rows[rcmail.env.uid].expanded) { if (!rcmail.message_list.in_selection(rcmail.env.uid)) { prev_sel = rcmail.message_list.get_selection(); rcmail.message_list.select_row(rcmail.env.uid); } rcmail.message_list.select_childs(rcmail.env.uid); rcmail.env.uid = null; } else if (rcmail.message_list.get_single_selection() == rcmail.env.uid) { rcmail.env.uid = null; } } else { selection = rcmail.message_list.get_selection(); for (var i in selection) { if (rcmail.message_list.rows[selection[i]].has_children && !rcmail.message_list.rows[selection[i]].expanded) rcmail.message_list.select_childs(selection[i]); } } } var uids = rcmail.env.uid ? rcmail.env.uid : rcmail.message_list.get_selection(); var lock = rcmail.set_busy(true, 'loading'); rcmail.http_post('plugin.markasjunk2.' + prop, rcmail.selection_post_data({_uid: uids, _multifolder: rcmail.is_multifolder_listing()}), lock); if (prev_sel) { rcmail.message_list.clear_selection(); for (var i in prev_sel) rcmail.message_list.select_row(prev_sel[i], CONTROL_KEY); } } function rcmail_markasjunk2_notjunk(prop) { rcmail_markasjunk2('not_junk'); } rcube_webmail.prototype.rcmail_markasjunk2_move = function(mbox, uids) { var prev_uid = rcmail.env.uid; var prev_sel = null; var a_uids = $.isArray(uids) ? uids : uids.split(",");; if (rcmail.message_list && a_uids.length == 1 && !rcmail.message_list.rows[a_uids[0]]) { rcmail.env.uid = a_uids[0]; } else if (rcmail.message_list && a_uids.length == 1 && !rcmail.message_list.in_selection(a_uids[0]) && !rcmail.env.threading) { rcmail.env.uid = a_uids[0]; rcmail.message_list.remove_row(rcmail.env.uid, false); } else if (rcmail.message_list && (!rcmail.message_list.in_selection(a_uids[0]) || a_uids.length != rcmail.message_list.selection.length)) { prev_sel = rcmail.message_list.get_selection(); rcmail.message_list.clear_selection(); for (var i in a_uids) rcmail.message_list.select_row(a_uids[i], CONTROL_KEY); } if (mbox) rcmail.move_messages(mbox); else rcmail.delete_messages(); rcmail.env.uid = prev_uid; if (prev_sel) { rcmail.message_list.clear_selection(); for (var i in prev_sel) { if (prev_sel[i] != uid) rcmail.message_list.select_row(prev_sel[i], CONTROL_KEY); } } } function rcmail_markasjunk2_update() { var spamobj = $('#' + rcmail.buttons['plugin.markasjunk2.junk'][0].id); var hamobj = $('#' + rcmail.buttons['plugin.markasjunk2.not_junk'][0].id); if (spamobj.parent('li').length > 0) { spamobj = spamobj.parent(); hamobj = hamobj.parent(); } if (rcmail.env.markasjunk2_override || rcmail.is_multifolder_listing()) { spamobj.show(); hamobj.show(); } else if (rcmail.env.markasjunk2_spam_mailbox && rcmail.env.mailbox != rcmail.env.markasjunk2_spam_mailbox) { spamobj.show(); hamobj.hide(); } else { spamobj.hide(); hamobj.show(); } } $(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().length > 0); rcmail.enable_command('plugin.markasjunk2.not_junk', list.get_selection().length > 0); }); } }); 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-Plugin-Mark-as-Junk-2-1.9/markasjunk2.php000066400000000000000000000200361245302621100220400ustar00rootroot00000000000000register_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 = $rcmail->action == 'show' ? $rcmail->config->get('markasjunk2_cp_toolbar', true) : $rcmail->config->get('markasjunk2_mb_toolbar', true); // 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'); // check which folder we are currently in to display the correct button $mb_override = ($this->spam_mbox) ? false : true; $display_junk = $display_not_junk = ''; if ($_SESSION['mbox'] == $this->spam_mbox) { $display_junk = 'display: none;'; } elseif (!$mb_override) { $display_not_junk = 'display: none;'; } 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', 'label' => 'junk', 'style' => $display_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', 'label' => 'markasjunk2.notjunk', 'style' => $display_not_junk), 'toolbar'); } else { // add the buttons to the mark message menu $markjunk = $this->api->output->button(array('command' => 'plugin.markasjunk2.junk', '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', 'label' => 'markasjunk2.markasnotjunk', 'id' => 'markasnotjunk2', 'class' => 'icon markasnotjunk2', 'classact' => 'icon markasnotjunk2 active', 'innerclass' => 'icon markasnotjunk2')); $this->api->add_content(html::tag('li', array('style' => $display_junk, 'role' => 'menuitem'), $markjunk), 'markmenu'); $this->api->add_content(html::tag('li', array('style' => $display_not_junk, 'role' => 'menuitem'), $marknotjunk), 'markmenu'); } // add markasjunk2 folder settings to the env for JS $this->api->output->set_env('markasjunk2_override', $mb_override); $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)); } } 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(); $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 _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($uids, $mbox, true); // 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($uids, $mbox, false); // 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(&$uids, $mbox, $spam) { $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 ($spam) $object->spam($uids, $mbox); else $object->ham($uids, $mbox); 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-Plugin-Mark-as-Junk-2-1.9/skins/000077500000000000000000000000001245302621100202255ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-1.9/skins/classic/000077500000000000000000000000001245302621100216465ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-1.9/skins/classic/images/000077500000000000000000000000001245302621100231135ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-1.9/skins/classic/images/mail_toolbar.png000066400000000000000000000166151245302621100262760ustar00rootroot00000000000000PNG  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-Plugin-Mark-as-Junk-2-1.9/skins/classic/markasjunk2.css000066400000000000000000000015351245302621100246140ustar00rootroot00000000000000/** * 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 0 !important; }Roundcube-Plugin-Mark-as-Junk-2-1.9/skins/larry/000077500000000000000000000000001245302621100213565ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-1.9/skins/larry/images/000077500000000000000000000000001245302621100226235ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-1.9/skins/larry/images/mail_toolbar.png000066400000000000000000000036041245302621100260000ustar00rootroot00000000000000PNG  IHDR4h4gtEXtSoftwareAdobe ImageReadyqe<&IDATxmLSWo_JA>S0KYp_1Aa5hBLE}0[t"h0lF璙1^eBT`{ږ[bINڞ{ydzz{{b@ 1 Āb@ 1Wɣ]`ƍu itkzﵴGQ7%%%tddJԐ$+TVVfjj@.hu:?t=*>QT\l9FcV(pMLL]4IRN"ԧZ{Y\LmzKp/ST _ެT*kbݠ!n||l1@ .4|$onlݺXkkkijj}۶m7XsssyL& 8>DPw"j{,\c-,,<{}Ϟ=;w~fm/8  AmX+W( HKcӛn4z{{ vB{ph|׎S @:9CwC#v =jjjھz/W\F3>>AYt)["Q|O }1?]l=9#4_/*P}}dbpH@s׬Yü%#Sρn|dIIa4=عIQD#L)ӱKv^ŐΗtcN& 4nѓSB(4&5UWWsїs%Ar{8##uD?Q݂;2i%hmdZΟ߿h3?VPPz2@&.wn )L6S$a: ZG{ 3q#h}C]bb@ 1 Āb@ 1 Āb@3mΏEIڿ\כ޷oYHBCJEJKG(OC#sժUe%%%iv_C-ȲU*&''744܍-֡ G>̙3B̡bX wCP s{-33fl6M[PfLal1{Ń<ȑ#U:O PNW;7G 8Q1P[[ex似7jۤN?moov8|cX/ 2x!N Do-pggMxU``9+<=EuO|pmQLB\ /^(6<'O >~HcQuNNN)JcO]]{ccc2?jIwؑs?PoFF ]:11Q)+? {1Fr}sO9JhE>!h7rSEF 4c6>~yXZcT LpzĴ4濨!nƾtWoy "#V#8|_Meq erѴ!.uPwP%.7F )X$@|\,P:yqh{}{rʀb@ 1 Āj 0-gtPIENDB`Roundcube-Plugin-Mark-as-Junk-2-1.9/skins/larry/images/messageactions.png000066400000000000000000000020321245302621100263330ustar00rootroot00000000000000PNG  IHDR(/tEXtSoftwareAdobe ImageReadyqe<IDATxVmHSQU7u[~5ӒRĤL( _EBH0 !hɔJ?p̲Ynnn{6ȟx89y8mĠEQx-пL×h*KRD"W "OPTk 05ʕ݄uco߷?A{ y~ LLMM"RV@=)h|ff-"䛈#žwyim T$V99'`0!\+`cQr]^G=mbFV ~D@zyHZd03T/id1O!A1~/4J2eaQQz @ +ȹ b lR^VV!ZmNM;`Zw `3;v6&|$B(׼mdEmX?$Zpqli-C(Xշ/$--%0UE,9h26;GBo0}ݺ苑V!ԙ2[z毶X̮:\MS5Q-mm'Nm٬Ӥ2MqqRVt=W)){/|ܵ>:KΎ=|W,@HTx^r2"7CpKDMwoc <\P!^]ZP*9ャ>(OH+(HFtV6Tа/jkX5_:+=3I=h+@8b'Gk::;񺦮NrŹFqdn