From 4024aae69fe08c0aa14a69a12d55ca2b7dd4a4ab Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 19 Apr 2014 23:11:00 +0000 Subject: move precheck to MDA namespace We will be combining common code between -learn and -mda --- MANIFEST | 2 +- lib/PublicInbox.pm | 56 -------------------------------------------------- lib/PublicInbox/MDA.pm | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++ public-inbox-mda | 4 ++-- t/precheck.t | 13 ++++++------ 5 files changed, 66 insertions(+), 65 deletions(-) delete mode 100644 lib/PublicInbox.pm create mode 100644 lib/PublicInbox/MDA.pm diff --git a/MANIFEST b/MANIFEST index 3dba6942..893cf3fd 100644 --- a/MANIFEST +++ b/MANIFEST @@ -6,7 +6,7 @@ MANIFEST Makefile.PL README examples/public-inbox-config -lib/PublicInbox.pm +lib/PublicInbox/MDA.pm lib/PublicInbox/Config.pm lib/PublicInbox/Feed.pm lib/PublicInbox/Filter.pm diff --git a/lib/PublicInbox.pm b/lib/PublicInbox.pm deleted file mode 100644 index cfa9d4bf..00000000 --- a/lib/PublicInbox.pm +++ /dev/null @@ -1,56 +0,0 @@ -# Copyright (C) 2013, Eric Wong and all contributors -# License: AGPLv3 or later (https://www.gnu.org/licenses/agpl-3.0.txt) -package PublicInbox; -use strict; -use warnings; -use Email::Address; -use Date::Parse qw(strptime); -use constant MAX_SIZE => 1024 * 500; # same as spamc default - -# drop plus addressing for matching -sub __drop_plus { - my ($str_addr) = @_; - $str_addr =~ s/\+.*\@/\@/; - $str_addr; -} - -# do not allow Bcc, only Cc and To if recipient is set -sub precheck { - my ($klass, $filter, $recipient) = @_; - my $simple = $filter->simple; - my $mid = $simple->header("Message-ID"); - return 0 unless usable_str(length(''), $mid) && $mid =~ /\@/; - return 0 unless usable_str(length('u@h'), $filter->from); - return 0 unless usable_str(length(':o'), $simple->header("Subject")); - return 0 unless usable_date($simple->header("Date")); - return 0 if length($simple->as_string) > MAX_SIZE; - recipient_specified($filter, $recipient); -} - -sub usable_str { - my ($len, $str) = @_; - defined($str) && length($str) >= $len; -} - -sub usable_date { - my @t = eval { strptime(@_) }; - scalar @t; -} - -sub recipient_specified { - my ($filter, $recipient) = @_; - defined($recipient) or return 1; # for mass imports - my @recip = Email::Address->parse($recipient); - my $oaddr = __drop_plus($recip[0]->address); - $oaddr = qr/\b\Q$oaddr\E\b/i; - my @to = Email::Address->parse($filter->to); - my @cc = Email::Address->parse($filter->cc); - foreach my $addr (@to, @cc) { - if (__drop_plus($addr->address) =~ $oaddr) { - return 1; - } - } - return 0; -} - -1; diff --git a/lib/PublicInbox/MDA.pm b/lib/PublicInbox/MDA.pm new file mode 100644 index 00000000..22879236 --- /dev/null +++ b/lib/PublicInbox/MDA.pm @@ -0,0 +1,56 @@ +# Copyright (C) 2013, Eric Wong and all contributors +# License: AGPLv3 or later (https://www.gnu.org/licenses/agpl-3.0.txt) +package PublicInbox::MDA; +use strict; +use warnings; +use Email::Address; +use Date::Parse qw(strptime); +use constant MAX_SIZE => 1024 * 500; # same as spamc default + +# drop plus addressing for matching +sub __drop_plus { + my ($str_addr) = @_; + $str_addr =~ s/\+.*\@/\@/; + $str_addr; +} + +# do not allow Bcc, only Cc and To if recipient is set +sub precheck { + my ($klass, $filter, $recipient) = @_; + my $simple = $filter->simple; + my $mid = $simple->header("Message-ID"); + return 0 unless usable_str(length(''), $mid) && $mid =~ /\@/; + return 0 unless usable_str(length('u@h'), $filter->from); + return 0 unless usable_str(length(':o'), $simple->header("Subject")); + return 0 unless usable_date($simple->header("Date")); + return 0 if length($simple->as_string) > MAX_SIZE; + recipient_specified($filter, $recipient); +} + +sub usable_str { + my ($len, $str) = @_; + defined($str) && length($str) >= $len; +} + +sub usable_date { + my @t = eval { strptime(@_) }; + scalar @t; +} + +sub recipient_specified { + my ($filter, $recipient) = @_; + defined($recipient) or return 1; # for mass imports + my @recip = Email::Address->parse($recipient); + my $oaddr = __drop_plus($recip[0]->address); + $oaddr = qr/\b\Q$oaddr\E\b/i; + my @to = Email::Address->parse($filter->to); + my @cc = Email::Address->parse($filter->cc); + foreach my $addr (@to, @cc) { + if (__drop_plus($addr->address) =~ $oaddr) { + return 1; + } + } + return 0; +} + +1; diff --git a/public-inbox-mda b/public-inbox-mda index 1f4d339f..dd3dac80 100755 --- a/public-inbox-mda +++ b/public-inbox-mda @@ -12,7 +12,7 @@ use Encode::MIME::Header; use File::Path::Expand qw/expand_filename/; use IPC::Run qw(run); use constant MDA => 'ssoma-mda'; -use PublicInbox; +use PublicInbox::MDA; use PublicInbox::Filter; use PublicInbox::Config; @@ -33,7 +33,7 @@ defined $dst or exit(1); my $main_repo = $dst->{mainrepo} or exit(1); my $filtered; # string dest -if (PublicInbox->precheck($filter, $recipient) && +if (PublicInbox::MDA->precheck($filter, $recipient) && do_spamc($filter->simple, \$filtered)) { # update our message with SA headers (in case our filter rejects it) my $simple = Email::Simple->new($filtered); diff --git a/t/precheck.t b/t/precheck.t index acfd5e8b..42592bc2 100644 --- a/t/precheck.t +++ b/t/precheck.t @@ -5,26 +5,26 @@ use warnings; use Test::More; use Email::Simple; use Email::Filter; -use PublicInbox; +use PublicInbox::MDA; sub do_checks { my ($s) = @_; my $f = Email::Filter->new(data => $s->as_string); - ok(PublicInbox->precheck($f, undef), + ok(PublicInbox::MDA->precheck($f, undef), "RECIPIENT unset is OK"); my $recipient = 'foo@example.com'; - ok(!PublicInbox->precheck($f, $recipient), + ok(!PublicInbox::MDA->precheck($f, $recipient), "wrong RECIPIENT rejected"); $recipient = 'b@example.com'; - ok(PublicInbox->precheck($f, $recipient), + ok(PublicInbox::MDA->precheck($f, $recipient), "RECIPIENT in To: is OK"); $recipient = 'c@example.com'; - ok(PublicInbox->precheck($f, $recipient), + ok(PublicInbox::MDA->precheck($f, $recipient), "RECIPIENT in Cc: is OK"); } @@ -72,7 +72,8 @@ sub do_checks { body => "hello world\n", ); my $f = Email::Filter->new(data => $s->as_string); - ok(!PublicInbox->precheck($f, $recipient), "missing From: is rejected"); + ok(!PublicInbox::MDA->precheck($f, $recipient), + "missing From: is rejected"); } done_testing(); -- cgit v1.2.3-24-ge0c7