diff options
-rw-r--r-- | Documentation/public-inbox-config.pod | 3 | ||||
-rw-r--r-- | MANIFEST | 1 | ||||
-rw-r--r-- | lib/PublicInbox/Config.pm | 4 | ||||
-rw-r--r-- | lib/PublicInbox/WatchMaildir.pm | 8 | ||||
-rw-r--r-- | lib/PublicInbox/WwwText.pm | 4 | ||||
-rw-r--r-- | t/watch_multiple_headers.t | 76 |
6 files changed, 88 insertions, 8 deletions
diff --git a/Documentation/public-inbox-config.pod b/Documentation/public-inbox-config.pod index 4c9994dc..708a785f 100644 --- a/Documentation/public-inbox-config.pod +++ b/Documentation/public-inbox-config.pod @@ -88,7 +88,8 @@ Default: none; only for L<public-inbox-watch(1)> users watchheader = List-Id:<test.example.com> If specified, L<public-inbox-watch(1)> will only process mail matching -the given header. Multiple values are not currently supported. +the given header. If specified multiple times, mail will be processed +if it matches any of the values. Default: none; only for L<public-inbox-watch(1)> users @@ -307,6 +307,7 @@ t/view.t t/watch_filter_rubylang.t t/watch_maildir.t t/watch_maildir_v2.t +t/watch_multiple_headers.t t/www_altid.t t/www_listing.t t/www_static.t diff --git a/lib/PublicInbox/Config.pm b/lib/PublicInbox/Config.pm index 917939ca..458f29b2 100644 --- a/lib/PublicInbox/Config.pm +++ b/lib/PublicInbox/Config.pm @@ -367,7 +367,7 @@ sub _fill { my $ibx = {}; foreach my $k (qw(inboxdir filter newsgroup - watch watchheader httpbackendmax + watch httpbackendmax replyto feedmax nntpserver indexlevel)) { my $v = $self->{"$pfx.$k"}; $ibx->{$k} = $v if defined $v; @@ -388,7 +388,7 @@ sub _fill { # TODO: more arrays, we should support multi-value for # more things to encourage decentralization foreach my $k (qw(address altid nntpmirror coderepo hide listid url - infourl)) { + infourl watchheader)) { if (defined(my $v = $self->{"$pfx.$k"})) { $ibx->{$k} = _array($v); } diff --git a/lib/PublicInbox/WatchMaildir.pm b/lib/PublicInbox/WatchMaildir.pm index bea2ed2a..7b9e8915 100644 --- a/lib/PublicInbox/WatchMaildir.pm +++ b/lib/PublicInbox/WatchMaildir.pm @@ -59,9 +59,11 @@ sub new { my $watch = $ibx->{watch} or return; if (is_maildir($watch)) { my $watch_hdrs = []; - if (my $wh = $ibx->{watchheader}) { - my ($k, $v) = split(/:/, $wh, 2); - push @$watch_hdrs, [ $k, qr/\Q$v\E/ ]; + if (my $whs = $ibx->{watchheader}) { + for (@$whs) { + my ($k, $v) = split(/:/, $_, 2); + push @$watch_hdrs, [ $k, qr/\Q$v\E/ ]; + } } if (my $list_ids = $ibx->{listid}) { for (@$list_ids) { diff --git a/lib/PublicInbox/WwwText.pm b/lib/PublicInbox/WwwText.pm index 2008ba09..b23a415e 100644 --- a/lib/PublicInbox/WwwText.pm +++ b/lib/PublicInbox/WwwText.pm @@ -151,7 +151,7 @@ sub inbox_config ($$$) { url = https://example.com/$name/ url = http://example.onion/$name/ EOS - for my $k (qw(address listid infourl)) { + for my $k (qw(address listid infourl watchheader)) { defined(my $v = $ibx->{$k}) or next; $$txt .= "\t$k = $_\n" for @$v; } @@ -171,7 +171,7 @@ EOF } } - for my $k (qw(filter newsgroup obfuscate replyto watchheader)) { + for my $k (qw(filter newsgroup obfuscate replyto)) { defined(my $v = $ibx->{$k}) or next; $$txt .= "\t$k = $v\n"; } diff --git a/t/watch_multiple_headers.t b/t/watch_multiple_headers.t new file mode 100644 index 00000000..3a39eba9 --- /dev/null +++ b/t/watch_multiple_headers.t @@ -0,0 +1,76 @@ +# Copyright (C) 2020 all contributors <meta@public-inbox.org> +# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt> +use strict; +use Test::More; +use PublicInbox::Config; +use PublicInbox::TestCommon; +require_git(2.6); +require_mods(qw(Search::Xapian DBD::SQLite Filesys::Notify::Simple)); +my ($tmpdir, $for_destroy) = tmpdir(); +my $inboxdir = "$tmpdir/v2"; +my $maildir = "$tmpdir/md"; +use_ok 'PublicInbox::WatchMaildir'; +use_ok 'PublicInbox::Emergency'; +my $cfgpfx = "publicinbox.test"; +my $addr = 'test-public@example.com'; +my @cmd = ('-init', '-V2', 'test', $inboxdir, + 'http://example.com/list', $addr); +local $ENV{PI_CONFIG} = "$tmpdir/pi_config"; +ok(run_script(\@cmd), 'public-inbox init OK'); + +my $msg_to = <<EOF; +From: user\@a.com +To: $addr +Subject: address is in to +Message-Id: <to\@a.com> +Date: Sat, 18 Apr 2020 00:00:00 +0000 + +content1 +EOF + +my $msg_cc = <<EOF; +From: user1\@a.com +To: user2\@a.com +Cc: $addr +Subject: address is in cc +Message-Id: <cc\@a.com> +Date: Sat, 18 Apr 2020 00:01:00 +0000 + +content2 +EOF + +my $msg_none = <<EOF; +From: user1\@a.com +To: user2\@a.com +Cc: user3\@a.com +Subject: address is not in to or cc +Message-Id: <none\@a.com> +Date: Sat, 18 Apr 2020 00:02:00 +0000 + +content3 +EOF + +PublicInbox::Emergency->new($maildir)->prepare(\$msg_to); +PublicInbox::Emergency->new($maildir)->prepare(\$msg_cc); +PublicInbox::Emergency->new($maildir)->prepare(\$msg_none); + +my $cfg = <<EOF; +$cfgpfx.address=$addr +$cfgpfx.inboxdir=$inboxdir +$cfgpfx.watch=maildir:$maildir +$cfgpfx.watchheader=To:$addr +$cfgpfx.watchheader=Cc:$addr +EOF +my $config = PublicInbox::Config->new(\$cfg); +PublicInbox::WatchMaildir->new($config)->scan('full'); +my $ibx = $config->lookup_name('test'); +ok($ibx, 'found inbox by name'); + +my $num = $ibx->mm->num_for('to@a.com'); +ok(defined $num, 'Matched for address in To:'); +$num = $ibx->mm->num_for('cc@a.com'); +ok(defined $num, 'Matched for address in Cc:'); +$num = $ibx->mm->num_for('none@a.com'); +is($num, undef, 'No match without address in To: or Cc:'); + +done_testing; |