From: ebiederm@xmission.com (Eric W. Biederman) To: Eric Wong <e@80x24.org> Cc: Alyssa Ross <hi@alyssa.is>, meta@public-inbox.org Subject: [PATCH] Config.pm: Add support for mailing list information Date: Tue, 08 Oct 2019 07:23:46 -0500 Message-ID: <87muebctnx.fsf_-_@x220.int.ebiederm.org> (raw) In-Reply-To: <87wodfctwd.fsf@x220.int.ebiederm.org> (Eric W. Biederman's message of "Tue, 08 Oct 2019 07:18:42 -0500") 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" <ebiederm@xmission.com> --- 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
next prev parent reply other threads:[~2019-10-08 12:24 UTC|newest] Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-10-07 22:13 Do I need multiple publicinbox.<name>.address values? Alyssa Ross 2019-10-08 0:10 ` Eric Wong 2019-10-08 12:18 ` Eric W. Biederman 2019-10-08 12:23 ` Eric W. Biederman [this message] 2019-10-08 22:11 ` Eric Wong 2019-10-08 22:24 ` Eric W. Biederman 2019-10-08 22:41 ` Eric Wong 2019-10-09 7:58 ` Eric W. Biederman 2019-10-09 8:15 ` [PATCH 0/4] Various bits to support import_imap_mailbox Eric W. Biederman 2019-10-09 8:16 ` [PATCH 1/4] PublicInbox::Import Smuggle a raw message into add Eric W. Biederman 2019-10-15 20:26 ` Eric Wong 2019-10-15 23:05 ` Eric W. Biederman 2019-10-09 8:17 ` [PATCH 2/4] PublicInbox::Config: Process mailboxes in sorted order Eric W. Biederman 2019-10-10 9:43 ` Eric Wong 2019-10-10 11:05 ` Eric W. Biederman 2019-10-09 8:23 ` [PATCH 3/4] Config.pm: Add support for looking up repos by their directories Eric W. Biederman 2019-10-09 8:25 ` [PATCH 4/4] IMAPTracker: Add a helper to track our place in reading imap mailboxes Eric W. Biederman 2019-10-10 19:08 ` ibx->{listid} autoviv fixup [was: [PATCH 0/4] Various bits to support import_imap_mailbox] Eric Wong 2019-10-10 21:23 ` Eric W. Biederman 2019-10-10 8:31 ` Do I need multiple publicinbox.<name>.address values? Eric Wong 2019-10-10 10:56 ` Eric W. Biederman 2019-10-09 11:59 ` Alyssa Ross 2019-10-10 10:06 ` Eric Wong
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style List information: https://public-inbox.org/README * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=87muebctnx.fsf_-_@x220.int.ebiederm.org \ --to=ebiederm@xmission.com \ --cc=e@80x24.org \ --cc=hi@alyssa.is \ --cc=meta@public-inbox.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
user/dev discussion of public-inbox itself This inbox may be cloned and mirrored by anyone: git clone --mirror https://public-inbox.org/meta git clone --mirror http://czquwvybam4bgbro.onion/meta git clone --mirror http://hjrcffqmbrq6wope.onion/meta git clone --mirror http://ou63pmih66umazou.onion/meta # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V1 meta meta/ https://public-inbox.org/meta \ meta@public-inbox.org public-inbox-index meta Example config snippet for mirrors. Newsgroups are available over NNTP: nntp://news.public-inbox.org/inbox.comp.mail.public-inbox.meta nntp://ou63pmih66umazou.onion/inbox.comp.mail.public-inbox.meta nntp://czquwvybam4bgbro.onion/inbox.comp.mail.public-inbox.meta nntp://hjrcffqmbrq6wope.onion/inbox.comp.mail.public-inbox.meta nntp://news.gmane.io/gmane.mail.public-inbox.general note: .onion URLs require Tor: https://www.torproject.org/ code repositories for the project(s) associated with this inbox: https://80x24.org/public-inbox.git AGPL code for this site: git clone https://public-inbox.org/public-inbox.git