# returns 1 if we can continue, 0 if not due to buffered writes or disconnect
sub process_line ($$) {
my ($self, $l) = @_;
- my ($req, @args) = split(/\s+/, $l);
+ my ($req, @args) = split(/[ \t]/, $l);
return 1 unless defined($req); # skip blank line
$req = lc($req);
$req = eval {
sub set_nntp_headers ($$$$$) {
my ($self, $hdr, $ng, $n, $mid) = @_;
+ # why? leafnode requires a Path: header for some inexplicable
+ # reason. We'll fake the shortest one possible.
+ $hdr->header_set('Path', 'y');
+
+ # leafnode (and maybe other NNTP clients) have trouble dealing
+ # with v2 messages which have multiple Message-IDs (either due
+ # to our own content-based dedupe or buggy git-send-email versions).
+ my @mids = $hdr->header('Message-ID');
+ if (scalar(@mids) > 1) {
+ my $mid0 = "<$mid>";
+ $hdr->header_set('Message-ID', $mid0);
+ my @alt = $hdr->header('X-Alt-Message-ID');
+ my %seen = map { $_ => 1 } (@alt, $mid0);
+ foreach my $m (@mids) {
+ next if $seen{$m}++;
+ push @alt, $m;
+ }
+ $hdr->header_set('X-Alt-Message-ID', @alt);
+ }
+
# clobber some
my $xref = xref($self, $ng, $n, $mid);
$hdr->header_set('Xref', $xref);
- $xref =~ s/:\d+//g;
+ $xref =~ s/:[0-9]+//g;
$hdr->header_set('Newsgroups', (split(/ /, $xref, 2))[1]);
header_append($hdr, 'List-Post', "<mailto:$ng->{-primary_address}>");
if (my $url = $ng->base_url) {
my ($n, $mid);
my $err;
if (defined $art) {
- if ($art =~ /\A\d+\z/o) {
+ if ($art =~ /\A[0-9]+\z/) {
$err = '423 no such article number in this group';
$n = int($art);
goto find_mid;
sub set_art {
my ($self, $art) = @_;
- $self->{article} = $art if defined $art && $art =~ /\A\d+\z/;
+ $self->{article} = $art if defined $art && $art =~ /\A[0-9]+\z/;
}
sub _header ($) {
my $hdr = $_[0]->header_obj->as_string;
utf8::encode($hdr);
$hdr =~ s/(?<!\r)\n/\r\n/sg;
+
+ # for leafnode compatibility, we need to ensure Message-ID headers
+ # are only a single line. We can't subclass Email::Simple::Header
+ # and override _default_fold_at in here, either; since that won't
+ # affect messages already in the archive.
+ $hdr =~ s/^(Message-ID:)[ \t]*\r\n[ \t]+([^\r]+)\r\n/$1 $2\r\n/igsm;
+
$hdr
}
defined $range or return '420 No article(s) selected';
my ($beg, $end);
my ($min, $max) = $ng->mm->minmax;
- if ($range =~ /\A(\d+)\z/) {
+ if ($range =~ /\A([0-9]+)\z/) {
$beg = $end = $1;
- } elsif ($range =~ /\A(\d+)-\z/) {
+ } elsif ($range =~ /\A([0-9]+)-\z/) {
($beg, $end) = ($1, $max);
- } elsif ($range =~ /\A(\d+)-(\d+)\z/) {
+ } elsif ($range =~ /\A([0-9]+)-([0-9]+)\z/) {
($beg, $end) = ($1, $2);
} else {
return r501;
$self->{rbuf} .= $$buf;
}
my $r = 1;
- while ($r > 0 && $self->{rbuf} =~ s/\A\s*([^\r\n]*)\r?\n//) {
+ while ($r > 0 && $self->{rbuf} =~ s/\A[ \t\r\n]*([^\r\n]*)\r?\n//) {
my $line = $1;
return $self->close if $line =~ /[[:cntrl:]]/s;
my $t0 = now();