pax_global_header00006660000000000000000000000064121367524360014523gustar00rootroot0000000000000052 comment=e0c7c61f3cd1caf2eb42adc24c8a79c0fe80471d Roundcube-Plugin-Mark-as-Junk-2-0.9.2/000077500000000000000000000000001213675243600172525ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-0.9.2/.gitignore000066400000000000000000000000171213675243600212400ustar00rootroot00000000000000config.inc.php Roundcube-Plugin-Mark-as-Junk-2-0.9.2/CHANGELOG000066400000000000000000000040321213675243600204630ustar00rootroot00000000000000Roundcube Webmail MarkAsJunk2 ============================= * add option to call markasjunk2 functions on message move 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-0.9.2/README.md000066400000000000000000000073621213675243600205410ustar00rootroot00000000000000Roundcube 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 This plugin also integrates with the ContextMenu plugin 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 $rcmail_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 1 argument, the UID of message being marked as spam **ham:** This function should take 1 argument, the UID of message being marked as ham Five 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 **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 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 $rcmail_config['markasjunk2_spam_patterns'] = array( 'patterns' => array('/^(Subject:\s*)(.*)$/m'), 'replacements' => array('$1[SPAM] $2') ); ``` ```php $rcmail_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 [gpl]: http://www.gnu.org/licenses/gpl.htmlRoundcube-Plugin-Mark-as-Junk-2-0.9.2/config.inc.php.dist000066400000000000000000000166271213675243600227560ustar00rootroot00000000000000 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 $rcmail_config['markasjunk2_ham_patterns'] = array( 'patterns' => array(), 'replacements' => array() ); ?>Roundcube-Plugin-Mark-as-Junk-2-0.9.2/drivers/000077500000000000000000000000001213675243600207305ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-0.9.2/drivers/cmd_learn.php000066400000000000000000000037431213675243600233740ustar00rootroot00000000000000 */ class markasjunk2_cmd_learn { public function spam($uids) { $this->_do_salearn($uids, true); } public function ham($uids) { $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 (explode(",", $uids) as $uid) { // 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], $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, $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-0.9.2/drivers/dir_learn.php000066400000000000000000000022761213675243600234070ustar00rootroot00000000000000_do_messagemove($uids, true); } public function ham($uids) { $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 (explode(",", $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-0.9.2/drivers/edit_headers.php000066400000000000000000000022771213675243600240710ustar00rootroot00000000000000_edit_headers($uids, true); } public function ham(&$uids) { $this->_edit_headers($uids, false); } private function _edit_headers(&$uids, $spam) { $rcmail = rcube::get_instance(); $args = $spam ? $rcmail->config->get('markasjunk2_spam_patterns') : $rcmail->config->get('markasjunk2_ham_patterns'); if (sizeof($args['patterns']) == 0) return; $mbox = rcube_utils::get_input_value('_mbox', rcube_utils::INPUT_POST); $new_uids = array(); foreach (explode(",", $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 = implode(',', $new_uids); } } ?>Roundcube-Plugin-Mark-as-Junk-2-0.9.2/drivers/email_learn.php000066400000000000000000000142261213675243600237160ustar00rootroot00000000000000_do_emaillearn($uids, true); } public function ham($uids) { $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 (explode(",", $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_content($attachment->mime_id), $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_content($attachment->mime_id), $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->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-0.9.2/drivers/sa_blacklist.php000066400000000000000000000101211213675243600240670ustar00rootroot00000000000000_do_list($uids, true); } public function ham($uids) { $this->_do_list($uids, false); } private function _do_list($uids, $spam) { $rcmail = rcube::get_instance(); 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->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 (explode(",", $uids) as $uid) { $message = new rcube_message($uid); $email = $message->sender['mailto']; if ($spam) { // delete any whitelisting for this address $db->query( "DELETE FROM ". $rcmail->config->get('sauserprefs_sql_table_name') ." WHERE ". $rcmail->config->get('sauserprefs_sql_username_field') ." = ? AND ". $rcmail->config->get('sauserprefs_sql_preference_field') ." = ? AND ". $rcmail->config->get('sauserprefs_sql_value_field') ." = ?;", $_SESSION['username'], 'whitelist_from', $email); // check address is not already blacklisted $sql_result = $db->query( "SELECT value FROM ". $rcmail->config->get('sauserprefs_sql_table_name') ." WHERE ". $rcmail->config->get('sauserprefs_sql_username_field') ." = ? AND ". $rcmail->config->get('sauserprefs_sql_preference_field') ." = ? AND ". $rcmail->config->get('sauserprefs_sql_value_field') ." = ?;", $_SESSION['username'], 'blacklist_from', $email); if (!$db->fetch_array($sql_result)) { $db->query( "INSERT INTO ". $rcmail->config->get('sauserprefs_sql_table_name') ." (". $rcmail->config->get('sauserprefs_sql_username_field') .", ". $rcmail->config->get('sauserprefs_sql_preference_field') .", ". $rcmail->config->get('sauserprefs_sql_value_field') .") VALUES (?, ?, ?);", $_SESSION['username'], 'blacklist_from', $email); if ($rcmail->config->get('markasjunk2_debug')) rcube::write_log('markasjunk2', $_SESSION['username'] . ' blacklist ' . $email); } } else { // delete any blacklisting for this address $db->query( "DELETE FROM ". $rcmail->config->get('sauserprefs_sql_table_name') ." WHERE ". $rcmail->config->get('sauserprefs_sql_username_field') ." = ? AND ". $rcmail->config->get('sauserprefs_sql_preference_field') ." = ? AND ". $rcmail->config->get('sauserprefs_sql_value_field') ." = ?;", $_SESSION['username'], 'blacklist_from', $email); // check address is not already whitelisted $sql_result = $db->query( "SELECT value FROM ". $rcmail->config->get('sauserprefs_sql_table_name') ." WHERE ". $rcmail->config->get('sauserprefs_sql_username_field') ." = ? AND ". $rcmail->config->get('sauserprefs_sql_preference_field') ." = ? AND ". $rcmail->config->get('sauserprefs_sql_value_field') ." = ?;", $_SESSION['username'], 'whitelist_from', $email); if (!$db->fetch_array($sql_result)) { $db->query( "INSERT INTO ". $rcmail->config->get('sauserprefs_sql_table_name') ." (". $rcmail->config->get('sauserprefs_sql_username_field') .", ". $rcmail->config->get('sauserprefs_sql_preference_field') .", ". $rcmail->config->get('sauserprefs_sql_value_field') .") VALUES (?, ?, ?);", $_SESSION['username'], 'whitelist_from', $email); if ($rcmail->config->get('markasjunk2_debug')) rcube::write_log('markasjunk2', $_SESSION['username'] . ' whitelist ' . $email); } } } } } ?>Roundcube-Plugin-Mark-as-Junk-2-0.9.2/drivers/sa_detach.php000066400000000000000000000020251213675243600233530ustar00rootroot00000000000000storage; $mbox = rcube_utils::get_input_value('_mbox', rcube_utils::INPUT_POST); $new_uids = array(); foreach (explode(",", $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') { $orig_message_raw = $storage->get_message_part($message->uid, $part->mime_id, $part); $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 = implode(',', $new_uids); } } ?>Roundcube-Plugin-Mark-as-Junk-2-0.9.2/localization/000077500000000000000000000000001213675243600217425ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-0.9.2/localization/ca_ES.inc000066400000000000000000000006171213675243600234130ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-0.9.2/localization/cs_CZ.inc000066400000000000000000000006011213675243600234330ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-0.9.2/localization/de_CH.inc000066400000000000000000000006701213675243600234020ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-0.9.2/localization/de_DE.inc000066400000000000000000000006701213675243600234000ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-0.9.2/localization/en_GB.inc000066400000000000000000000006371213675243600234150ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-0.9.2/localization/en_US.inc000066400000000000000000000006371213675243600234540ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-0.9.2/localization/es_AR.inc000066400000000000000000000006061213675243600234300ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-0.9.2/localization/es_ES.inc000066400000000000000000000006141213675243600234340ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-0.9.2/localization/fa_IR.inc000066400000000000000000000007151213675243600234200ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-0.9.2/localization/fr_FR.inc000066400000000000000000000005641213675243600234400ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-0.9.2/localization/gl_ES.inc000066400000000000000000000006651213675243600234350ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-0.9.2/localization/hu_HU.inc000066400000000000000000000007001213675243600234420ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-0.9.2/localization/it_IT.inc000066400000000000000000000006561213675243600234540ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-0.9.2/localization/lv_LV.inc000066400000000000000000000006731213675243600234650ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-0.9.2/localization/nl_NL.inc000066400000000000000000000005721213675243600234430ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-0.9.2/localization/pl_PL.inc000066400000000000000000000006711213675243600234470ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-0.9.2/localization/pt_BR.inc000066400000000000000000000006201213675243600234410ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-0.9.2/localization/ro_RO.inc000066400000000000000000000005771213675243600234660ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-0.9.2/localization/ru_RU.inc000066400000000000000000000007601213675243600234740ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-0.9.2/localization/tr_TR.inc000066400000000000000000000006251213675243600234720ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-0.9.2/localization/zh_TW.inc000066400000000000000000000005611213675243600234720ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-0.9.2/markasjunk2.js000066400000000000000000000161201213675243600220400ustar00rootroot00000000000000/** * 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().join(','); var lock = rcmail.set_busy(true, 'loading'); rcmail.http_post('plugin.markasjunk2.' + prop, '_uid='+uids+'&_mbox='+urlencode(rcmail.env.mailbox), 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, uid) { var prev_uid = rcmail.env.uid; var prev_sel = null; var a_uids = uid.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_init() { if (window.rcm_contextmenu_register_command) { rcm_contextmenu_register_command('markasjunk2', 'rcmail_markasjunk2', rcmail.gettext('markasjunk2.markasjunk'), 'reply', null, true, null, null, 'markmessage markasjunk2'); rcm_contextmenu_register_command('markasnotjunk2', 'rcmail_markasjunk2_notjunk', rcmail.gettext('markasjunk2.markasnotjunk'), 'reply', null, true, null, null, 'markmessage markasnotjunk2'); $('#rcmContextMenu li.unflagged').removeClass('separator_below'); $('#rcmContextMenu li.reply').addClass('separator_above'); } } 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.env.markasjunk2_spam_mailbox && rcmail.env.mailbox != rcmail.env.markasjunk2_spam_mailbox) { $('#rcmContextMenu li.markasjunk2').show(); $('#rcmContextMenu li.markasnotjunk2').hide(); spamobj.show(); hamobj.hide(); } else if (!rcmail.env.markasjunk2_override) { $('#rcmContextMenu li.markasjunk2').hide(); $('#rcmContextMenu li.markasnotjunk2').show(); spamobj.hide(); hamobj.show(); } } function rcmail_markasjunk2_status(command) { switch (command) { case 'beforedelete': if (!rcmail.env.flag_for_deletion && rcmail.env.trash_mailbox && rcmail.env.mailbox != rcmail.env.trash_mailbox && (rcmail.message_list && !rcmail.message_list.shiftkey)) rcmail.enable_command('plugin.markasjunk2.junk', 'plugin.markasjunk2.not_junk', false); break; case 'beforemove': case 'beforemoveto': rcmail.enable_command('plugin.markasjunk2.junk', 'plugin.markasjunk2.not_junk', false); break; case 'aftermove': case 'aftermoveto': if (rcmail.env.action == 'show') rcmail.enable_command('plugin.markasjunk2.junk', 'plugin.markasjunk2.not_junk', true); break; case 'afterpurge': case 'afterexpunge': if (!rcmail.env.messagecount && rcmail.task == 'mail') rcmail.enable_command('plugin.markasjunk2.junk', 'plugin.markasjunk2.not_junk', false); break; } } $(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.add_onload('rcmail_markasjunk2_init()'); 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; } ); // update button activation after external events rcmail.addEventListener('beforedelete', function(props) { rcmail_markasjunk2_status('beforedelete'); } ); rcmail.addEventListener('beforemove', function(props) { rcmail_markasjunk2_status('beforemove'); } ); rcmail.addEventListener('beforemoveto', function(props) { rcmail_markasjunk2_status('beforemoveto'); } ); rcmail.addEventListener('aftermove', function(props) { rcmail_markasjunk2_status('aftermove'); } ); rcmail.addEventListener('aftermoveto', function(props) { rcmail_markasjunk2_status('aftermoveto'); } ); rcmail.addEventListener('afterpurge', function(props) { rcmail_markasjunk2_status('afterpurge'); } ); rcmail.addEventListener('afterexpunge', function(props) { rcmail_markasjunk2_status('afterexpunge'); } ); } });Roundcube-Plugin-Mark-as-Junk-2-0.9.2/markasjunk2.php000066400000000000000000000175101213675243600222170ustar00rootroot00000000000000register_action('plugin.markasjunk2.junk', array($this, 'mark_junk')); $this->register_action('plugin.markasjunk2.not_junk', array($this, 'mark_notjunk')); $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); 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 ($rcmail->output->browser->ie && $rcmail->output->browser->ver == 6) $this->include_stylesheet($this->local_skin_path() . '/ie6hacks.css'); $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) { $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 { $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), $markjunk), 'markmenu'); $this->api->add_content(html::tag('li', array('style' => $display_not_junk), $marknotjunk), 'markmenu'); } $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_junk() { $this->add_texts('localization'); $this->_set_flags(); $uids = rcube_utils::get_input_value('_uid', rcube_utils::INPUT_POST); $mbox = rcube_utils::get_input_value('_mbox', rcube_utils::INPUT_POST); if ($this->_spam($uids, $mbox, $this->spam_mbox)) $this->api->output->command('display_message', $this->gettext('reportedasjunk'), 'confirmation'); $this->api->output->send(); } function mark_notjunk() { $this->add_texts('localization'); $this->_set_flags(); $uids = rcube_utils::get_input_value('_uid', rcube_utils::INPUT_POST); $mbox = rcube_utils::get_input_value('_mbox', rcube_utils::INPUT_POST); if ($this->_ham($uids, $mbox, $this->ham_mbox)) $this->api->output->command('display_message', $this->gettext('reportedasnotjunk'), 'confirmation'); $this->api->output->send(); } private function _spam($uids, $mbox_name = NULL, $dest_mbox = NULL) { $rcmail = rcube::get_instance(); $storage = $rcmail->storage; if ($rcmail->config->get('markasjunk2_learning_driver', false)) { $result = $this->_call_driver($uids, true); if (!$result) return false; } if ($rcmail->config->get('markasjunk2_read_spam', false)) $storage->set_flag($uids, 'SEEN', $mbox_name); if ($rcmail->config->get('markasjunk2_spam_flag', false)) $storage->set_flag($uids, $this->spam_flag, $mbox_name); if ($rcmail->config->get('markasjunk2_ham_flag', false)) $storage->unset_flag($uids, $this->ham_flag, $mbox_name); if ($dest_mbox && $mbox_name != $dest_mbox) $this->api->output->command('rcmail_markasjunk2_move', $dest_mbox, $uids); else $this->api->output->command('command', 'list', $mbox_name); return true; } private function _ham($uids, $mbox_name = NULL, $dest_mbox = NULL) { $rcmail = rcube::get_instance(); $storage = $rcmail->storage; if ($rcmail->config->get('markasjunk2_learning_driver', false)) { $result = $this->_call_driver($uids, false); if (!$result) return false; } if ($rcmail->config->get('markasjunk2_unread_ham', false)) $storage->unset_flag($uids, 'SEEN', $mbox_name); if ($rcmail->config->get('markasjunk2_spam_flag', false)) $storage->unset_flag($uids, $this->spam_flag, $mbox_name); if ($rcmail->config->get('markasjunk2_ham_flag', false)) $storage->set_flag($uids, $this->ham_flag, $mbox_name); if ($dest_mbox && $mbox_name != $dest_mbox) $this->api->output->command('rcmail_markasjunk2_move', $dest_mbox, $uids); else $this->api->output->command('command', 'list', $mbox_name); return true; } private function _call_driver(&$uids, $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); } $object = new $class; if ($spam) $object->spam($uids); else $object->ham($uids); return $object->is_error ? false : true; } private function _set_flags() { $rcmail = rcube::get_instance(); if ($rcmail->config->get('markasjunk2_spam_flag', false)) { if ($flag = array_search($rcmail->config->get('markasjunk2_spam_flag'), $rcmail->storage->conn->flags)) $this->spam_flag = $flag; else $rcmail->storage->conn->flags[$this->spam_flag] = $rcmail->config->get('markasjunk2_spam_flag'); } if ($rcmail->config->get('markasjunk2_ham_flag', false)) { if ($flag = array_search($rcmail->config->get('markasjunk2_ham_flag'), $rcmail->storage->conn->flags)) $this->ham_flag = $flag; else $rcmail->storage->conn->flags[$this->ham_flag] = $rcmail->config->get('markasjunk2_ham_flag'); } } } ?>Roundcube-Plugin-Mark-as-Junk-2-0.9.2/package.xml000066400000000000000000000077331213675243600214010ustar00rootroot00000000000000 markasjunk2 http://github.com/JohnDoh/Roundcube-Plugin-Mark-as-Junk-2/ Learn messages as Junk/Not Junk Adds a new button to the mailbox toolbar to mark the selected messages as Junk/Not Junk, optionally detaching original messages from spam reports if the message is not junk and learning junk/not junk using various methods (sa-learn, etc.). Philip Weir JohnDoh roundcube@tehinterweb.co.uk yes 2013-02-24 1.6 1.6 stable stable GNU GPLv3+ - 5.2.1 1.7.0 Roundcube-Plugin-Mark-as-Junk-2-0.9.2/skins/000077500000000000000000000000001213675243600204015ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-0.9.2/skins/classic/000077500000000000000000000000001213675243600220225ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-0.9.2/skins/classic/ie6hacks.css000066400000000000000000000006361213675243600242360ustar00rootroot00000000000000/** * MarkAsJunk2 plugin styles (IE6 hacks) */ #messagetoolbar a.markasjunk2, #messagetoolbar a.markasjunk2Sel, #messagetoolbar a.markasnotjunk2, #messagetoolbar a.markasnotjunk2Sel { background-image: url(mail_toolbar.gif); } #rcmContextMenu .markasjunk2 a, #rcmContextMenu .markasnotjunk2 a, #markmessagemenu a.markasjunk2, #markmessagemenu a.markasnotjunk2 { background-image: url(messageactions.gif); }Roundcube-Plugin-Mark-as-Junk-2-0.9.2/skins/classic/mail_toolbar.gif000066400000000000000000000065521213675243600251650ustar00rootroot00000000000000GIF89a@ExUIh6u\eR{S[4\Ey{}fCƕѸѫJw2aJCh/`Z[]zeGW>ʩfzZӉvkudQ{:삟Dq-acdSrAa9lTԍ779CW5XϺ5I';k"&:||ax깂flFj:xے;;=}+CߴRST1WJLMCCEqLRrZ_CL-qru]=klngii6U!򖹄:T+yq]^_Y45[:Z&tvxmoppqrtuv򙚜;d$˄jR&N@c,jjlPfB|}O5hhhS4opr5m˜[@_`biV;UVXstvözl.C!6\">])U4efhwxz>S1[ZCgPS#G`}MWXZkmo6XQ.UwC?i)6a!*WOQR?o%>?HIJMNP笮FGH I@:h!0ptnۘgmcڮہ|pݕJSGw܌joWvCGEod6P(q_/K ʌȚNo9ZxH_sR!,@E@ H*\_#Jh6m1K̟+2(9B™?YV<vMr_%( ,Z Aȟ?$LcG@!&vP2Cq͍l !U3 ߇NrsB,\̸cLeߜ|ẃչs ~0I"䠗~Nr֝wy)(QwYn]0CݒLŊ=#l.6IϟEnZiҢJg˂RT䘕u(=ґg&VTa @0dSJԢldt3%*'A8@!n5(ф&Pg1ȍ}`\i!Gb8oL`C iO cbk @%&f0cR &A`EqIXֵֺ1U 2b0W>5^ Ha:nCAqqXwe;ohG-a AiD+*@%>8$ JaAkWȁ@l"Z@ܠH8$CwT) A10A7΂3Y+8,ڑ$a )Ah]d\aw,> xF SY pL>&&@3h <&-? LJ S0(׽N^>B +?@ L OtЅ"5F`0Hv/lfs@-@mXațzTt8A!Tv(;AFMzcԮ6=57&2 nCf4jf xv =`B5awհ5B0b a ` +W :E0\a֣Fe a H(I#^V!zD"4 K@2a H(zyDjt :PE 88=&o*X~vgc?GZъyba\z {%cYw?eD8Nr+:(uPy s .YC.1i$=8rvI Ȉ. $?3 .B Nqflp Z Y p:p6 ./0|/0M `_c l|DD h`^0|g0/I) pP) MÐ RW$ f7` lK4 Q0=/*P/p|O"  P0E0w 0|`-o2 ]/UXP PV1BG p (PhQǀ6oB@հn5n %0 qp (An!o% o ;Roundcube-Plugin-Mark-as-Junk-2-0.9.2/skins/classic/mail_toolbar.png000066400000000000000000000166151213675243600252050ustar00rootroot00000000000000PNG  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&DOgGOf?b>]8xz{W3bJ3P3OS.ȭmmoq荢}T0|~|jQv<دѠє`=[)삅H܌lAe)wy{՞oZDǤMa<ĭ֮Jh3z[PQQiEagڜ{wR^CU昘~Y8}ʑM/yz|fBY2NPPGy-Ȉ5U~bZ5دuP3[Z[^zɅtȿŊȣÖz|qUrRex_Iz0L{3O}7ĪgV[xD_xMQg?jwXB\EAm&qrtަS|9p!,$ H ACdfPoC1b\S2pu,mKB8mx- 1L1SND~ЕOJ-K9xHf̀ػ71* T*,:Lք,2RXzXx@g?%M px@RPN1.4TⳠ&m9H:R a0QCDMXB]H#'8S-A!Jh?! Oy@y-F12; ka5\"{Y S b `Al+r$h@7@B7pL‹'TA1O <5PA+y(g<1yB#ADEth&ܠe*^ "N AO$P@!D YlA4Cz ;F0@$H ,,W $)*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-0.9.2/skins/larry/000077500000000000000000000000001213675243600215325ustar00rootroot00000000000000Roundcube-Plugin-Mark-as-Junk-2-0.9.2/skins/larry/ie6hacks.css000066400000000000000000000000611213675243600237360ustar00rootroot00000000000000/** * MarkAsJunk2 plugin styles (IE6 hacks) */ Roundcube-Plugin-Mark-as-Junk-2-0.9.2/skins/larry/mail_toolbar.png000066400000000000000000000036041213675243600247070ustar00rootroot00000000000000PNG  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-0.9.2/skins/larry/markasjunk2.css000066400000000000000000000016561213675243600245040ustar00rootroot00000000000000/** * MarkAsJunk2 plugin styles */ #messagetoolbar a.markasjunk2, #messagetoolbar a.markasjunk2Sel, #messagetoolbar a.markasnotjunk2, #messagetoolbar a.markasnotjunk2Sel { background-image: url(mail_toolbar.png); } #messagetoolbar a.markasjunk2, #messagetoolbar a.markasjunk2Sel { background-position: center -14px; } #messagetoolbar a.markasnotjunk2, #messagetoolbar a.markasnotjunk2Sel { background-position: center -61px; } #rcmContextMenu .markasjunk2 a span, #rcmContextMenu .markasnotjunk2 a span, #markmessagemenu a.markasjunk2 span, #markmessagemenu a.markasnotjunk2 span { background-image: url(messageactions.png); } #markmessagemenu a.markasjunk2 span { background-position: 1px -17px; } #markmessagemenu a.markasnotjunk2 span { background-position: 1px 5px; } #rcmContextMenu .markasjunk2 a span { background-position: 7px -14px; } #rcmContextMenu .markasnotjunk2 a span { background-position: 7px 7px; }Roundcube-Plugin-Mark-as-Junk-2-0.9.2/skins/larry/messageactions.png000066400000000000000000000020321213675243600252420ustar00rootroot00000000000000PNG  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