52ffd8b406
* COPYING * README * autogen.sh * manual/claws-mail-manual.xml * manual/gpl.xml * manual/es/claws-mail-manual.xml * manual/es/gpl.xml * manual/fr/claws-mail-manual.xml * manual/fr/gpl.xml * manual/pl/gpl.xml * src/account.c * src/account.h * src/action.c * src/action.h * src/adbookbase.h * src/addr_compl.c * src/addr_compl.h * src/addrbook.c * src/addrbook.h * src/addrcache.c * src/addrcache.h * src/addrcindex.c * src/addrcindex.h * src/addrclip.c * src/addrclip.h * src/addrdefs.h * src/addressadd.c * src/addressadd.h * src/addressbook.c * src/addressbook.h * src/addressbook_foldersel.c * src/addressbook_foldersel.h * src/addressitem.h * src/addrgather.c * src/addrgather.h * src/addrharvest.c * src/addrharvest.h * src/addrindex.c * src/addrindex.h * src/addritem.c * src/addritem.h * src/addrquery.c * src/addrquery.h * src/addrselect.c * src/addrselect.h * src/alertpanel.c * src/alertpanel.h * src/browseldap.c * src/browseldap.h * src/codeconv.c * src/codeconv.h * src/compose.c * src/compose.h * src/crash.c * src/crash.h * src/customheader.c * src/customheader.h * src/displayheader.c * src/displayheader.h * src/editaddress.c * src/editaddress.h * src/editaddress_other_attributes_ldap.c * src/editaddress_other_attributes_ldap.h * src/editbook.c * src/editbook.h * src/editgroup.c * src/editgroup.h * src/editjpilot.c * src/editjpilot.h * src/editldap.c * src/editldap.h * src/editldap_basedn.c * src/editldap_basedn.h * src/edittags.c * src/edittags.h * src/editvcard.c * src/editvcard.h * src/enriched.c * src/enriched.h * src/exphtmldlg.c * src/exphtmldlg.h * src/expldifdlg.c * src/expldifdlg.h * src/export.c * src/export.h * src/exporthtml.c * src/exporthtml.h * src/exportldif.c * src/exportldif.h * src/filtering.c * src/filtering.h * src/folder.c * src/folder.h * src/folder_item_prefs.c * src/folder_item_prefs.h * src/foldersel.c * src/foldersel.h * src/folderutils.c * src/folderutils.h * src/folderview.c * src/folderview.h * src/gedit-print.c * src/gedit-print.h * src/grouplistdialog.c * src/grouplistdialog.h * src/headerview.c * src/headerview.h * src/html.c * src/html.h * src/image_viewer.c * src/image_viewer.h * src/imap.c * src/imap.h * src/imap_gtk.c * src/imap_gtk.h * src/import.c * src/import.h * src/importldif.c * src/importldif.h * src/importmutt.c * src/importmutt.h * src/importpine.c * src/importpine.h * src/inc.c * src/inc.h * src/jpilot.c * src/jpilot.h * src/ldapctrl.c * src/ldapctrl.h * src/ldaplocate.c * src/ldaplocate.h * src/ldapquery.c * src/ldapquery.h * src/ldapserver.c * src/ldapserver.h * src/ldapupdate.c * src/ldapupdate.h * src/ldaputil.c * src/ldaputil.h * src/ldif.c * src/ldif.h * src/localfolder.c * src/localfolder.h * src/main.c * src/main.h * src/mainwindow.c * src/mainwindow.h * src/manual.c * src/manual.h * src/matcher.c * src/matcher.h * src/matcher_parser.h * src/matcher_parser_lex.l * src/matcher_parser_parse.y * src/mbox.c * src/mbox.h * src/message_search.c * src/message_search.h * src/messageview.c * src/messageview.h * src/mh.c * src/mh.h * src/mh_gtk.c * src/mh_gtk.h * src/mimeview.c * src/mimeview.h * src/msgcache.c * src/msgcache.h * src/mutt.c * src/mutt.h * src/news.c * src/news.h * src/news_gtk.c * src/news_gtk.h * src/noticeview.c * src/noticeview.h * src/partial_download.c * src/partial_download.h * src/pine.c * src/pine.h * src/pop.c * src/pop.h * src/prefs_account.c * src/prefs_account.h * src/prefs_actions.c * src/prefs_actions.h * src/prefs_common.c * src/prefs_common.h * src/prefs_compose_writing.c * src/prefs_compose_writing.h * src/prefs_customheader.c * src/prefs_customheader.h * src/prefs_display_header.c * src/prefs_display_header.h * src/prefs_ext_prog.c * src/prefs_ext_prog.h * src/prefs_filtering.c * src/prefs_filtering.h * src/prefs_filtering_action.c * src/prefs_filtering_action.h * src/prefs_folder_column.c * src/prefs_folder_column.h * src/prefs_folder_item.c * src/prefs_folder_item.h * src/prefs_fonts.c * src/prefs_fonts.h * src/prefs_gtk.c * src/prefs_gtk.h * src/prefs_image_viewer.c * src/prefs_image_viewer.h * src/prefs_logging.c * src/prefs_logging.h * src/prefs_matcher.c * src/prefs_matcher.h * src/prefs_message.c * src/prefs_message.h * src/prefs_msg_colors.c * src/prefs_msg_colors.h * src/prefs_other.c * src/prefs_other.h * src/prefs_quote.c * src/prefs_quote.h * src/prefs_receive.c * src/prefs_receive.h * src/prefs_send.c * src/prefs_send.h * src/prefs_spelling.c * src/prefs_spelling.h * src/prefs_summaries.c * src/prefs_summaries.h * src/prefs_summary_column.c * src/prefs_summary_column.h * src/prefs_summary_open.c * src/prefs_summary_open.h * src/prefs_template.c * src/prefs_template.h * src/prefs_themes.c * src/prefs_themes.h * src/prefs_toolbar.c * src/prefs_toolbar.h * src/prefs_wrapping.c * src/prefs_wrapping.h * src/privacy.c * src/privacy.h * src/procheader.c * src/procheader.h * src/procmime.c * src/procmime.h * src/procmsg.c * src/procmsg.h * src/quote_fmt.c * src/quote_fmt_lex.l * src/quote_fmt_parse.y * src/recv.c * src/recv.h * src/remotefolder.c * src/remotefolder.h * src/send_message.c * src/send_message.h * src/setup.c * src/setup.h * src/simple-gettext.c * src/sourcewindow.c * src/sourcewindow.h * src/ssl_manager.c * src/ssl_manager.h * src/statusbar.c * src/statusbar.h * src/stock_pixmap.c * src/stock_pixmap.h * src/summary_search.c * src/summary_search.h * src/summaryview.c * src/summaryview.h * src/textview.c * src/textview.h * src/toolbar.c * src/toolbar.h * src/undo.c * src/undo.h * src/unmime.c * src/unmime.h * src/uri_opener.c * src/uri_opener.h * src/vcard.c * src/vcard.h * src/wizard.c * src/wizard.h * src/common/base64.c * src/common/base64.h * src/common/claws.c * src/common/claws.h * src/common/defs.h * src/common/fnmatch.c * src/common/fnmatch.h * src/common/fnmatch_loop.c * src/common/hooks.c * src/common/hooks.h * src/common/log.c * src/common/log.h * src/common/md5.c * src/common/md5.h * src/common/mgutils.c * src/common/mgutils.h * src/common/nntp.c * src/common/nntp.h * src/common/passcrypt.c * src/common/passcrypt.h.in * src/common/plugin.c * src/common/plugin.h * src/common/prefs.c * src/common/prefs.h * src/common/progressindicator.c * src/common/progressindicator.h * src/common/quoted-printable.c * src/common/quoted-printable.h * src/common/session.c * src/common/session.h * src/common/smtp.c * src/common/smtp.h * src/common/socket.c * src/common/socket.h * src/common/ssl.c * src/common/ssl.h * src/common/ssl_certificate.c * src/common/ssl_certificate.h * src/common/string_match.c * src/common/string_match.h * src/common/stringtable.c * src/common/stringtable.h * src/common/tags.c * src/common/tags.h * src/common/template.c * src/common/template.h * src/common/timing.h * src/common/utils.c * src/common/utils.h * src/common/uuencode.c * src/common/uuencode.h * src/common/version.h.in * src/common/w32_dirent.c * src/common/w32_reg.c * src/common/w32_signal.c * src/common/w32_stat.c * src/common/w32_stdlib.c * src/common/w32_string.c * src/common/w32_time.c * src/common/w32_unistd.c * src/common/w32_wait.c * src/common/w32lib.h * src/common/xml.c * src/common/xml.h * src/common/xmlprops.c * src/common/xmlprops.h * src/etpan/etpan-errors.h * src/etpan/etpan-thread-manager-types.h * src/etpan/etpan-thread-manager.c * src/etpan/etpan-thread-manager.h * src/etpan/imap-thread.c * src/etpan/imap-thread.h * src/gtk/about.c * src/gtk/about.h * src/gtk/colorlabel.c * src/gtk/colorlabel.h * src/gtk/colorsel.c * src/gtk/colorsel.h * src/gtk/combobox.c * src/gtk/combobox.h * src/gtk/description_window.c * src/gtk/description_window.h * src/gtk/filesel.c * src/gtk/filesel.h * src/gtk/foldersort.c * src/gtk/foldersort.h * src/gtk/gtkaspell.c * src/gtk/gtkaspell.h * src/gtk/gtksctree.c * src/gtk/gtkshruler.c * src/gtk/gtkshruler.h * src/gtk/gtksourceprintjob.c * src/gtk/gtksourceprintjob.h * src/gtk/gtkutils.c * src/gtk/gtkutils.h * src/gtk/gtkvscrollbutton.c * src/gtk/gtkvscrollbutton.h * src/gtk/icon_legend.c * src/gtk/icon_legend.h * src/gtk/inputdialog.c * src/gtk/inputdialog.h * src/gtk/logwindow.c * src/gtk/logwindow.h * src/gtk/manage_window.c * src/gtk/manage_window.h * src/gtk/menu.c * src/gtk/menu.h * src/gtk/pluginwindow.c * src/gtk/pluginwindow.h * src/gtk/prefswindow.c * src/gtk/prefswindow.h * src/gtk/progressdialog.c * src/gtk/progressdialog.h * src/gtk/quicksearch.c * src/gtk/quicksearch.h * src/gtk/sslcertwindow.c * src/gtk/sslcertwindow.h * src/plugins/bogofilter/bogofilter.c * src/plugins/bogofilter/bogofilter.h * src/plugins/bogofilter/bogofilter_gtk.c * src/plugins/clamav/clamav_plugin.c * src/plugins/clamav/clamav_plugin.h * src/plugins/clamav/clamav_plugin_gtk.c * src/plugins/demo/demo.c * src/plugins/dillo_viewer/dillo_prefs.c * src/plugins/dillo_viewer/dillo_prefs.h * src/plugins/dillo_viewer/dillo_viewer.c * src/plugins/pgpcore/passphrase.c * src/plugins/pgpcore/passphrase.h * src/plugins/pgpcore/pgp_viewer.c * src/plugins/pgpcore/pgp_viewer.h * src/plugins/pgpcore/plugin.c * src/plugins/pgpcore/prefs_gpg.c * src/plugins/pgpcore/prefs_gpg.h * src/plugins/pgpcore/select-keys.c * src/plugins/pgpcore/select-keys.h * src/plugins/pgpcore/sgpgme.c * src/plugins/pgpcore/sgpgme.h * src/plugins/pgpinline/pgpinline.c * src/plugins/pgpinline/pgpinline.h * src/plugins/pgpinline/plugin.c * src/plugins/pgpmime/pgpmime.c * src/plugins/pgpmime/pgpmime.h * src/plugins/pgpmime/plugin.c * src/plugins/spamassassin/spamassassin.c * src/plugins/spamassassin/spamassassin.h * src/plugins/spamassassin/spamassassin_gtk.c * src/plugins/trayicon/trayicon.c * src/plugins/trayicon/trayicon_prefs.c * src/plugins/trayicon/trayicon_prefs.h * src/plugins/trayicon/libeggtrayicon/eggtrayicon.c * src/plugins/trayicon/libeggtrayicon/eggtrayicon.h * src/plugins/trayicon/libeggtrayicon/gtk2-funcs.h * src/plugins/trayicon/libeggtrayicon/gtkplugxembed.c * src/plugins/trayicon/libeggtrayicon/gtkplugxembed.h * tools/OOo2claws-mail.pl * tools/README.sylprint * tools/acroread2claws-mail.pl * tools/claws-mail-compose-insert-files.pl * tools/convert_mbox.pl * tools/filter_conv.pl * tools/filter_conv_new.pl * tools/fix_date.sh * tools/freshmeat_search.pl * tools/google_search.pl * tools/kmail-mailbox2claws-mail.pl * tools/kmail2claws-mail.pl * tools/kmail2claws-mail_v2.pl * tools/mairix.sh * tools/make.themes.project * tools/multiwebsearch.pl * tools/nautilus2claws-mail.sh * tools/outlook2claws-mail.pl * tools/textviewer.sh * tools/thunderbird-filters-convertor.pl * tools/update-po * tools/uuooffice * tools/vcard2xml.py * tools/kdeservicemenu/claws-mail-kdeservicemenu.pl Upgrade to GPLv3 or later.
518 lines
14 KiB
Perl
518 lines
14 KiB
Perl
#!/usr/bin/perl -w
|
|
|
|
use strict;
|
|
use Getopt::Long;
|
|
use URI::Escape;
|
|
|
|
# * This file is free software; you can redistribute it and/or modify it
|
|
# * under the terms of the GNU General Public License as published by
|
|
# * the Free Software Foundation; either version 3 of the License, or
|
|
# * (at your option) any later version.
|
|
# *
|
|
# * This program is distributed in the hope that it will be useful, but
|
|
# * WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
# * General Public License for more details.
|
|
# *
|
|
# * You should have received a copy of the GNU General Public License
|
|
# * along with this program; if not, write to the Free Software
|
|
# * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
# *
|
|
# * Copyright 2007 Paul Mangan <paul@claws-mail.org>
|
|
# *
|
|
|
|
#
|
|
# Convert Thunderbird filtering rules to Claws Mail filtering rules
|
|
#
|
|
|
|
#
|
|
# TABLE OF EQUIVALENTS
|
|
#
|
|
# thunderbird : Claws Mail
|
|
#------------------------------------------------------
|
|
#
|
|
# name="NAME" : rulename "NAME"
|
|
#
|
|
# enabled="yes" : enabled / disabled
|
|
#
|
|
# CONDITION LIST
|
|
# --------------
|
|
#
|
|
# OR : |
|
|
# AND : &
|
|
#
|
|
# subject : subject
|
|
# from : from
|
|
# to : to
|
|
# cc : cc
|
|
# to or cc : to_or_cc
|
|
# body : body-part
|
|
# date : ****
|
|
# priority : ****
|
|
# status : ****
|
|
# age in days : age_greater/age_lower
|
|
# size : size_greater/size_smaller
|
|
# [custom header] : header
|
|
#
|
|
# 2nd level conditions
|
|
# --------------------
|
|
#
|
|
# contains : [nothing]
|
|
# doesn't contain : [append with ~]
|
|
# is : regexpcase
|
|
# isn't : regexpcase
|
|
# ends with : regexpcase
|
|
# begins with : regexpcase
|
|
# is in ab : found_in_addressbook
|
|
# isn't in ab : ~found_in_addressbook
|
|
#
|
|
#
|
|
# status 2nd and 3rd level conditions
|
|
# -----------------------------------
|
|
#
|
|
# [is|isn't] replied
|
|
# [is|isn't] read
|
|
# [is|isn't] new
|
|
# [is|isn't] forwarded
|
|
# [is|isn't] flagged
|
|
#
|
|
#
|
|
# Date header 2nd level condition
|
|
# --------------------------------
|
|
#
|
|
# is
|
|
# isn't
|
|
# is before
|
|
# is after
|
|
#
|
|
#
|
|
# Priority header 2nd and 3rd level conditions
|
|
# --------------------------------------------
|
|
# is [Lowest|Low|Normal|High|Highest]
|
|
# is higher than [Lowest|Low|Normal|High|Highest]
|
|
# is lower than [Lowest|Low|Normal|High|Highest]
|
|
#
|
|
#
|
|
# ACTION LIST
|
|
# -----------
|
|
#
|
|
# Move to folder : move
|
|
# Copy to folder : copy
|
|
# Forward : ****
|
|
# Reply : ****
|
|
# Mark read : mark_as_read
|
|
# Mark flagged : mark
|
|
# Label : ****
|
|
# Change priority : ****
|
|
# JunkScore 100 [mark as spam] : ****
|
|
# JunkScore 0 [mark as ham] : ****
|
|
# Delete : delete
|
|
# Delete from Pop3 server : delete
|
|
# Fetch body from Pop3Server : ****
|
|
#
|
|
|
|
my $script = "thunderbird-filters-convertor.pl";
|
|
my ($tbirdfile, $account, $mailbox, $iNeedHelp) = 0;
|
|
|
|
GetOptions("tbird-file=s" => \$tbirdfile,
|
|
"account-name=s" => \$account,
|
|
"mailbox-name=s" => \$mailbox,
|
|
"help|h" => \$iNeedHelp);
|
|
|
|
if ($iNeedHelp) {
|
|
help_me();
|
|
}
|
|
|
|
if (!$tbirdfile) {
|
|
print "ERROR: No filename given\n";
|
|
print "Use $script -h for help\n";
|
|
exit;
|
|
}
|
|
|
|
unless (-e $tbirdfile) {
|
|
print "ERROR: $tbirdfile NOT FOUND!!\n";
|
|
exit;
|
|
}
|
|
|
|
if (!$mailbox) {
|
|
print "ERROR: No mailbox name given\n";
|
|
print "Use $script -h for help\n";
|
|
exit;
|
|
}
|
|
|
|
my $config_dir = `claws-mail --config-dir` or die("ERROR:
|
|
You don't appear to have Claws Mail installed\n");
|
|
chomp $config_dir;
|
|
|
|
chdir($ENV{HOME} . "/$config_dir") or die("ERROR:
|
|
Claws Mail config directory not found [~/$config_dir]
|
|
You need to run Claws Mail once, quit it, and then re-run this script\n");
|
|
|
|
my $acrc = "accountrc";
|
|
my $acc_number;
|
|
|
|
if ($account) {
|
|
$acc_number = find_account_number();
|
|
}
|
|
if ($account && !$acc_number) {
|
|
print "ERROR: Account '$account' NOT FOUND!\n";
|
|
exit;
|
|
}
|
|
|
|
my @claws_filters = ();
|
|
|
|
## check if matcherrc already exists
|
|
if (-e "matcherrc") {
|
|
print "matcherrc exists!\n";
|
|
read_current_filters();
|
|
} else {
|
|
push(@claws_filters, "[preglobal]\n\n[postglobal]\n\n[filtering]\n")
|
|
}
|
|
##
|
|
my ($rule_count,@thunderbird_filters) = read_thunderbird_filters();
|
|
|
|
my ($conv_rule,$ignored_rule,$ignore_list) = convert_filters($rule_count,@thunderbird_filters);
|
|
|
|
if (@claws_filters) {
|
|
system("mv matcherrc matcherrc-safecopy");
|
|
print "Moved ". $ENV{HOME}. "/$config_dir/matcherrc to "
|
|
. $ENV{HOME}. "/$config_dir/matcherrc-safecopy\n";
|
|
}
|
|
# write new config
|
|
open(MATCHERRC, ">>matcherrc");
|
|
print MATCHERRC @claws_filters;
|
|
close(MATCHERRC);
|
|
|
|
print "We're done!\n";
|
|
print "-------------\n";
|
|
print "Converted $conv_rule rules";
|
|
if (defined($ignored_rule)) {
|
|
print ", ignored $ignored_rule rules";
|
|
}
|
|
print "\n-------------\n";
|
|
print "$ignore_list";
|
|
|
|
exit;
|
|
|
|
sub help_me {
|
|
print<<'EOH';
|
|
Usage:
|
|
thunderbird-filters-convertor.pl [options]
|
|
Options:
|
|
--help -h Show this screen.
|
|
--tbird-file=PATH TO FILE The full path to the file to be converted
|
|
--mailbox-name=NAME The name of the Claws Mail mailbox
|
|
--account-name=NAME The name of the account to be used (optional)
|
|
EOH
|
|
exit;
|
|
}
|
|
|
|
sub find_account_number {
|
|
my $cur_acc_numb;
|
|
my $cur_acc_name;
|
|
|
|
open (ACCOUNTRC, "<$acrc") ||
|
|
die("Can't open the Accounts file [$acrc]\n");
|
|
my @acrclines = <ACCOUNTRC>;
|
|
close ACCOUNTRC;
|
|
|
|
foreach my $line (@acrclines) {
|
|
unless ($line =~ m/^\[Account/ ||
|
|
$line =~ m/^account_name/) { next; }
|
|
chomp($line);
|
|
|
|
if ($line =~ s/^\[Account: //) {
|
|
$line =~ s/]$//;
|
|
$cur_acc_numb = $line;
|
|
}
|
|
if ($line =~ s/^account_name=//) {
|
|
$cur_acc_name = $line;
|
|
}
|
|
if (defined($cur_acc_name) && $cur_acc_name eq $account) {
|
|
return($cur_acc_numb);
|
|
}
|
|
}
|
|
}
|
|
|
|
sub read_current_filters {
|
|
print "Reading current filters\n";
|
|
|
|
open (CFILTERS, "<matcherrc") ||
|
|
die("Can't open " . $ENV{HOME} . "/$config_dir/matcherrc");
|
|
@claws_filters = <CFILTERS>;
|
|
close CFILTERS;
|
|
|
|
remove_last_empty_lines();
|
|
}
|
|
|
|
sub remove_last_empty_lines {
|
|
my $line = pop(@claws_filters);
|
|
if ($line =~ m/^$/) {
|
|
remove_last_empty_lines();
|
|
} else {
|
|
push(@claws_filters, $line);
|
|
}
|
|
}
|
|
|
|
sub read_thunderbird_filters {
|
|
my @outer_array = ();
|
|
my @inner_array = ();
|
|
my $count = 0;
|
|
|
|
open (TBIRDFILE, "<$tbirdfile") ||
|
|
die("Can't open the tbird file [$tbirdfile]\n");
|
|
my @tbirdlines = <TBIRDFILE>;
|
|
close TBIRDFILE;
|
|
|
|
foreach my $line (@tbirdlines) {
|
|
if ($line =~ m/^version/ || $line =~ m/^logging/) { next; }
|
|
|
|
chomp($line);
|
|
|
|
push(@inner_array, "$line") unless $line eq "";
|
|
if ($line =~ m/^condition/) {
|
|
push(@outer_array, [@inner_array]);
|
|
@inner_array = ();
|
|
$count++;
|
|
}
|
|
}
|
|
return($count-1,@outer_array);
|
|
}
|
|
|
|
sub convert_filters {
|
|
my ($rule_count,@thunderbird_filters) = @_;
|
|
|
|
my $tbird_action_no_value = qr/^(?:"Mark read"|"Mark flagged"|"Delete"|"Delete from Pop3 server"|"Fetch body from Pop3Server")$/;
|
|
my $tbird_action_ignore = qr/^(?:"Label"|"Change priority"|"JunkScore"|"Fetch body from Pop3Server"|"Delete from Pop3 server"|"Reply")$/;
|
|
my $exact_matches = qr/^(?:subject|from|to|cc)$/;
|
|
my $ignore_matches = qr/^(?:date|priority|status)$/;
|
|
|
|
my $conv_rules = my $ignored_rules = 0;
|
|
my $ignored_list = "";
|
|
for (my $outerloop = 0; $outerloop <= $rule_count; $outerloop++) {
|
|
my $part_one = my $part_two = my $part_three = my $part_four = "";
|
|
my $ignore_rule = my $move_rule = my $copy_rule = my $cond_count = 0;
|
|
my %ignore_hash;
|
|
my $bool = my $claws_condition = my $cur_name = "";
|
|
for (my $innerloop = 0; exists($thunderbird_filters[$outerloop][$innerloop]); $innerloop++) {
|
|
my $entry = $thunderbird_filters[$outerloop][$innerloop];
|
|
if ($entry =~ s/^name=//) {
|
|
$cur_name = $entry;
|
|
$part_one = "rulename $entry ";
|
|
} elsif ($entry =~ s/^enabled=//) {
|
|
if ($entry eq "\"yes\"") {
|
|
$part_one = "enabled $part_one";
|
|
} else {
|
|
$part_one = "disabled $part_one";
|
|
}
|
|
if (defined($acc_number)) {
|
|
$part_one .= "account $acc_number ";
|
|
}
|
|
} elsif ($entry =~ s/^type=//) {
|
|
# do nothing : what does 'type' mean??
|
|
} elsif ($entry =~ s/^action=//) {
|
|
if ($entry =~ m/$tbird_action_ignore/ && !$ignore_rule) {
|
|
$ignore_rule = 1;
|
|
unless ($ignore_hash{$cur_name}) {
|
|
$ignored_list .= "Ignored $cur_name because it contains $entry\n";
|
|
$ignored_rules++;
|
|
}
|
|
$ignore_hash{$cur_name}++;
|
|
$part_one = "";
|
|
next;
|
|
} elsif ($entry =~ m/Move to folder/) {
|
|
$part_four = "move ";
|
|
$move_rule = 1;
|
|
} elsif ($entry =~ m/Copy to folder/) {
|
|
$part_three .= "copy";
|
|
$copy_rule = 1;
|
|
} elsif ($entry =~ m/Mark read/) {
|
|
$part_three .= "mark_as_read ";
|
|
} elsif ($entry =~ m/Mark flagged/) {
|
|
$part_three .= "mark";
|
|
} elsif ($entry =~ m/Delete/) {
|
|
$part_three .= "delete";
|
|
}
|
|
} elsif ($entry =~ s/^actionValue=//) {
|
|
if ($ignore_rule) {
|
|
$ignore_rule = 0;
|
|
next;
|
|
} elsif ($move_rule) {
|
|
$entry = rewrite_mailbox_name($entry);
|
|
$part_four .= uri_unescape($entry);
|
|
$move_rule = 0;
|
|
} elsif ($copy_rule) {
|
|
$entry = rewrite_mailbox_name($entry);
|
|
$part_three .= " " . uri_unescape($entry);
|
|
$copy_rule = 0;
|
|
}
|
|
} elsif ($entry =~ s/^condition=//) {
|
|
if ($entry =~ s/^\"AND//) {
|
|
$bool= "&";
|
|
} elsif ($entry =~ s/^\"OR//) {
|
|
$bool = "|";
|
|
}
|
|
my @tbird_conditions = split(/ \(/, $entry);
|
|
foreach my $cond (@tbird_conditions) {
|
|
my $exact = my $endswith = my $beginswith = my $addrbook = 0;
|
|
my $age_condition = my $size_condition = my $exact_age = 0;
|
|
$cond =~ s/\) OR$//;
|
|
$cond =~ s/\) AND$//;
|
|
$cond =~ s/\)"$//;
|
|
my ($cpart_one, $cpart_two, $cpart_thr) = split(/,/, $cond, 3);
|
|
if ($cond) {
|
|
if ($cpart_one =~ m/$exact_matches/) {
|
|
$claws_condition .= "$cpart_one";
|
|
} elsif ($cpart_one eq "to or cc") {
|
|
$claws_condition .= "to_or_cc";
|
|
} elsif ($cpart_one eq "body") {
|
|
$claws_condition .= "body-part";
|
|
} elsif ($cpart_one eq "age in days") {
|
|
$age_condition = 1;
|
|
} elsif ($cpart_one eq "size") {
|
|
$size_condition = 1;
|
|
} elsif ($cpart_one =~ m/$ignore_matches/) {
|
|
$part_one = $claws_condition = $part_three = $part_four = "";
|
|
next;
|
|
} else {
|
|
$claws_condition = "head";
|
|
}
|
|
|
|
if ($cpart_two eq "doesn't contain") {
|
|
$claws_condition = "~$claws_condition matchcase";
|
|
} elsif ($cpart_two eq "contains") {
|
|
$claws_condition = "$claws_condition matchcase";
|
|
} elsif ($cpart_two eq "isn't") {
|
|
$exact = 1;
|
|
$claws_condition = "~$claws_condition regexpcase";
|
|
} elsif ($cpart_two eq "is") {
|
|
if ($size_condition) {
|
|
$claws_condition .= "size_equal";
|
|
} elsif ($age_condition) {
|
|
if ($bool ne "&") {
|
|
$part_one = $claws_condition = $part_three = $part_four = "";
|
|
if (!$ignored_list) {
|
|
$ignored_list .= "Ignored $cur_name because it matches an exact age and is an OR match\n";
|
|
}
|
|
next;
|
|
} else {
|
|
$ignored_rules--;
|
|
$exact_age = 1;
|
|
}
|
|
} else {
|
|
$exact = 1;
|
|
$claws_condition = "$claws_condition regexpcase";
|
|
}
|
|
} elsif ($cpart_two eq "ends with") {
|
|
$endswith = 1;
|
|
$claws_condition = "$claws_condition regexpcase";
|
|
} elsif ($cpart_two eq "begins with") {
|
|
$beginswith = 1;
|
|
$claws_condition = "$claws_condition regexpcase";
|
|
} elsif ($cpart_two eq "is in ab") {
|
|
$addrbook = 1;
|
|
$claws_condition = "found_in_addressbook \"$claws_condition\" in \"Any\" ";
|
|
} elsif ($cpart_two eq "isn't in ab") {
|
|
$addrbook = 1;
|
|
$claws_condition = "~found_in_addressbook \"$claws_condition\" in \"Any\" ";
|
|
} elsif ($cpart_two eq "is greater than") {
|
|
if ($size_condition) {
|
|
$claws_condition .= "size_greater";
|
|
}
|
|
if ($age_condition) {
|
|
$claws_condition .= "age_greater";
|
|
}
|
|
} elsif ($cpart_two eq "is less than") {
|
|
if ($size_condition) {
|
|
$claws_condition .= "size_smaller";
|
|
}
|
|
if ($age_condition) {
|
|
$claws_condition .= "age_lower";
|
|
}
|
|
}
|
|
|
|
if ($exact || $beginswith || $endswith) {
|
|
$cpart_thr = escape_regex($cpart_thr);
|
|
}
|
|
if ($exact) {
|
|
$cpart_thr = "^$cpart_thr\$";
|
|
} elsif ($beginswith) {
|
|
$cpart_thr = "^$cpart_thr";
|
|
} elsif ($endswith) {
|
|
$cpart_thr = "$cpart_thr\$";
|
|
}
|
|
unless ($addrbook) {
|
|
if ($exact_age) {
|
|
my $lower_limit = $cpart_thr-1;
|
|
my $upper_limit = $cpart_thr+1;
|
|
$lower_limit =~ s/^\"//;
|
|
$lower_limit =~ s/\"$//;
|
|
$upper_limit =~ s/^\"//;
|
|
$upper_limit =~ s/\"$//;
|
|
$claws_condition = "$claws_condition"."age_lower"
|
|
. " $upper_limit $bool "
|
|
. "age_greater $lower_limit ";
|
|
} elsif ($size_condition || $age_condition) {
|
|
$claws_condition = "$claws_condition $cpart_thr ";
|
|
} else {
|
|
$claws_condition = "$claws_condition \"$cpart_thr\" ";
|
|
}
|
|
}
|
|
|
|
if ($tbird_conditions[1] && $cond_count < $#tbird_conditions) {
|
|
$claws_condition = "$claws_condition$bool ";
|
|
}
|
|
}
|
|
$cond_count++;
|
|
}
|
|
if ($part_one) {
|
|
$conv_rules++;
|
|
push(@claws_filters, "$part_one$claws_condition$part_three$part_four\n");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
push(@claws_filters, "\n");
|
|
return($conv_rules,$ignored_rules,$ignored_list);
|
|
}
|
|
|
|
sub rewrite_mailbox_name {
|
|
my ($path) = @_;
|
|
|
|
my $new_path;
|
|
|
|
my ($front,$back) = split(/\/\//, $path, 2);
|
|
|
|
if ($front =~ m/^"mailbox/) {
|
|
$new_path = "\"#mh/$mailbox/";
|
|
} else {
|
|
$new_path = "\"#imap/$mailbox/";
|
|
}
|
|
|
|
my ($box,$name) = split(/\//, $back, 2);
|
|
|
|
if ($new_path =~ m/^"#mh/) {
|
|
$name =~ s/^Inbox/inbox/;
|
|
$name =~ s/^Sent/sent/;
|
|
$name =~ s/^Drafts/draft/;
|
|
$name =~ s/^Trash/trash/;
|
|
}
|
|
$new_path = $new_path.$name;
|
|
|
|
return($new_path);
|
|
}
|
|
|
|
sub escape_regex {
|
|
my ($string) = @_;
|
|
|
|
my $escstr = "";
|
|
my $symbols = qr/^(?:\[|\]|\{|\}|\(|\)|\||\+|\*|\.|\-|\$|\^)$/;
|
|
my @chars = split(//, $string);
|
|
|
|
foreach my $char (@chars) {
|
|
if ($char =~ m/$symbols/) { $char = "\\\\$char"; }
|
|
$escstr .= $char;
|
|
}
|
|
|
|
return($escstr);
|
|
}
|