diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/PublicInbox/Config.pm | 76 | ||||
-rw-r--r-- | lib/PublicInbox/ExtSearch.pm | 2 | ||||
-rw-r--r-- | lib/PublicInbox/TestCommon.pm | 28 | ||||
-rw-r--r-- | lib/PublicInbox/WwwAtomStream.pm | 6 |
4 files changed, 74 insertions, 38 deletions
diff --git a/lib/PublicInbox/Config.pm b/lib/PublicInbox/Config.pm index 87a03fd3..113975dd 100644 --- a/lib/PublicInbox/Config.pm +++ b/lib/PublicInbox/Config.pm @@ -88,12 +88,12 @@ sub lookup_list_id { sub lookup_name ($$) { my ($self, $name) = @_; - $self->{-by_name}->{$name} // _fill($self, "publicinbox.$name"); + $self->{-by_name}->{$name} // _fill_ibx($self, $name); } sub lookup_ei { my ($self, $name) = @_; - $self->{-ei_by_name}->{$name} //= _fill_ei($self, "extindex.$name"); + $self->{-ei_by_name}->{$name} //= _fill_ei($self, $name); } # special case for [extindex "all"] @@ -167,8 +167,8 @@ sub git_config_dump { $rv; } -sub valid_inbox_name ($) { - my ($name) = @_; +sub valid_foo_name ($;$) { + my ($name, $pfx) = @_; # Similar rules found in git.git/remote.c::valid_remote_nick # and git.git/refs.c::check_refname_component @@ -176,6 +176,7 @@ sub valid_inbox_name ($) { if ($name eq '' || $name =~ /\@\{/ || $name =~ /\.\./ || $name =~ m![/:\?\[\]\^~\s\f[:cntrl:]\*]! || $name =~ /\A\./ || $name =~ /\.\z/) { + warn "invalid $pfx name: `$name'\n" if $pfx; return 0; } @@ -375,26 +376,26 @@ sub rel2abs_collapsed { Cwd::abs_path($p); } -sub _fill { - my ($self, $pfx) = @_; - my $ibx = {}; +sub _one_val { + my ($self, $pfx, $k) = @_; + my $v = $self->{"$pfx.$k"} // return; + return $v if !ref($v); + warn "W: $pfx.$k has multiple values, only using `$v->[-1]'\n"; + $v->[-1]; +} +sub _fill_ibx { + my ($self, $name) = @_; + my $pfx = "publicinbox.$name"; + my $ibx = {}; 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 <<EOF; -W: $pfx.$k has multiple values, only using `$v->[-1]' -EOF - $ibx->{$k} = $v->[-1]; - } else { - $ibx->{$k} = $v; - } - } + my $v = _one_val($self, $pfx, $k) // next; + $ibx->{$k} = $v; } # "mainrepo" is backwards compatibility: @@ -403,9 +404,8 @@ EOF warn "E: `$dir' must not contain `\\n'\n"; return; } - foreach my $k (qw(obfuscate)) { - my $v = $self->{"$pfx.$k"}; - defined $v or next; + for my $k (qw(obfuscate)) { + my $v = $self->{"$pfx.$k"} // next; if (defined(my $bval = git_bool($v))) { $ibx->{$k} = $bval; } else { @@ -414,19 +414,13 @@ EOF } # TODO: more arrays, we should support multi-value for # more things to encourage decentralization - foreach my $k (qw(address altid nntpmirror coderepo hide listid url + for my $k (qw(address altid nntpmirror coderepo hide listid url infourl watchheader)) { - if (defined(my $v = $self->{"$pfx.$k"})) { - $ibx->{$k} = _array($v); - } - } - - my $name = substr($pfx, length('publicinbox.')); - if (!valid_inbox_name($name)) { - warn "invalid inbox name: '$name'\n"; - return; + my $v = $self->{"$pfx.$k"} // next; + $ibx->{$k} = _array($v); } + return unless valid_foo_name($name, 'publicinbox'); $ibx->{name} = $name; $ibx->{-pi_cfg} = $self; $ibx = PublicInbox::Inbox->new($ibx); @@ -473,14 +467,13 @@ EOF $ibx->{-no_obfuscate_re} = $self->{-no_obfuscate_re}; fill_all($self); # noop to populate -no_obfuscate } - if (my $ibx_code_repos = $ibx->{coderepo}) { my $code_repos = $self->{-code_repos}; my $repo_objs = $ibx->{-repo_objs} = []; foreach my $nick (@$ibx_code_repos) { my @parts = split(m!/!, $nick); my $valid = 0; - $valid += valid_inbox_name($_) foreach (@parts); + $valid += valid_foo_name($_) foreach (@parts); $valid == scalar(@parts) or next; my $repo = $code_repos->{$nick} //= @@ -496,10 +489,23 @@ EOF } sub _fill_ei ($$) { - my ($self, $pfx) = @_; + my ($self, $name) = @_; eval { require PublicInbox::ExtSearch } or return; - my $d = $self->{"$pfx.topdir"}; - defined($d) && -d $d ? PublicInbox::ExtSearch->new($d) : undef; + my $pfx = "extindex.$name"; + my $d = $self->{"$pfx.topdir"} // return; + -d $d or return; + my $es = PublicInbox::ExtSearch->new($d); + for my $k (qw(indexlevel indexsequentialshard)) { + my $v = _one_val($self, $pfx, $k) // next; + $es->{$k} = $v; + } + for my $k (qw(altid coderepo hide url infourl)) { + my $v = $self->{"$pfx.$k"} // next; + $es->{$k} = _array($v); + } + return unless valid_foo_name($name, 'extindex'); + $es->{name} = $name; + $es; } sub urlmatch { diff --git a/lib/PublicInbox/ExtSearch.pm b/lib/PublicInbox/ExtSearch.pm index 8ba4d396..c2cfc338 100644 --- a/lib/PublicInbox/ExtSearch.pm +++ b/lib/PublicInbox/ExtSearch.pm @@ -107,10 +107,10 @@ sub description { sub cloneurl { [] } # TODO -sub base_url { 'https://example.com/TODO/' } sub nntp_url { [] } no warnings 'once'; +*base_url = \&PublicInbox::Inbox::base_url; *smsg_eml = \&PublicInbox::Inbox::smsg_eml; *smsg_by_mid = \&PublicInbox::Inbox::smsg_by_mid; *msg_by_mid = \&PublicInbox::Inbox::msg_by_mid; diff --git a/lib/PublicInbox/TestCommon.pm b/lib/PublicInbox/TestCommon.pm index c2d07e59..0d15514e 100644 --- a/lib/PublicInbox/TestCommon.pm +++ b/lib/PublicInbox/TestCommon.pm @@ -15,7 +15,8 @@ BEGIN { @EXPORT = qw(tmpdir tcp_server tcp_connect require_git require_mods run_script start_script key2sub xsys xsys_e xqx eml_load tick have_xapian_compact json_utf8 setup_public_inboxes create_inbox - tcp_host_port test_lei lei lei_ok $lei_out $lei_err $lei_opt); + tcp_host_port test_lei lei lei_ok $lei_out $lei_err $lei_opt + test_httpd); require Test::More; my @methods = grep(!/\W/, @Test::More::EXPORT); eval(join('', map { "*$_=\\&Test::More::$_;" } @methods)); @@ -636,6 +637,31 @@ sub create_inbox ($$;@) { $ibx; } +sub test_httpd ($$;$) { + my ($env, $client, $skip) = @_; + for (qw(PI_CONFIG TMPDIR)) { + $env->{$_} or BAIL_OUT "$_ unset"; + } + SKIP: { + require_mods(qw(Plack::Test::ExternalServer), $skip // 1); + my $sock = tcp_server() or die; + my ($out, $err) = map { "$env->{TMPDIR}/std$_.log" } qw(out err); + my $cmd = [ qw(-httpd -W0), "--stdout=$out", "--stderr=$err" ]; + my $td = start_script($cmd, $env, { 3 => $sock }); + my ($h, $p) = tcp_host_port($sock); + local $ENV{PLACK_TEST_EXTERNALSERVER_URI} = "http://$h:$p"; + Plack::Test::ExternalServer::test_psgi(client => $client); + $td->join('TERM'); + open my $fh, '<', $err or BAIL_OUT $!; + my $e = do { local $/; <$fh> }; + if ($e =~ s/^Plack::Middleware::ReverseProxy missing,\n//gms) { + $e =~ s/^URL generation for redirects .*\n//gms; + } + is($e, '', 'no errors'); + } +}; + + package PublicInboxTestProcess; use strict; diff --git a/lib/PublicInbox/WwwAtomStream.pm b/lib/PublicInbox/WwwAtomStream.pm index 361e61f6..f60251b7 100644 --- a/lib/PublicInbox/WwwAtomStream.pm +++ b/lib/PublicInbox/WwwAtomStream.pm @@ -100,7 +100,11 @@ sub atom_header { } else { $title = title_tag($ibx->description); $self_url .= 'new.atom'; - $page_id = "mailto:$ibx->{-primary_address}"; + if (defined(my $addr = $ibx->{-primary_address})) { + $page_id = "mailto:$addr"; + } else { + $page_id = to_uuid($self_url); + } } qq(<?xml version="1.0" encoding="us-ascii"?>\n) . qq(<feed\nxmlns="http://www.w3.org/2005/Atom"\n) . |