From: Eric Wong Date: Sat, 19 Sep 2015 02:03:40 +0000 (+0000) Subject: nntp: article lookups by Message-ID may cross newsgroups X-Git-Tag: v1.0.0~861 X-Git-Url: http://www.git.stargrave.org/?p=public-inbox.git;a=commitdiff_plain;h=b9e80e83a18bb139f02e598576b2596b340b6ebe nntp: article lookups by Message-ID may cross newsgroups Lynx seems to rely on this behavior for "ARTICLE " Tested with Lynx Version 2.8.8dev.12 (22 Feb 2012) on Debian wheezy. --- diff --git a/lib/PublicInbox/NNTP.pm b/lib/PublicInbox/NNTP.pm index 80adb65c..d513953a 100644 --- a/lib/PublicInbox/NNTP.pm +++ b/lib/PublicInbox/NNTP.pm @@ -330,7 +330,7 @@ sub cmd_quit ($) { sub art_lookup ($$$) { my ($self, $art, $set_headers) = @_; - my $ng = $self->{ng} or return '412 no newsgroup has been selected'; + my $ng = $self->{ng}; my ($n, $mid); my $err; if (defined $art) { @@ -339,10 +339,18 @@ sub art_lookup ($$$) { $n = int($art); goto find_mid; } elsif ($art =~ /\A<([^>]+)>\z/) { - $err = '430 no such article found'; $mid = $1; - $n = $ng->mm->num_for($mid); - defined $mid or return $err; + $err = '430 no such article found'; + $n = $ng->mm->num_for($mid) if $ng; + goto found if defined $n; + foreach my $g (values %{$self->{nntpd}->{groups}}) { + $n = $g->mm->num_for($mid); + if (defined $n) { + $ng = $g; + goto found; + } + } + return $err; } else { return r501; } @@ -351,10 +359,11 @@ sub art_lookup ($$$) { $n = $self->{article}; defined $n or return $err; find_mid: + $ng or return '412 no newsgroup has been selected'; $mid = $ng->mm->mid_for($n); defined $mid or return $err; } - +found: my $o = 'HEAD:' . mid2path($mid); my $s = eval { Email::Simple->new($ng->gcf->cat_file($o)) }; return $err unless $s;