]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/POP3.pm
daemon: reload TLS certs and keys on SIGHUP
[public-inbox.git] / lib / PublicInbox / POP3.pm
index 60eedea761dace658a8b77f1ca6bb167c321b9e7..7469922b2249f405be5a012eaa25e66c681087da 100644 (file)
@@ -130,12 +130,12 @@ sub cmd_pass {
 
 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;
 }
@@ -148,12 +148,21 @@ sub _stat_cache ($) {
        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 {
@@ -272,7 +281,7 @@ sub cmd_dele {
 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