X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=script%2Fpublic-inbox-mda;h=766d58a6f4c22cd97ca91a9fda6dc7bd421d8bca;hb=f826a7830bce67c0f8c653baf97f7769bb2c57d9;hp=26b70cfb6cfc8f2fc7d4631b829648e0e34d068f;hpb=aad496f4336e6a7b60312b0eef1a88b9527322bb;p=public-inbox.git diff --git a/script/public-inbox-mda b/script/public-inbox-mda index 26b70cfb..766d58a6 100755 --- a/script/public-inbox-mda +++ b/script/public-inbox-mda @@ -1,6 +1,6 @@ #!/usr/bin/perl -w -# Copyright (C) 2013-2015 all contributors -# License: AGPLv3 or later (https://www.gnu.org/licenses/agpl-3.0.txt) +# Copyright (C) 2013-2018 all contributors +# License: AGPL-3.0+ # # Mail delivery agent for public-inbox, run from your MTA upon mail delivery use strict; @@ -15,16 +15,14 @@ sub do_exit { } use Email::Simple; -use Email::MIME; -use Email::MIME::ContentType; -$Email::MIME::ContentType::STRICT_PARAMS = 0; # user input is imperfect +use PublicInbox::MIME; use PublicInbox::MDA; use PublicInbox::Config; use PublicInbox::Import; use PublicInbox::Git; use PublicInbox::Emergency; use PublicInbox::Filter::Base; -use PublicInbox::Spawn qw(popen_rd); +use PublicInbox::Spamcheck::Spamc; # n.b: hopefully we can setup the emergency path without bailing due to # user error, we really want to setup the emergency destination ASAP @@ -32,6 +30,7 @@ use PublicInbox::Spawn qw(popen_rd); my $emergency = $ENV{PI_EMERGENCY} || "$ENV{HOME}/.public-inbox/emergency/"; $ems = PublicInbox::Emergency->new($emergency); my $str = eval { local $/; }; +$str =~ s/\A[\r\n]*From [^\r\n]*\r?\n//s; $ems->prepare(\$str); my $simple = Email::Simple->new(\$str); my $config = PublicInbox::Config->new; @@ -44,14 +43,14 @@ my $main_repo = $dst->{mainrepo} or do_exit(1); # pre-check, MDA has stricter rules than an importer might; do_exit(0) unless PublicInbox::MDA->precheck($simple, $dst->{address}); - +my $spamc = PublicInbox::Spamcheck::Spamc->new; $str = ''; -my $spam_ok = do_spamc($ems->fh, \$str); +my $spam_ok = $spamc->spamcheck($ems->fh, \$str); $simple = undef; $emm = PublicInbox::Emergency->new($emergency); $emm->prepare(\$str); $ems = $ems->abort; -my $mime = Email::MIME->new(\$str); +my $mime = PublicInbox::MIME->new(\$str); $str = ''; do_exit(0) unless $spam_ok; @@ -79,11 +78,19 @@ if (ref($ret) && $ret->isa('Email::MIME')) { # filter altered message } # else { accept PublicInbox::MDA->set_list_headers($mime, $dst); -END { index_sync($main_repo) if $? == 0 }; -my $git = PublicInbox::Git->new($main_repo); -my $im = PublicInbox::Import->new($git, $dst->{name}, $recipient); +my $v = $dst->{version} || 1; +my $im; +if ($v == 2) { + require PublicInbox::V2Writable; + $im = PublicInbox::V2Writable->new($dst); + $im->{parallel} = 0; # pointless to be parallel for a single message +} elsif ($v == 1) { + my $git = $dst->git; + $im = PublicInbox::Import->new($git, $dst->{name}, $recipient, $dst); +} else { + die "Unsupported inbox version: $v\n"; +} if (defined $im->add($mime)) { - $im->done; $emm = $emm->abort; } else { # this message is similar to what ssoma-mda shows: @@ -91,27 +98,6 @@ if (defined $im->add($mime)) { $mime->header_obj->header_raw('Message-ID'), " exists\n"; } -do_exit(0); - -# we depend on "report_safe 0" in /etc/spamassassin/*.cf with --headers -sub do_spamc { - my ($in, $out) = @_; - my $rdr = { 0 => fileno($in) }; - my ($fh, $pid) = popen_rd([qw/spamc -E --headers/], undef, $rdr); - my $r; - do { - $r = sysread($fh, $$out, 65536, length($$out)); - } while (defined($r) && $r != 0); - close $fh or die "close failed: $!\n"; - waitpid($pid, 0); - ($? || $$out eq '') ? 0 : 1; -} - -sub index_sync { - my ($git_dir) = @_; - eval { - require PublicInbox::SearchIdx; - PublicInbox::SearchIdx->new($git_dir, 2)->index_sync; - }; -} +$im->done; +do_exit(0);