From b3a04ae18a42ed960c89cc81c209633da6976380 Mon Sep 17 00:00:00 2001 From: Kyle Meyer Date: Sun, 19 Apr 2020 20:13:32 -0400 Subject: watchmaildir: support multiple watchheader values The watchheader key supports only a single value. Supporting multiple watchheader values was mentioned in discussion [1] of 8d3e3bd8 (doc: explain publicinbox..watchheader, 2019-10-09), and it wasn't clear if there was a need. One scenario in which matching multiple headers would be convenient is when someone wants to set up public-inbox archives for some small projects but does _not_ want to run mailing lists for them, instead allowing others to follow the project by any of the pull mechanisms. Using a common underlying address, an address alias for each project is configured via a third-party email provider, with messages for each alias being exposed as a separate public-inbox archive. In this setup, messages for an inbox cannot be selected by a List-ID header but can be identified by the inbox's address in either the To or Cc header. To support such a use case, update the watchheader handling to consider multiple values, accepting a message if it matches any value. While selecting a message based on matching _any_ rather than _all_ values is motivated by the above scenario, it's worth noting that the "any" behavior is consistent with how multiple listid config values are handled. [1] https://public-inbox.org/meta/20191010085118.r3amey4cayazfycb@dcvr/ --- t/watch_multiple_headers.t | 76 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 t/watch_multiple_headers.t (limited to 't') 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 +# License: AGPL-3.0+ +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 = < +Date: Sat, 18 Apr 2020 00:00:00 +0000 + +content1 +EOF + +my $msg_cc = < +Date: Sat, 18 Apr 2020 00:01:00 +0000 + +content2 +EOF + +my $msg_none = < +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 = <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; -- cgit v1.2.3-24-ge0c7