about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorKyle Meyer <kyle@kyleam.com>2020-04-19 20:13:32 -0400
committerEric Wong <e@yhbt.net>2020-04-20 00:59:08 +0000
commitb3a04ae18a42ed960c89cc81c209633da6976380 (patch)
tree2589568b9b7a4003d6a3a19c8c27dddb658fc554 /lib
parentb3f81ce0c71d5d4eca347f259b5ae69660a2cb13 (diff)
downloadpublic-inbox-b3a04ae18a42ed960c89cc81c209633da6976380.tar.gz
The watchheader key supports only a single value.  Supporting multiple
watchheader values was mentioned in discussion [1] of 8d3e3bd8 (doc:
explain publicinbox.<name>.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/
Diffstat (limited to 'lib')
-rw-r--r--lib/PublicInbox/Config.pm4
-rw-r--r--lib/PublicInbox/WatchMaildir.pm8
-rw-r--r--lib/PublicInbox/WwwText.pm4
3 files changed, 9 insertions, 7 deletions
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";
         }