]> Sergey Matveev's repositories - public-inbox.git/commitdiff
www: allow including links to NNTP sites in HTML footer
authorEric Wong <e@80x24.org>
Fri, 12 Aug 2016 19:52:35 +0000 (19:52 +0000)
committerEric Wong <e@80x24.org>
Fri, 12 Aug 2016 19:52:35 +0000 (19:52 +0000)
Improve the discoverability of NNTP endpoints for users
who still know what NNTP is.

==> ~/.public-inbox/config <==
; aliases for the locally-run nntpd can be specified in
; the "publicinbox" section:
[publicinbox]
nntpserver = nntp://ou63pmih66umazou.onion/
nntpserver = news.public-inbox.org

; NNTPS is not supported natively, yet,
; but one can use haproxy or similar
; nntpserver = nntps://news.public-inbox.invalid/

; mirrors for specific inboxes may be specified either as full
; NNTP (or NNTPS) URLs, or with the server name only if the
; newsgroup name is specfied for a local NNTP server
[publicinbox "git"]
...
newsgroup = inbox.a.b.c
nntpmirror = nntp://czquwvybam4bgbro.onion/
nntpmirror = hjrcffqmbrq6wope.onion

; there may be a mirror on a different server with a
; different name:
nntpmirror = nntp://news.example.com/differently.named.group

; (And I really need to write manpages for all this...)

lib/PublicInbox/Config.pm
lib/PublicInbox/Inbox.pm
lib/PublicInbox/WwwStream.pm
t/view.t

index 5eae1f1d105ab67decf7850d70f20cbf69a0d368..5adcd0ccf44ac2f13eb90b66c205de45dcf31bae 100644 (file)
@@ -145,7 +145,10 @@ sub _fill {
                my $v = $self->{"$pfx.$k"};
                $rv->{$k} = $v if defined $v;
        }
-       foreach my $k (qw(altid)) { # TODO: more arrays
+
+       # TODO: more arrays, we should support multi-value for
+       # more things to encourage decentralization
+       foreach my $k (qw(altid nntpmirror)) {
                if (defined(my $v = $self->{"$pfx.$k"})) {
                        $rv->{$k} = ref($v) eq 'ARRAY' ? $v : [ $v ];
                }
index 922ca9bbdc78c297e8c690fee95cd7c6b34243bb..414973c6dedd9b6137852695092877cc0b62e7a1 100644 (file)
@@ -147,6 +147,52 @@ sub base_url {
        }
 }
 
+sub nntp_url {
+       my ($self) = @_;
+       $self->{-nntp_url} ||= do {
+               # no checking for nntp_usable here, we can point entirely
+               # to non-local servers or users run by a different user
+               my $ns = $self->{-pi_config}->{'publicinbox.nntpserver'};
+               my $group = $self->{newsgroup};
+               my @urls;
+               if ($ns && $group) {
+                       $ns = [ $ns ] if ref($ns) ne 'ARRAY';
+                       @urls = map {
+                               my $u = m!\Anntps?://! ? $_ : "nntp://$_";
+                               $u .= '/' if $u !~ m!/\z!;
+                               $u.$group;
+                       } @$ns;
+               }
+
+               my $mirrors = $self->{nntpmirror};
+               if ($mirrors) {
+                       my @m;
+                       foreach (@$mirrors) {
+                               my $u = m!\Anntps?://! ? $_ : "nntp://$_";
+                               if ($u =~ m!\Anntps?://[^/]+/?\z!) {
+                                       if ($group) {
+                                               $u .= '/' if $u !~ m!/\z!;
+                                               $u .= $group;
+                                       } else {
+                                               warn
+"publicinbox.$self->{name}.nntpmirror=$_ missing newsgroup name\n";
+                                       }
+                               }
+                               # else: allow full URLs like:
+                               # nntp://news.example.com/alt.example
+                               push @m, $u;
+                       }
+                       my %seen = map { $_ => 1 } @urls;
+                       foreach my $u (@m) {
+                               next if $seen{$u};
+                               $seen{$u} = 1;
+                               push @urls, $u;
+                       }
+               }
+               \@urls;
+       };
+}
+
 sub nntp_usable {
        my ($self) = @_;
        my $ret = $self->mm && $self->search;
index 29395f40909661ec2231304677a4d33a5dbbae35..9ed25e1d047f6fed024ba95ead017399bbc0b020 100644 (file)
@@ -72,10 +72,8 @@ sub _html_end {
        chop $http;
        my %seen = ( $http => 1 );
        my @urls = ($http);
-       my $need_tor;
        foreach my $u (@{$obj->cloneurl}) {
                next if $seen{$u};
-               $need_tor = 1 if $u =~ m!\A[^:]+://\w+\.onion/!;
                $seen{$u} = 1;
                push @urls, $u =~ /\Ahttps?:/ ? qq(<a\nhref="$u">$u</a>) : $u;
        }
@@ -86,7 +84,14 @@ sub _html_end {
                        join("\n", map { "\tgit clone --mirror $_" } @urls);
        }
 
-       if ($need_tor) {
+       my @nntp = map { qq(<a\nhref="$_">$_</a>) } @{$obj->nntp_url};
+       if (@nntp) {
+               $urls .= "\n\n";
+               $urls .= @nntp == 1 ? 'Newsgroup' : 'Newsgroups are';
+               $urls .= ' available over NNTP:';
+               $urls .= "\n\t" . join("\n\t", @nntp) . "\n";
+       }
+       if ($urls =~ m!\b[^:]+://\w+\.onion/!) {
                $urls .= "\n note: .onion URLs require Tor: ";
                $urls .= qq[<a\nhref="$TOR_URL">$TOR_URL</a>];
        }
index 4cee4395f7ce88926d797579d65ef5289525e41f..46fbe410d6810019271a89aac8ba9d772ce8acb4 100644 (file)
--- a/t/view.t
+++ b/t/view.t
@@ -27,6 +27,7 @@ my $ctx = {
                search => sub { undef },
                base_url => sub { 'http://example.com/' },
                cloneurl => sub {[]},
+               nntp_url => sub {[]},
                description => sub { '' }),
 };
 $ctx->{-inbox}->{-primary_address} = 'test@example.com';