]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/Daemon.pm
netd: setup TLS bits for well-known STARTTLS ports
[public-inbox.git] / lib / PublicInbox / Daemon.pm
index d08ce0f9a4148905e05b5b8321afeb9a12552350..bceae6e5699f5d13412f7cdc4e544074b58fd1d7 100644 (file)
@@ -32,8 +32,8 @@ my %tls_opt; # scheme://sockname => args for IO::Socket::SSL->start_SSL
 my $reexec_pid;
 my ($uid, $gid);
 my ($default_cert, $default_key);
-my %KNOWN_TLS = ( 443 => 'https', 563 => 'nntps', 993 => 'imaps' );
-my %KNOWN_STARTTLS = ( 119 => 'nntp', 143 => 'imap' );
+my %KNOWN_TLS = (443 => 'https', 563 => 'nntps', 993 => 'imaps', 995 =>'pop3s');
+my %KNOWN_STARTTLS = (110 => 'pop3', 119 => 'nntp', 143 => 'imap');
 
 sub accept_tls_opt ($) {
        my ($opt_str) = @_;
@@ -77,7 +77,7 @@ sub accept_tls_opt ($) {
 
 sub load_mod ($) {
        my ($scheme) = @_;
-       my $modc = "PublicInbox::\U$1";
+       my $modc = "PublicInbox::\U$scheme";
        my $mod = $modc.'D';
        eval "require $mod"; # IMAPD|HTTPD|NNTPD|POP3D
        die $@ if $@;
@@ -155,7 +155,7 @@ EOF
                        $tls_opt{"$scheme://$l"} = accept_tls_opt($1);
                } elsif (defined($default_cert)) {
                        $tls_opt{"$scheme://$l"} = accept_tls_opt('');
-               } elsif ($scheme =~ /\A(?:https|imaps|imaps)\z/) {
+               } elsif ($scheme =~ /\A(?:https|imaps|nntps|pop3s)\z/) {
                        die "$orig specified w/o cert=\n";
                }
                $scheme =~ /\A(http|imap|nntp|pop3)/ and
@@ -204,9 +204,11 @@ EOF
        for my $sockname (@inherited_names) {
                $sockname =~ /:([0-9]+)\z/ or next;
                if (my $scheme = $KNOWN_TLS{$1}) {
+                       $xnetd->{$sockname} = load_mod(substr($scheme, 0, -1));
                        $tls_opt{"$scheme://$sockname"} ||= accept_tls_opt('');
                } elsif (($scheme = $KNOWN_STARTTLS{$1})) {
-                       next if $tls_opt{"$scheme://$sockname"};
+                       $xnetd->{$sockname} = load_mod($scheme);
+                       $tls_opt{"$scheme://$sockname"} ||= accept_tls_opt('');
                        $tls_opt{''} ||= accept_tls_opt('');
                }
        }
@@ -620,7 +622,7 @@ sub daemon_loop ($) {
                $l =~ s!\A([^:]+)://!!;
                my $scheme = $1 // '';
                my $xn = $xnetd->{$l} // $xnetd->{''};
-               if ($scheme =~ m!\A(?:https|imaps|nntps)!) {
+               if ($scheme =~ m!\A(?:https|imaps|nntps|pop3s)!) {
                        $post_accept{$l} = tls_start_cb($v, $xn->{post_accept});
                } elsif ($xn->{tlsd}) { # STARTTLS, $k eq '' is OK
                        $xn->{tlsd}->{accept_tls} = $v;