X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FNNTPD.pm;h=33bc5fda7a9a936e0fc95c28a14d91113d3bda31;hb=24e103d37b423c1c718e7f0f6285419005a98be5;hp=a67811bc9bd458a6eb958c71513ac3d3f23fce7c;hpb=33cef7f24d3ddedc4cd79ee88b0bba6ed1aab4c9;p=public-inbox.git diff --git a/lib/PublicInbox/NNTPD.pm b/lib/PublicInbox/NNTPD.pm index a67811bc..33bc5fda 100644 --- a/lib/PublicInbox/NNTPD.pm +++ b/lib/PublicInbox/NNTPD.pm @@ -1,4 +1,4 @@ -# Copyright (C) 2016 all contributors +# Copyright (C) 2016-2020 all contributors # License: AGPL-3.0+ # represents an NNTPD (currently a singleton), @@ -6,39 +6,67 @@ package PublicInbox::NNTPD; use strict; use warnings; -require PublicInbox::Config; +use Sys::Hostname; +use PublicInbox::Config; +use PublicInbox::InboxIdle; sub new { my ($class) = @_; + my $pi_config = PublicInbox::Config->new; + my $name = $pi_config->{'publicinbox.nntpserver'}; + if (!defined($name) or $name eq '') { + $name = hostname; + } elsif (ref($name) eq 'ARRAY') { + $name = $name->[0]; + } + bless { groups => {}, err => \*STDERR, out => \*STDOUT, - grouplist => [], + pi_config => $pi_config, + servername => $name, + greet => \"201 $name ready - post via email\r\n", + # accept_tls => { SSL_server => 1, ..., SSL_reuse_ctx => ... } + # idler => PublicInbox::InboxIdle }, $class; } -sub refresh_groups () { - my ($self) = @_; - my $pi_config = PublicInbox::Config->new; - my $new = {}; - my @list; +sub refresh_groups { + my ($self, $sig) = @_; + my $pi_config = $sig ? PublicInbox::Config->new : $self->{pi_config}; + my $groups = $pi_config->{-by_newsgroup}; # filled during each_inbox $pi_config->each_inbox(sub { - my ($ng) = @_; - my $ngname = $ng->{newsgroup} or next; + my ($ibx) = @_; + my $ngname = $ibx->{newsgroup} or return; if (ref $ngname) { warn 'multiple newsgroups not supported: '. join(', ', @$ngname). "\n"; - } elsif ($ng->nntp_usable) { + # 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 - $new->{$ngname} = $ng; - push @list, $ng; + + # preload to avoid fragmentation: + $ibx->description; + $ibx->base_url; + } else { + delete $groups->{$ngname}; } }); - @list = sort { $a->{newsgroup} cmp $b->{newsgroup} } @list; - $self->{grouplist} = \@list; + $self->{groupnames} = [ sort(keys %$groups) ]; + $self->{pi_config} = $pi_config; # this will destroy old groups that got deleted - %{$self->{groups}} = %$new; + $self->{groups} = $groups; +} + +sub idler_start { + $_[0]->{idler} //= PublicInbox::InboxIdle->new($_[0]->{pi_config}); } 1;