]> Sergey Matveev's repositories - public-inbox.git/commitdiff
move pre-spamc checks to PublicInbox->precheck
authorEric Wong <normalperson@yhbt.net>
Tue, 11 Feb 2014 00:36:06 +0000 (00:36 +0000)
committerEric Wong <normalperson@yhbt.net>
Tue, 11 Feb 2014 00:36:06 +0000 (00:36 +0000)
We may add more checks before we go to spamc.

lib/PublicInbox.pm
public-inbox-mda
t/precheck.t [moved from t/recipient.t with 70% similarity]

index b51c000fe06e3008f55a6ebbe1f7eeed7b57428f..899027be36765ece7e2b16a62f7e6d6f919b8b69 100644 (file)
@@ -4,6 +4,7 @@ package PublicInbox;
 use strict;
 use warnings;
 use Email::Address;
+use constant MAX_SIZE => 1024 * 500; # same as spamc default
 
 # drop plus addressing for matching
 sub __drop_plus {
@@ -13,8 +14,15 @@ sub __drop_plus {
 }
 
 # do not allow Bcc, only Cc and To if ORIGINAL_RECIPIENT (postfix) env is set
-sub recipient_specified {
+sub precheck {
        my ($klass, $filter) = @_;
+       return 0 unless defined($filter->from);
+       return 0 if length($filter->simple->as_string) > MAX_SIZE;
+       recipient_specified($filter);
+}
+
+sub recipient_specified {
+       my ($filter) = @_;
        my $or = $ENV{ORIGINAL_RECIPIENT};
        defined($or) or return 1; # for imports
        my @or = Email::Address->parse($or);
index 62d5b7fc9e51064fa97b90752a2710d6ff59a3d2..291b55748a70fdd306eaa713e621d09a3cee2188 100755 (executable)
@@ -11,13 +11,9 @@ my $usage = "public-inbox-mda main_repo fail_repo < rfc2822_message";
 my $filter = Email::Filter->new(emergency => "~/emergency.mbox");
 my $main_repo = shift @ARGV or die "Usage: $usage\n";
 my $fail_repo = shift @ARGV or die "Usage: $usage\n";
-my $max = 1024 * 500; # same as spamc
 
 my $filtered;
-if ($filter->simple->header("From")
-    && length($filter->simple->as_string) <= $max
-    && PublicInbox->recipient_specified($filter)
-    && do_spamc($filter->simple, \$filtered)) {
+if (PublicInbox->precheck($filter) && do_spamc($filter->simple, \$filtered)) {
        # update our message with SA headers (in case our filter rejects it)
        my $simple = Email::Simple->new($filtered);
        $filtered = undef;
similarity index 70%
rename from t/recipient.t
rename to t/precheck.t
index 9cb1969ec28fc60cfde41d18fa1d01200a82a7b9..6deead9843bc194ec7cbb4190b94c77f84fd23ba 100644 (file)
@@ -14,19 +14,19 @@ sub do_checks {
        local %ENV;
        delete $ENV{ORIGINAL_RECIPIENT};
 
-       ok(PublicInbox->recipient_specified($f),
+       ok(PublicInbox->precheck($f),
                "ORIGINAL_RECIPIENT unset is OK");
 
        $ENV{ORIGINAL_RECIPIENT} = 'foo@example.com';
-       ok(!PublicInbox->recipient_specified($f),
+       ok(!PublicInbox->precheck($f),
                "wrong ORIGINAL_RECIPIENT rejected");
 
        $ENV{ORIGINAL_RECIPIENT} = 'b@example.com';
-       ok(PublicInbox->recipient_specified($f),
+       ok(PublicInbox->precheck($f),
                "ORIGINAL_RECIPIENT in To: is OK");
 
        $ENV{ORIGINAL_RECIPIENT} = 'c@example.com';
-       ok(PublicInbox->recipient_specified($f),
+       ok(PublicInbox->precheck($f),
                "ORIGINAL_RECIPIENT in Cc: is OK");
 }
 
@@ -56,4 +56,19 @@ sub do_checks {
        ));
 }
 
+{
+       $ENV{ORIGINAL_RECIPIENT} = 'b@example.com';
+       my $s = Email::Simple->create(
+               header => [
+                       To => 'b@example.com',
+                       Cc => 'c@example.com',
+                       'Content-Type' => 'text/plain',
+                       Subject => 'this is a subject',
+               ],
+               body => "hello world\n",
+       );
+       my $f = Email::Filter->new(data => $s->as_string);
+       ok(!PublicInbox->precheck($f), "missing From: is rejected");
+}
+
 done_testing();