about summary refs log tree commit homepage
path: root/lib/PublicInbox/Config.pm
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2019-05-16 19:22:46 -0500
committerEric Wong <e@80x24.org>2019-10-15 20:26:41 +0000
commit53a8e32b97985803e9de12c4312a86a8850208b3 (patch)
treed96ad36bc489d822f78d9c9c1a7bdfeef14d9fbd /lib/PublicInbox/Config.pm
parenta0ff3e44454322dd35c76a58fba311297ee00218 (diff)
downloadpublic-inbox-53a8e32b97985803e9de12c4312a86a8850208b3.tar.gz
The world has turned since I first started following mailing lists and
to my surprise every mailing list that I am subscribed to properly
sets the "List-ID:" mailing list header.  So instead of doing
something clever and flexible I am adding support for looking up
public inbox mailing lists by their mailing list name.

That makes the work needed for each email trivial and easy to understand.
- Parse the "List-ID:" header.
- Lookup in the configuration which mailbox is connected to that
  "List-ID:"
- Deliver the mail to that mailbox.

To that end this change enhances PublicInbox to have an additional
mailbox configuration parameter "listid" that holds the mailing list
name.

A method is added to the PublicInbox config object called
lookup_list_id that given a mailing list name will return the
PublicInbox in the configuration that is configured to handle that
mailing list.

Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>

[ew: avoid autovivification of $ibx->{listid} for t/config.t]
Diffstat (limited to 'lib/PublicInbox/Config.pm')
-rw-r--r--lib/PublicInbox/Config.pm35
1 files changed, 34 insertions, 1 deletions
diff --git a/lib/PublicInbox/Config.pm b/lib/PublicInbox/Config.pm
index 4fcb20d2..c2fa40f9 100644
--- a/lib/PublicInbox/Config.pm
+++ b/lib/PublicInbox/Config.pm
@@ -25,6 +25,7 @@ sub new {
 
         # caches
         $self->{-by_addr} ||= {};
+        $self->{-by_list_id} ||= {};
         $self->{-by_name} ||= {};
         $self->{-by_newsgroup} ||= {};
         $self->{-no_obfuscate} ||= {};
@@ -84,6 +85,33 @@ sub lookup {
         _fill($self, $pfx);
 }
 
+sub lookup_list_id {
+        my ($self, $list_id) = @_;
+        $list_id = lc($list_id);
+        my $ibx = $self->{-by_list_id}->{$list_id};
+        return $ibx if $ibx;
+
+        my $pfx;
+
+        foreach my $k (keys %$self) {
+                $k =~ /\A(publicinbox\.[\w-]+)\.listid\z/ or next;
+                my $v = $self->{$k};
+                if (ref($v) eq "ARRAY") {
+                        foreach my $alias (@$v) {
+                                (lc($alias) eq $list_id) or next;
+                                $pfx = $1;
+                                last;
+                        }
+                } else {
+                        (lc($v) eq $list_id) or next;
+                        $pfx = $1;
+                        last;
+                }
+        }
+        defined $pfx or return;
+        _fill($self, $pfx);
+}
+
 sub lookup_name ($$) {
         my ($self, $name) = @_;
         $self->{-by_name}->{$name} || _fill($self, "publicinbox.$name");
@@ -398,7 +426,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)) {
+        foreach my $k (qw(address altid nntpmirror coderepo hide listid)) {
                 if (defined(my $v = $self->{"$pfx.$k"})) {
                         $ibx->{$k} = _array($v);
                 }
@@ -421,6 +449,11 @@ sub _fill {
                 $self->{-by_addr}->{$lc_addr} = $ibx;
                 $self->{-no_obfuscate}->{$lc_addr} = 1;
         }
+        if (my $listids = $ibx->{listid}) {
+                foreach my $list_id (@$listids) {
+                        $self->{-by_list_id}->{$list_id} = $ibx;
+                }
+        }
         if (my $ng = $ibx->{newsgroup}) {
                 $self->{-by_newsgroup}->{$ng} = $ibx;
         }