sub cmd_stls {
my ($self) = @_;
- my $sock = $self->{sock} or return;
- return \"-ERR TLS already enabled\r\n" if $sock->can('stop_SSL');
- my $opt = $self->{pop3d}->{accept_tls} or
+ ($self->{sock} // return)->can('stop_SSL') and
+ return \"-ERR TLS already enabled\r\n";
+ $self->{pop3d}->{ssl_ctx_opt} or
return \"-ERR can't start TLS negotiation\r\n";
$self->write(\"+OK begin TLS negotiation now\r\n");
- $self->{sock} = IO::Socket::SSL->start_SSL($sock, %$opt);
+ PublicInbox::TLS::start($self->{sock}, $self->{pop3d});
$self->requeue if PublicInbox::DS::accept_tls_step($self);
undef;
}
my ($self) = @_;
my ($beg, $end) = (($self->{uid_dele} // -1) + 1, $self->{uid_max});
PublicInbox::IMAP::uid_clamp($self, \$beg, \$end);
- my $opt = { limit => PublicInbox::IMAP::UID_SLICE };
- my $m = $self->{ibx}->over(1)->do_get(<<'', $opt, $beg, $end);
+ my (@cache, $m);
+ my $sth = $self->{ibx}->over(1)->dbh->prepare_cached(<<'', undef, 1);
SELECT num,ddd FROM over WHERE num >= ? AND num <= ?
ORDER BY num ASC
- [ map { ($_->{num}, $_->{bytes} + 0, $_->{blob}) } @$m ];
+ $sth->execute($beg, $end);
+ do {
+ $m = $sth->fetchall_arrayref({}, 1000);
+ for my $x (@$m) {
+ PublicInbox::Over::load_from_row($x);
+ push(@cache, $x->{num}, $x->{bytes} + 0, $x->{blob});
+ undef $x; # saves ~1.5M memory w/ 50k messages
+ }
+ } while (scalar(@$m) && ($beg = $cache[-3] + 1));
+ \@cache;
}
sub cmd_stat {
sub cmd_capa {
my ($self) = @_;
my $STLS = !$self->{ibx} && !$self->{sock}->can('stop_SSL') &&
- $self->{pop3d}->{accept_tls} ? "\nSTLS\r" : '';
+ $self->{pop3d}->{ssl_ctx_opt} ? "\nSTLS\r" : '';
$self->{expire} = ''; # "EXPIRE 0" allows clients to avoid DELE commands
<<EOM;
+OK Capability list follows\r
# callback used by PublicInbox::DS for any (e)poll (in/out/hup/err)
sub event_step {
my ($self) = @_;
+ local $SIG{__WARN__} = $self->{pop3d}->{warn_cb};
return unless $self->flush_write && $self->{sock} && !$self->{long_cb};
# only read more requests if we've drained the write buffer,