X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FMDA.pm;h=003bac659e6166ef73d29613ac372fc6cb382702;hb=3cda6050b7c8f73e7fd86f88efc5cd42d0c13f73;hp=ee4d0afe9715c27349d737ef034475ee80b93fdc;hpb=e7875ff77b4cd09831574cc4965e3f7012b81b89;p=public-inbox.git diff --git a/lib/PublicInbox/MDA.pm b/lib/PublicInbox/MDA.pm index ee4d0afe..003bac65 100644 --- a/lib/PublicInbox/MDA.pm +++ b/lib/PublicInbox/MDA.pm @@ -1,12 +1,15 @@ -# Copyright (C) 2013, Eric Wong and all contributors +# Copyright (C) 2013-2015 all contributors # License: AGPLv3 or later (https://www.gnu.org/licenses/agpl-3.0.txt) +# +# For the -mda script (mail delivery agent) package PublicInbox::MDA; use strict; use warnings; +use Email::Simple; use Email::Address; -use Encode qw/decode/; use Date::Parse qw(strptime); -use constant MAX_SIZE => 1024 * 500; # same as spamc default +use constant MAX_SIZE => 1024 * 500; # same as spamc default, should be tunable +use constant MAX_MID_SIZE => 244; # max term size - 1 in Xapian use constant cmd => qw/ssoma-mda -1/; # drop plus addressing for matching @@ -19,8 +22,9 @@ sub __drop_plus { # do not allow Bcc, only Cc and To if recipient is set sub precheck { my ($klass, $filter, $address) = @_; - my $simple = $filter->simple; + my Email::Simple $simple = $filter->simple; my $mid = $simple->header("Message-ID"); + return 0 if (length($mid) > MAX_MID_SIZE); 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")); @@ -58,17 +62,18 @@ sub alias_specified { return 0; } -# RFC2919 and RFC2369 sub set_list_headers { my ($class, $simple, $dst) = @_; - my $pa = "<$dst->{-primary_address}>"; - $simple->header_set("List-Id", $pa); - $simple->header_set("List-Post", $pa); + my $pa = $dst->{-primary_address}; - my $url = $dst->{url}; - if (defined $url) { - $simple->header_set("List-Archive", "<$url>"); - $simple->header_set("List-Help", "<${url}help>"); + $simple->header_set("List-Id", "<$pa>"); # RFC2919 + + # remove Delivered-To: prevent training loops + # The rest are taken from Mailman 2.1.15, some may be used for phishing + foreach my $h (qw(delivered-to approved approve x-approved x-approve + urgent return-receipt-to disposition-notification-to + x-confirm-reading-to x-pmrqc)) { + $simple->header_set($h); } } @@ -79,9 +84,7 @@ sub author_info { my $from = $mime->header('From'); my @from = Email::Address->parse($from); my $name = $from[0]->name; - defined $name or $name = ''; my $email = $from[0]->address; - defined $email or $email = ''; ($name, $email, $mime->header('Date')); }