X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FConfig.pm;h=cafd9c3bafe364eaaeedcb478cc9e23fd1a49dfc;hb=0d38f65c490466837ae091afa7a7b6f59d04ce7c;hp=8ccf337dc0071c4c409567be4a43a239c357984d;hpb=8fdea96141a65ac85d22d21ed9e3f999259ee73c;p=public-inbox.git diff --git a/lib/PublicInbox/Config.pm b/lib/PublicInbox/Config.pm index 8ccf337d..cafd9c3b 100644 --- a/lib/PublicInbox/Config.pm +++ b/lib/PublicInbox/Config.pm @@ -33,6 +33,7 @@ sub new { $self->{-by_list_id} = {}; $self->{-by_name} = {}; $self->{-by_newsgroup} = {}; + $self->{-by_eidx_key} = {}; $self->{-no_obfuscate} = {}; $self->{-limiters} = {}; $self->{-code_repos} = {}; # nick => PublicInbox::Git object @@ -89,6 +90,14 @@ sub lookup_name ($$) { $self->{-by_name}->{$name} // _fill($self, "publicinbox.$name"); } +sub lookup_ei { + my ($self, $name) = @_; + $self->{-ei_by_name}->{$name} //= _fill_ei($self, "extindex.$name"); +} + +# special case for [extindex "all"] +sub ALL { lookup_ei($_[0], 'all') } + sub each_inbox { my ($self, $cb, @arg) = @_; # may auto-vivify if config file is non-existent: @@ -364,13 +373,23 @@ sub _fill { my ($self, $pfx) = @_; my $ibx = {}; - foreach my $k (qw(inboxdir filter newsgroup - watch httpbackendmax - replyto feedmax nntpserver - indexlevel indexsequentialshard)) { + for my $k (qw(watch nntpserver)) { my $v = $self->{"$pfx.$k"}; $ibx->{$k} = $v if defined $v; } + for my $k (qw(filter inboxdir newsgroup replyto httpbackendmax feedmax + indexlevel indexsequentialshard)) { + if (defined(my $v = $self->{"$pfx.$k"})) { + if (ref($v) eq 'ARRAY') { + warn <[-1]' +EOF + $ibx->{$k} = $v->[-1]; + } else { + $ibx->{$k} = $v; + } + } + } # backwards compatibility: $ibx->{inboxdir} //= $self->{"$pfx.mainrepo"}; @@ -406,7 +425,7 @@ sub _fill { } $ibx->{name} = $name; - $ibx->{-pi_config} = $self; + $ibx->{-pi_cfg} = $self; $ibx = PublicInbox::Inbox->new($ibx); foreach (@{$ibx->{address}}) { my $lc_addr = lc($_); @@ -414,12 +433,28 @@ sub _fill { $self->{-no_obfuscate}->{$lc_addr} = 1; } if (my $listids = $ibx->{listid}) { + # RFC2919 section 6 stipulates "case insensitive equality" foreach my $list_id (@$listids) { - $self->{-by_list_id}->{$list_id} = $ibx; + $self->{-by_list_id}->{lc($list_id)} = $ibx; } } - if (my $ng = $ibx->{newsgroup}) { - $self->{-by_newsgroup}->{$ng} = $ibx; + 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}) { @@ -442,8 +477,18 @@ sub _fill { push @$repo_objs, $repo if $repo; } } + if (my $es = ALL($self)) { + require PublicInbox::Isearch; + $ibx->{isrch} = PublicInbox::Isearch->new($ibx, $es); + } + $self->{-by_eidx_key}->{$ibx->eidx_key} = $ibx; +} - $ibx +sub _fill_ei ($$) { + my ($self, $pfx) = @_; + require PublicInbox::ExtSearch; + my $d = $self->{"$pfx.topdir"}; + defined($d) && -d $d ? PublicInbox::ExtSearch->new($d) : undef; } sub urlmatch { @@ -465,4 +510,16 @@ sub urlmatch { } } +sub json { + state $json; + $json //= do { + for my $mod (qw(Cpanel::JSON::XS JSON::MaybeXS JSON JSON::PP)) { + eval "require $mod" or next; + # ->ascii encodes non-ASCII to "\uXXXX" + $json = $mod->new->ascii(1) and last; + } + $json; + }; +} + 1;