]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox.pm
precheck: stricter checks including min length
[public-inbox.git] / lib / PublicInbox.pm
index b05fd8c5607853af1050054162818b6ecbdd4706..cfa9d4bf9d9ca6dd8baf06eaf918fbb3a379e150 100644 (file)
@@ -4,6 +4,7 @@ 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
@@ -17,13 +18,25 @@ sub __drop_plus {
 sub precheck {
        my ($klass, $filter, $recipient) = @_;
        my $simple = $filter->simple;
-       return 0 unless $simple->header("Message-ID");
-       return 0 unless defined($filter->from);
-       return 0 unless $simple->header("Subject");
+       my $mid = $simple->header("Message-ID");
+       return 0 unless usable_str(length('<m@h>'), $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