# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
#
# Each instance of this represents a NNTP client socket
+# fields:
+# nntpd: PublicInbox::NNTPD ref
+# article: per-session current article number
+# ng: PublicInbox::Inbox ref
+# long_cb: long_response private data
package PublicInbox::NNTP;
use strict;
-use warnings;
-use base qw(PublicInbox::DS);
-use fields qw(nntpd article ng long_cb);
+use parent qw(PublicInbox::DS);
use PublicInbox::MID qw(mid_escape $MID_EXTRACT);
use PublicInbox::Eml;
use POSIX qw(strftime);
sub new ($$$) {
my ($class, $sock, $nntpd) = @_;
- my $self = fields::new($class);
+ my $self = bless { nntpd => $nntpd }, $class;
my $ev = EPOLLIN;
my $wbuf;
if ($sock->can('accept_SSL') && !$sock->accept_SSL) {
$wbuf = [ \&PublicInbox::DS::accept_tls_step, \&greet ];
}
$self->SUPER::new($sock, $ev | EPOLLONESHOT);
- $self->{nntpd} = $nntpd;
if ($wbuf) {
$self->{wbuf} = $wbuf;
} else {
if (!defined($oid)) {
# it's possible to have TOCTOU if an admin runs
# public-inbox-(edit|purge), just move onto the next message
+ warn "E: $smsg->{blob} missing in $self->{ng}->{inboxdir}\n";
return $self->requeue;
} elsif ($smsg->{blob} ne $oid) {
$self->close;
sub cmd_stat ($;$) {
my ($self, $art) = @_;
- my $r = art_lookup($self, $art);
- return $r unless ref $r;
- my ($n, $mid) = @$r;
+ my $smsg = art_lookup($self, $art); # art may be msgid
+ return $smsg unless ref $smsg;
+ $art = $smsg->{num};
set_art($self, $art);
- "223 $n <$mid> article retrieved - request text separately";
+ "223 $art <$smsg->{mid}> article retrieved - request text separately";
}
sub cmd_ihave ($) { '435 article not wanted - do not send it' }