package PublicInbox::POP3;
use v5.12;
use parent qw(PublicInbox::DS);
-use PublicInbox::Syscall qw(EPOLLIN EPOLLONESHOT);
use PublicInbox::GitAsyncCat;
use PublicInbox::DS qw(now);
use Errno qw(EAGAIN);
undef;
}
-sub _greet ($) {
+sub do_greet {
my ($self) = @_;
my $s = $self->{salt} = sprintf('%x.%x', int(rand(0x7fffffff)), time);
$self->write("+OK POP3 server ready <$s\@public-inbox>\r\n");
}
-sub new ($$$) {
- my ($class, $sock, $pop3d) = @_;
- my $self = bless { pop3d => $pop3d }, __PACKAGE__;
- my $ev = EPOLLIN;
- my $wbuf;
- if ($sock->can('accept_SSL') && !$sock->accept_SSL) {
- return CORE::close($sock) if $! != EAGAIN;
- $ev = PublicInbox::TLS::epollbit() or return CORE::close($sock);
- $wbuf = [ \&PublicInbox::DS::accept_tls_step, \&_greet ];
- }
- $self->SUPER::new($sock, $ev | EPOLLONESHOT);
- if ($wbuf) {
- $self->{wbuf} = $wbuf;
- } else {
- _greet($self);
- }
- $self;
+sub new {
+ my ($cls, $sock, $pop3d) = @_;
+ (bless { pop3d => $pop3d }, $cls)->greet($sock)
}
# POP user is $UUID1@$NEWSGROUP.$SLICE
$self->{uid_max} = $self->{ibx}->over(1)->max;
\"+OK logged in\r\n";
} else {
- \"-ERR unable to lock maildrop\r\n";
+ \"-ERR [IN-USE] unable to lock maildrop\r\n";
}
}
$hdr .= "\r\n\r\n";
my @tmp = split(/^/m, $bdy);
$hdr .= join('', splice(@tmp, 0, $top_nr));
+ } elsif (exists $self->{expire}) {
+ $self->{expire} .= pack('S', $off + 1);
}
$$bref =~ s/^\./../gms;
$$bref .= substr($$bref, -2, 2) eq "\r\n" ? ".\r\n" : "\r\n.\r\n";
$self->msg_more("+OK message follows\r\n");
$self->write($bref);
- $self->{expire} .= pack('S', $off + 1) if exists $self->{expire};
$self->requeue;
}
# RFC 2449
sub cmd_capa {
my ($self) = @_;
+ my $STLS = !$self->{ibx} && !$self->{sock}->can('stop_SSL') &&
+ $self->{pop3d}->{accept_tls} ? "\nSTLS\r" : '';
$self->{expire} = ''; # "EXPIRE 0" allows clients to avoid DELE commands
- \<<EOM;
+ <<EOM;
+OK Capability list follows\r
TOP\r
USER\r
PIPELINING\r
UIDL\r
EXPIRE 0\r
+RESP-CODES\r$STLS
.\r
EOM
}