From cb75a7aeb9fd530b1816b760c8c7f6cfb428c8e3 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Tue, 1 Dec 2020 01:35:46 +0000 Subject: nntpd: move {newsgroup} name check to config With 50K newsgroups in the config file, this doesn't slow down `PublicInbox::Config->new->fill_all' any measurable amount on my busy old workstation. This should prevent invalid newsgroup names from getting into into extindex and catch user errors sooner, rather than later. v2: - delete {newsgroup} if invalid to avoid ->nntp_url link - simplify -imapd and explain remaining check --- lib/PublicInbox/Config.pm | 21 +++++++++++++++++---- lib/PublicInbox/IMAPD.pm | 13 +++++++------ lib/PublicInbox/NNTPD.pm | 16 ++-------------- 3 files changed, 26 insertions(+), 24 deletions(-) (limited to 'lib') diff --git a/lib/PublicInbox/Config.pm b/lib/PublicInbox/Config.pm index e7aea99b..9b9d5c19 100644 --- a/lib/PublicInbox/Config.pm +++ b/lib/PublicInbox/Config.pm @@ -437,10 +437,23 @@ EOF $self->{-by_list_id}->{lc($list_id)} = $ibx; } } - if (my $ng = $ibx->{newsgroup}) { - # PublicInbox::NNTPD does stricter (and more expensive checks), - # keep this lean for startup speed - $self->{-by_newsgroup}->{$ng} = $ibx unless ref($ng); + if (my $ngname = $ibx->{newsgroup}) { + if (ref($ngname)) { + delete $ibx->{newsgroup}; + warn 'multiple newsgroups not supported: '. + join(', ', @$ngname). "\n"; + # Newsgroup name needs to be compatible with RFC 3977 + # wildmat-exact and RFC 3501 (IMAP) ATOM-CHAR. + # Leave out a few chars likely to cause problems or conflicts: + # '|', '<', '>', ';', '#', '$', '&', + } elsif ($ngname =~ m![^A-Za-z0-9/_\.\-\~\@\+\=:]!) { + delete $ibx->{newsgroup}; + warn "newsgroup name invalid: `$ngname'\n"; + } else { + # PublicInbox::NNTPD does stricter ->nntp_usable + # checks, keep this lean for startup speed + $self->{-by_newsgroup}->{$ngname} = $ibx; + } } $self->{-by_name}->{$name} = $ibx; if ($ibx->{obfuscate}) { diff --git a/lib/PublicInbox/IMAPD.pm b/lib/PublicInbox/IMAPD.pm index 366b6922..4a37734e 100644 --- a/lib/PublicInbox/IMAPD.pm +++ b/lib/PublicInbox/IMAPD.pm @@ -27,12 +27,13 @@ sub new { sub imapd_refresh_ibx { # pi_config->each_inbox cb my ($ibx, $imapd) = @_; my $ngname = $ibx->{newsgroup} or return; - if (ref $ngname) { - warn 'multiple newsgroups not supported: '. - join(', ', @$ngname). "\n"; - return; - } elsif ($ngname =~ m![^a-z0-9/_\.\-\~\@\+\=:]! || - $ngname =~ /\.[0-9]+\z/) { + + # We require lower-case since IMAP mailbox names are + # case-insensitive (but -nntpd matches INN in being + # case-sensitive + if ($ngname =~ m![^a-z0-9/_\.\-\~\@\+\=:]! || + # don't confuse with 50K slices + $ngname =~ /\.[0-9]+\z/) { warn "mailbox name invalid: newsgroup=`$ngname'\n"; return; } diff --git a/lib/PublicInbox/NNTPD.pm b/lib/PublicInbox/NNTPD.pm index 5e287857..967850e9 100644 --- a/lib/PublicInbox/NNTPD.pm +++ b/lib/PublicInbox/NNTPD.pm @@ -38,20 +38,8 @@ sub refresh_groups { my $groups = $pi_config->{-by_newsgroup}; # filled during each_inbox $pi_config->each_inbox(sub { my ($ibx) = @_; - my $ngname = $ibx->{newsgroup} or return; - if (ref $ngname) { - warn 'multiple newsgroups not supported: '. - join(', ', @$ngname). "\n"; - # Newsgroup name needs to be compatible with RFC 3977 - # wildmat-exact and RFC 3501 (IMAP) ATOM-CHAR. - # Leave out a few chars likely to cause problems or conflicts: - # '|', '<', '>', ';', '#', '$', '&', - } elsif ($ngname =~ m![^A-Za-z0-9/_\.\-\~\@\+\=:]!) { - warn "newsgroup name invalid: `$ngname'\n"; - delete $groups->{$ngname}; - } elsif ($ibx->nntp_usable) { - # Only valid if msgmap and search works - + my $ngname = $ibx->{newsgroup} // return; + if ($ibx->nntp_usable) { # only valid if msgmap and over works # preload to avoid fragmentation: $ibx->description; $ibx->base_url; -- cgit v1.2.3-24-ge0c7