about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2014-02-11 00:36:06 +0000
committerEric Wong <normalperson@yhbt.net>2014-02-11 00:36:06 +0000
commit858f0a2960123d6d2cbced1bb18e4e5e524df21e (patch)
treefae844af890e158f116f6369935cdecf4812fe41
parentb5b6e0f45c5ee171d71b549146432a68d6707531 (diff)
downloadpublic-inbox-858f0a2960123d6d2cbced1bb18e4e5e524df21e.tar.gz
move pre-spamc checks to PublicInbox->precheck
We may add more checks before we go to spamc.
-rw-r--r--lib/PublicInbox.pm10
-rwxr-xr-xpublic-inbox-mda6
-rw-r--r--t/precheck.t (renamed from t/recipient.t)23
3 files changed, 29 insertions, 10 deletions
diff --git a/lib/PublicInbox.pm b/lib/PublicInbox.pm
index b51c000f..899027be 100644
--- a/lib/PublicInbox.pm
+++ b/lib/PublicInbox.pm
@@ -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);
diff --git a/public-inbox-mda b/public-inbox-mda
index 62d5b7fc..291b5574 100755
--- a/public-inbox-mda
+++ b/public-inbox-mda
@@ -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;
diff --git a/t/recipient.t b/t/precheck.t
index 9cb1969e..6deead98 100644
--- a/t/recipient.t
+++ b/t/precheck.t
@@ -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();