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-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 6759D1F86C for ; Mon, 30 Nov 2020 20:00:33 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH] nntpd: move {newsgroup} name check to config Date: Mon, 30 Nov 2020 20:00:33 +0000 Message-Id: <20201130200033.27709-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: 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. --- lib/PublicInbox/Config.pm | 19 +++++++++++++++---- lib/PublicInbox/NNTPD.pm | 16 ++-------------- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/lib/PublicInbox/Config.pm b/lib/PublicInbox/Config.pm index e7aea99b..47e803d5 100644 --- a/lib/PublicInbox/Config.pm +++ b/lib/PublicInbox/Config.pm @@ -437,10 +437,21 @@ 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)) { + 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"; + } 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/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;