]> Sergey Matveev's repositories - public-inbox.git/commitdiff
nntpd: move {newsgroup} name check to config
authorEric Wong <e@80x24.org>
Tue, 1 Dec 2020 01:35:46 +0000 (01:35 +0000)
committerEric Wong <e@80x24.org>
Tue, 1 Dec 2020 10:19:33 +0000 (10:19 +0000)
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
lib/PublicInbox/IMAPD.pm
lib/PublicInbox/NNTPD.pm

index e7aea99b7ae80f8c8f515583b963d51bbfb59da7..9b9d5c1916d2f0b8f6dfa42260f3cb03f6e2e716 100644 (file)
@@ -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}) {
index 366b69221cbbf1cbcb2e051cf91862e574dd47ca..4a37734e8e0c9ced429eeb6d772a5c55a67850bb 100644 (file)
@@ -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;
        }
index 5e287857232093a1257c84e24710facbe5472b9a..967850e9d6ec7e713532fe917e3974f4f36a96c4 100644 (file)
@@ -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;