user/dev discussion of public-inbox itself
 help / color / mirror / code / Atom feed
Search results ordered by [date|relevance]  view[summary|nested|Atom feed]
thread overview below | download mbox.gz: |
* [PATCH 11/14] mda: prepare for multiple destinations
  2019-10-28 10:45  7% [PATCH 00/14] learn: sync w/ -mda changes and add manpage Eric Wong
@ 2019-10-28 10:45  6% ` Eric Wong
  0 siblings, 0 replies; 2+ results
From: Eric Wong @ 2019-10-28 10:45 UTC (permalink / raw)
  To: meta

Multiple List-ID headers will be supported in the next commit
---
 script/public-inbox-mda | 92 ++++++++++++++++++++++++-----------------
 1 file changed, 55 insertions(+), 37 deletions(-)

diff --git a/script/public-inbox-mda b/script/public-inbox-mda
index c122984f..821bd9cc 100755
--- a/script/public-inbox-mda
+++ b/script/public-inbox-mda
@@ -37,27 +37,39 @@ my $config = PublicInbox::Config->new;
 my $key = 'publicinboxmda.spamcheck';
 my $default = 'PublicInbox::Spamcheck::Spamc';
 my $spamc = PublicInbox::Spamcheck::get($config, $key, $default);
-my $dst;
+my $dests = [];
 my $recipient = $ENV{ORIGINAL_RECIPIENT};
 if (defined $recipient) {
-	$dst = $config->lookup($recipient); # first check
+	my $ibx = $config->lookup($recipient); # first check
+	push @$dests, $ibx if $ibx;
 }
-if (!defined $dst) {
-	$dst = PublicInbox::MDA->inbox_for_list_id($config, $simple);
-	if (!defined $dst && !defined $recipient) {
+if (!scalar(@$dests)) {
+	my $ibx = PublicInbox::MDA->inbox_for_list_id($config, $simple);
+	if (!defined($ibx) && !defined($recipient)) {
 		die "ORIGINAL_RECIPIENT not defined in ENV\n";
 	}
-	defined $dst or do_exit(67); # EX_NOUSER 5.1.1 user unknown
+	defined($ibx) or do_exit(67); # EX_NOUSER 5.1.1 user unknown
+	push @$dests, $ibx;
 }
 
-$dst = PublicInbox::InboxWritable->new($dst);
-eval { $dst->assert_usable_dir };
-do_exit(67) if $@;
+my $err;
+@$dests = grep {
+	my $ibx = PublicInbox::InboxWritable->new($_);
+	eval { $ibx->assert_usable_dir };
+	if ($@) {
+		warn $@;
+		$err = 1;
+		0;
+	# pre-check, MDA has stricter rules than an importer might;
+	} elsif ($precheck) {
+		!!PublicInbox::MDA->precheck($simple, $ibx->{address});
+	} else {
+		1;
+	}
+} @$dests;
+
+do_exit(67) if $err && scalar(@$dests) == 0;
 
-# pre-check, MDA has stricter rules than an importer might;
-if ($precheck && !PublicInbox::MDA->precheck($simple, $dst->{address})) {
-	do_exit(0);
-}
 $simple = undef;
 my $spam_ok;
 if ($spamc) {
@@ -75,8 +87,6 @@ if ($spamc) {
 }
 do_exit(0) unless $spam_ok;
 
-my $mime = PublicInbox::MIME->new(\$str);
-
 # -mda defaults to the strict base filter which we won't use anywhere else
 sub mda_filter_adjust ($) {
 	my ($ibx) = @_;
@@ -88,30 +98,38 @@ sub mda_filter_adjust ($) {
 	}
 }
 
-mda_filter_adjust($dst);
+my @rejects;
+for my $ibx (@$dests) {
+	mda_filter_adjust($ibx);
+	my $filter = $ibx->filter;
+	my $mime = PublicInbox::MIME->new($str);
+	my $ret = $filter->delivery($mime);
+	if (ref($ret) && $ret->isa('Email::MIME')) { # filter altered message
+		$mime = $ret;
+	} elsif ($ret == PublicInbox::Filter::Base::IGNORE) {
+		next; # nothing, keep looping
+	} elsif ($ret == PublicInbox::Filter::Base::REJECT) {
+		push @rejects, $filter->err;
+		next;
+	}
 
-my $filter = $dst->filter;
-my $ret = $filter->delivery($mime);
-if (ref($ret) && $ret->isa('Email::MIME')) { # filter altered message
-	$mime = $ret;
-} elsif ($ret == PublicInbox::Filter::Base::IGNORE) {
-	do_exit(0); # chuck it to emergency
-} elsif ($ret == PublicInbox::Filter::Base::REJECT) {
-	$! = 65; # EX_DATAERR 5.6.0 data format error
-	die $filter->err, "\n";
-} # else { accept
-$filter = undef;
+	PublicInbox::MDA->set_list_headers($mime, $ibx);
+	my $im = $ibx->importer(0);
+	if (defined $im->add($mime)) {
+		# ->abort is idempotent, no emergency if a single
+		# destination succeeds
+		$emm->abort;
+	} else { # v1-only
+		my $mid = $mime->header_obj->header_raw('Message-ID');
+		# this message is similar to what ssoma-mda shows:
+		print STDERR "CONFLICT: Message-ID: $mid exists\n";
+	}
+	$im->done;
+}
 
-PublicInbox::MDA->set_list_headers($mime, $dst);
-my $im = $dst->importer(0);
-if (defined $im->add($mime)) {
-	$emm = $emm->abort;
-} else {
-	# this message is similar to what ssoma-mda shows:
-	print STDERR "CONFLICT: Message-ID: ",
-			$mime->header_obj->header_raw('Message-ID'),
-			" exists\n";
+if (scalar(@rejects) && scalar(@rejects) == scalar(@$dests)) {
+	$! = 65; # EX_DATAERR 5.6.0 data format error
+	die join("\n", @rejects, '');
 }
 
-$im->done;
 do_exit(0);

^ permalink raw reply related	[relevance 6%]

* [PATCH 00/14] learn: sync w/ -mda changes and add manpage
@ 2019-10-28 10:45  7% Eric Wong
  2019-10-28 10:45  6% ` [PATCH 11/14] mda: prepare for multiple destinations Eric Wong
  0 siblings, 1 reply; 2+ results
From: Eric Wong @ 2019-10-28 10:45 UTC (permalink / raw)
  To: meta

What started with adding a manpage for public-inbox-learn,
ended up being a bunch of fixes and improvements to catch
up to -mda changes.

-mda also learned to deal with multiple List-ID headers in the
meantime.

Eric Wong (14):
  learn: support multiple To/Cc headers
  learn: only map recipient list on "ham" or "rm"
  learn: update usage statement
  learn: GIT_COMMITTER_<NAME|EMAIL> may be "" or "0"
  learn: hoist out remove_or_add subroutine
  mda: hoist out List-ID handling and reuse in -learn
  filter/base: remove MAX_MID_SIZE constant
  mda: hoist out mda_filter_adjust
  mda: skip MIME parsing if spam
  inboxwritable: add assert_usable_dir sub
  mda: prepare for multiple destinations
  mda: support multiple List-ID matches
  learn: allow running without spamc
  doc: add public-inbox-learn(1) manpage

 Documentation/include.mk             |   1 +
 Documentation/public-inbox-learn.pod |  86 +++++++++++++++++++++
 MANIFEST                             |   1 +
 lib/PublicInbox/Filter/Base.pm       |   1 -
 lib/PublicInbox/InboxWritable.pm     |   9 ++-
 lib/PublicInbox/MDA.pm               |  22 ++++++
 lib/PublicInbox/V2Writable.pm        |   5 +-
 script/public-inbox-learn            |  84 +++++++++++---------
 script/public-inbox-mda              | 110 ++++++++++++++++-----------
 t/import.t                           |   8 ++
 t/mda.t                              |  19 +++++
 t/v2writable.t                       |  12 +++
 12 files changed, 275 insertions(+), 83 deletions(-)
 create mode 100644 Documentation/public-inbox-learn.pod
 mode change 100755 => 100644 script/public-inbox-learn


^ permalink raw reply	[relevance 7%]

Results 1-2 of 2 | reverse | options above
-- pct% links below jump to the message on this page, permalinks otherwise --
2019-10-28 10:45  7% [PATCH 00/14] learn: sync w/ -mda changes and add manpage Eric Wong
2019-10-28 10:45  6% ` [PATCH 11/14] mda: prepare for multiple destinations Eric Wong

Code repositories for project(s) associated with this public inbox

	https://80x24.org/public-inbox.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).