From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS6315 166.70.0.0/16 X-Spam-Status: No, score=-3.7 required=3.0 tests=AWL,BAYES_00, RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE, SPF_PASS shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from out01.mta.xmission.com (out01.mta.xmission.com [166.70.13.231]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by dcvr.yhbt.net (Postfix) with ESMTPS id F0EA41F4BD; Tue, 8 Oct 2019 12:24:31 +0000 (UTC) Received: from in02.mta.xmission.com ([166.70.13.52]) by out01.mta.xmission.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.87) (envelope-from ) id 1iHoXW-0006qC-Vv; Tue, 08 Oct 2019 06:24:31 -0600 Received: from ip68-227-160-95.om.om.cox.net ([68.227.160.95] helo=x220.xmission.com) by in02.mta.xmission.com with esmtpsa (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.87) (envelope-from ) id 1iHoXV-0007mu-Rk; Tue, 08 Oct 2019 06:24:30 -0600 From: ebiederm@xmission.com (Eric W. Biederman) To: Eric Wong Cc: Alyssa Ross , meta@public-inbox.org References: <87imp05hlm.fsf@alyssa.is> <20191008001050.rwd7bh7cek7qrydi@dcvr> <87wodfctwd.fsf@x220.int.ebiederm.org> Date: Tue, 08 Oct 2019 07:23:46 -0500 In-Reply-To: <87wodfctwd.fsf@x220.int.ebiederm.org> (Eric W. Biederman's message of "Tue, 08 Oct 2019 07:18:42 -0500") Message-ID: <87muebctnx.fsf_-_@x220.int.ebiederm.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-XM-SPF: eid=1iHoXV-0007mu-Rk;;;mid=<87muebctnx.fsf_-_@x220.int.ebiederm.org>;;;hst=in02.mta.xmission.com;;;ip=68.227.160.95;;;frm=ebiederm@xmission.com;;;spf=neutral X-XM-AID: U2FsdGVkX1/wPRM1lNYwFSpNuYKjMafBQilT/LylQQE= X-SA-Exim-Connect-IP: 68.227.160.95 X-SA-Exim-Mail-From: ebiederm@xmission.com Subject: [PATCH] Config.pm: Add support for mailing list information X-SA-Exim-Version: 4.2.1 (built Thu, 05 May 2016 13:38:54 -0600) X-SA-Exim-Scanned: Yes (on in02.mta.xmission.com) List-Id: Date: Thu, 16 May 2019 19:22:46 -0500 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" --- The relevant snippet from my imap import program looks like: sub list_hdr_ibx($$) { my ($config, $list_hdr) = @_; my $list_id; if ($list_hdr =~ m/\0/) { warn("Bad List-ID: $list_hdr contains a null\n"); return undef; } elsif ($list_hdr =~ m/\A[^<>]*<(\S*)>\s*\z/) { $list_id = $1; } else { warn("Bad List-ID: $list_hdr\n"); return undef; } my $ibx = $config->lookup_list_id($list_id); if (!defined($ibx)) { warn("Cound not find inbox for List-ID: $list_id\n"); } print(" List-ID: $list_id\n"); $ibx; } sub email_dest($$) { my ($config, $mime) = @_; my %ibxs; my $hdr = $mime->header_obj; my @list_hdrs = $hdr->header_raw('List-ID'); for my $list_hdr (@list_hdrs) { my $ibx = list_hdr_ibx($config, $list_hdr); if (defined($ibx)) { $ibxs{$ibx->{mainrepo}} = $ibx; } } my @ibxs = values %ibxs; return @ibxs; } lib/PublicInbox/Config.pm | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/lib/PublicInbox/Config.pm b/lib/PublicInbox/Config.pm index 4fcb20d24437..9f3f8df7eeaa 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,9 @@ sub _fill { $self->{-by_addr}->{$lc_addr} = $ibx; $self->{-no_obfuscate}->{$lc_addr} = 1; } + foreach my $list_id (@{$ibx->{listid}}) { + $self->{-by_list_id}->{$list_id} = $ibx; + } if (my $ng = $ibx->{newsgroup}) { $self->{-by_newsgroup}->{$ng} = $ibx; } -- 2.23.0