]> Sergey Matveev's repositories - public-inbox.git/commitdiff
nntp: article lookups by Message-ID may cross newsgroups
authorEric Wong <e@80x24.org>
Sat, 19 Sep 2015 02:03:40 +0000 (02:03 +0000)
committerEric Wong <e@80x24.org>
Sat, 19 Sep 2015 04:18:44 +0000 (04:18 +0000)
Lynx seems to rely on this behavior for "ARTICLE <message-id>"

Tested with Lynx Version 2.8.8dev.12 (22 Feb 2012) on Debian wheezy.

lib/PublicInbox/NNTP.pm

index 80adb65c044671c2aa1d0813230da1c6fac44212..d513953abf060a7abfa9a2ffebb3ab37eaef57bb 100644 (file)
@@ -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;