]> git.ipfire.org Git - thirdparty/public-inbox.git/commitdiff
ExtMsg, NewsWWW: account for publicinbox.nameIsUrl
authorEric Wong <e@80x24.org>
Wed, 8 Jan 2025 10:12:05 +0000 (10:12 +0000)
committerEric Wong <e@80x24.org>
Wed, 8 Jan 2025 22:47:09 +0000 (22:47 +0000)
As with WwwListing, these generate full URLs which go across
multiple inboxes, so support the new publicinbox.nameIsUrl
feature which allows users with many inboxes on the same domain
to avoid setting `publicinbox.*.url' for each one.

lib/PublicInbox/ExtMsg.pm
lib/PublicInbox/NewsWWW.pm

index 95feb88539b6459b7fdcbbb48b3a9989371c3d19..d994b78361afc7deb28cfa23076336fda9458ea7 100644 (file)
@@ -76,7 +76,8 @@ sub search_partial ($$) {
 sub ext_msg_i {
        my ($other, $ctx) = @_;
 
-       return if $other->{name} eq $ctx->{ibx}->{name} || !$other->base_url;
+       return if $other->{name} eq $ctx->{ibx}->{name} ||
+               !$other->base_url(@{$ctx->{-url_env}});
 
        my $mm = $other->mm or return;
 
@@ -117,7 +118,7 @@ sub ext_msg_ALL ($) {
                        $k =~ s/:[0-9]+:$x->{blob}\z// or next;
                        next if $k eq $cur_key;
                        my $ibx = $by_eidx_key->{$k} // next;
-                       $ibx->base_url or next;
+                       $ibx->base_url(@{$ctx->{-url_env}}) or next;
                        push(@{$ctx->{found}}, $ibx) unless $seen{$k}++;
                }
        }
@@ -132,8 +133,11 @@ sub ext_msg_ALL ($) {
        partial_response($ctx);
 }
 
+# only public entry point
 sub ext_msg {
        my ($ctx) = @_;
+       @{$ctx->{-url_env}} = $ctx->{www}->{pi_cfg}->{
+                       lc 'publicinbox.nameIsUrl'} ? ($ctx->{env}) : ();
        ext_msg_ALL($ctx) // sub {
                $ctx->{-wcb} = $_[0]; # HTTP server write callback
 
@@ -188,8 +192,9 @@ sub finalize_exact {
        finalize_partial($ctx);
 }
 
-sub _url_pfx ($$) {
-       my ($ctx, $u) = @_;
+sub _url_pfx ($$;$) {
+       my ($ctx, $ibx, $env) = @_;
+       my $u = $ibx->base_url(@{$env // $ctx->{-url_env}}) // return;
        (index($u, '://') < 0 && index($u, '/') != 0) ?
                "$ctx->{-upfx}../$u" : $u;
 }
@@ -209,10 +214,11 @@ sub partial_response ($) {
                $n_partial .= '+' if ($n_partial == PARTIAL_MAX);
                $s .= "\n$n_partial partial match$es found:\n\n";
                my $cur_name = $ctx->{ibx}->{name};
+               my $e = [ $ctx->{env} ];
                foreach my $pair (@{$ctx->{partial}}) {
                        my ($ibx, $res) = @$pair;
-                       my $e = $ibx->{name} eq $cur_name ? $ctx->{env} : undef;
-                       my $u = _url_pfx($ctx, $ibx->base_url($e) // next);
+                       my $u = _url_pfx($ctx, $ibx,
+                               $ibx->{name} eq $cur_name ? $e : undef) // next;
                        foreach my $m (@$res) {
                                my $href = mid_href($m);
                                my $html = ascii_html($m);
@@ -265,7 +271,7 @@ sub exact {
        $ctx->{-html_tip} = join('',
                        "<pre>Message-ID: &lt;$html&gt;\nfound in $end:\n\n",
                                (map {
-                                       my $u = _url_pfx($ctx, $_->base_url);
+                                       my $u = _url_pfx($ctx, $_);
                                        qq(<a\nhref="$u$href/">$u$html/</a>\n)
                                } @$found),
                        $ext_urls, '</pre>');
index d13731ae3f96b77b1996086647e1868b7615211c..28dc652d0ebd8fd857f75d6415816d2e2fca8685 100644 (file)
@@ -25,11 +25,11 @@ sub redirect ($$) {
 }
 
 sub try_inbox {
-       my ($ibx, $arg) = @_;
+       my ($ibx, $arg, @url_env) = @_;
        return if scalar(@$arg) > 1;
 
        # do not pass $env since HTTP_HOST may differ
-       my $url = $ibx->base_url or return;
+       my $url = $ibx->base_url(@url_env) or return;
 
        my ($mid) = @$arg;
        eval { $ibx->mm->num_for($mid) } or return;
@@ -49,8 +49,9 @@ sub call {
                [ 404, [qw(Content-Type text/plain)], ["404 Not Found\n"] ];
        my ($ng, $article) = @parts;
        my $pi_cfg = $self->{pi_cfg};
+       my @url_env = $pi_cfg->{lc 'publicinbox.nameIsUrl'} ? ($env) : ();
        if (my $ibx = $pi_cfg->lookup_newsgroup($ng)) {
-               my $url = prurl($env, $ibx->{url});
+               my $url = prurl($env, $ibx->{url} // $ibx->base_url(@url_env));
                my $code = 301;
                if (defined $article && $article =~ /\A[0-9]+\z/) {
                        my $mid = eval { $ibx->mm->mid_for($article) };
@@ -83,7 +84,8 @@ sub call {
                                        s/:[0-9]+:$x->{blob}\z// or next;
                                        my $ibx = $by_eidx_key->{$_} // next;
                                        my $url = $ALL->base_url($env) //
-                                                       $ibx->base_url // next;
+                                               $ibx->base_url(@url_env) //
+                                               next;
                                        $url .= mid_escape($mid) . '/';
                                        return redirect(302, $url);
                                }
@@ -92,7 +94,7 @@ sub call {
        } else { # slow path, scan every inbox
                for my $mid (@try) {
                        my $arg = [ $mid ]; # [1] => result
-                       $pi_cfg->each_inbox(\&try_inbox, $arg);
+                       $pi_cfg->each_inbox(\&try_inbox, $arg, @url_env);
                        return $arg->[1] if $arg->[1];
                }
        }