user/dev discussion of public-inbox itself
 help / color / Atom feed
6d6d301555bb474c7b648431b98339c09a32501f blob 2652 bytes (raw)

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
 
# Copyright (C) 2019 all contributors <meta@public-inbox.org>
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>

# Provide an HTTP-accessible listing of inboxes.
# Used by PublicInbox::WWW
package PublicInbox::WwwListing;
use strict;
use warnings;
use PublicInbox::Hval qw(ascii_html);
use PublicInbox::Linkify;
use PublicInbox::View;

sub list_all ($$$) {
	my ($self, $env, $hide_key) = @_;
	my @list;
	$self->{pi_config}->each_inbox(sub {
		my ($ibx) = @_;
		push @list, $ibx unless $ibx->{-hide}->{$hide_key};
	});
	\@list;
}

sub list_match_domain ($$$) {
	my ($self, $env, $hide_key) = @_;
	my @list;
	my $host = $env->{HTTP_HOST} // $env->{SERVER_NAME};
	$host =~ s/:[0-9]+\z//;
	my $re = qr!\A(?:https?:)?//\Q$host\E(?::[0-9]+)?/!i;
	$self->{pi_config}->each_inbox(sub {
		my ($ibx) = @_;
		if (!$ibx->{-hide}->{$hide_key} && $ibx->{url} =~ $re) {
			push @list, $ibx;
		}
	});
	\@list;
}

sub list_404 ($$) { [] }

# TODO: +cgit
my %VALID = (
	all => *list_all,
	'match=domain' => *list_match_domain,
	404 => *list_404,
);

sub new {
	my ($class, $www) = @_;
	my $k = 'publicinbox.wwwListing';
	my $pi_config = $www->{pi_config};
	my $v = $pi_config->{lc($k)} // 404;
	bless {
		pi_config => $pi_config,
		style => $www->style("\0"),
		list_cb => $VALID{$v} || do {
			warn <<"";
`$v' is not a valid value for `$k'
$k be one of `all', `match=domain', or `404'

			*list_404;
		},
	}, $class;
}

sub ibx_entry {
	my ($mtime, $ibx, $env) = @_;
	my $ts = PublicInbox::View::fmt_ts($mtime);
	my $url = PublicInbox::Hval::prurl($env, $ibx->{url});
	my $tmp = <<"";
* $ts - $url
  ${\$ibx->description}

	if (defined(my $info_url = $ibx->{info_url})) {
		$tmp .= "\n$info_url";
	}
	$tmp;
}

# not really a stand-alone PSGI app, but maybe it could be...
sub call {
	my ($self, $env) = @_;
	my $h = [ 'Content-Type', 'text/html; charset=UTF-8' ];
	my $hide_key = 'www';
	if ($env->{PATH_INFO} =~ m!/manifest\.js(?:\.gz)\z/!) {
		$hide_key = 'manifest';
	}
	my $list = $self->{list_cb}->($self, $env, $hide_key);
	my $code = 404;
	my $title = 'public-inbox';
	my $out = '';
	if (@$list) {
		# Swartzian transform since ->modified is expensive
		@$list = sort {
			$b->[0] <=> $a->[0]
		} map { [ $_->modified, $_ ] } @$list;

		$code = 200;
		$title .= ' - listing';
		my $tmp = join("\n", map { ibx_entry(@$_, $env) } @$list);
		my $l = PublicInbox::Linkify->new;
		$l->linkify_1($tmp);
		$out = '<pre>'.$l->linkify_2(ascii_html($tmp)).'</pre><hr>';
	}
	$out = "<html><head><title>$title</title></head><body>" . $out;
	$out .= '<pre>'. PublicInbox::WwwStream::code_footer($env) .
		'</pre></body></html>';
	[ $code, $h, [ $out ] ]
}

1;
debug log:

solving 6d6d301 ...
found 6d6d301 in https://80x24.org/public-inbox.git

user/dev discussion of public-inbox itself

Archives are clonable:
	git clone --mirror https://public-inbox.org/meta
	git clone --mirror http://czquwvybam4bgbro.onion/meta
	git clone --mirror http://hjrcffqmbrq6wope.onion/meta
	git clone --mirror http://ou63pmih66umazou.onion/meta

Example config snippet for mirrors

Newsgroups are available over NNTP:
	nntp://news.public-inbox.org/inbox.comp.mail.public-inbox.meta
	nntp://ou63pmih66umazou.onion/inbox.comp.mail.public-inbox.meta
	nntp://czquwvybam4bgbro.onion/inbox.comp.mail.public-inbox.meta
	nntp://hjrcffqmbrq6wope.onion/inbox.comp.mail.public-inbox.meta
	nntp://news.gmane.org/gmane.mail.public-inbox.general

 note: .onion URLs require Tor: https://www.torproject.org/

AGPL code for this site: git clone https://public-inbox.org/public-inbox.git