about summary refs log tree commit homepage
path: root/lib/PublicInbox
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2021-09-18 09:33:30 +0000
committerEric Wong <e@80x24.org>2021-09-18 20:25:52 +0000
commit30a88a6629af3146f68f9fe1f13054b7633559bf (patch)
tree0c803618cdef350830be65543fab98a8cc634647 /lib/PublicInbox
parent74702eff18072dc8bf1c56ffa334b0dc998648b8 (diff)
downloadpublic-inbox-30a88a6629af3146f68f9fe1f13054b7633559bf.tar.gz
While Non-TLS IMAP worked perfectly with IO::Socket::Socks
and Mail::IMAPClient; we need to wrap the IO::Socket::Socks
object with IO::Socket::SSL before handing it to
Mail::IMAPClient.
Diffstat (limited to 'lib/PublicInbox')
-rw-r--r--lib/PublicInbox/NetReader.pm18
1 files changed, 11 insertions, 7 deletions
diff --git a/lib/PublicInbox/NetReader.pm b/lib/PublicInbox/NetReader.pm
index 8eff847e..a5aab650 100644
--- a/lib/PublicInbox/NetReader.pm
+++ b/lib/PublicInbox/NetReader.pm
@@ -43,21 +43,26 @@ EOM
 
 sub mic_new ($$$$) {
         my ($self, $mic_arg, $sec, $uri) = @_;
-        my %mic_arg = %$mic_arg;
+        my %mic_arg = (%$mic_arg, Keepalive => 1);
         my $sa = $self->{cfg_opt}->{$sec}->{-proxy_cfg} || $self->{-proxy_cli};
         if ($sa) {
                 # this `require' needed for worker[1..Inf], since socks_args
                 # only got called in worker[0]
                 require IO::Socket::Socks;
-
-                my %opt = %$sa;
+                my %opt = (%$sa, Keepalive => 1);
                 $opt{SocksDebug} = 1 if $mic_arg{Debug};
                 $opt{ConnectAddr} = delete $mic_arg{Server};
                 $opt{ConnectPort} = delete $mic_arg{Port};
-                $mic_arg{Socket} = IO::Socket::Socks->new(%opt) or die
-                        "E: <$$uri> ".eval('$IO::Socket::Socks::SOCKS_ERROR');
+                my $s = IO::Socket::Socks->new(%opt) or die
+                        "E: <$uri> ".eval('$IO::Socket::Socks::SOCKS_ERROR');
+                if ($mic_arg->{Ssl}) { # for imaps://
+                        require IO::Socket::SSL;
+                        $s = IO::Socket::SSL->start_SSL($s) or die
+                                "E: <$uri> ".(IO::Socket::SSL->errstr // '');
+                }
+                $mic_arg{Socket} = $s;
         }
-        PublicInbox::IMAPClient->new(%mic_arg, Keepalive => 1);
+        PublicInbox::IMAPClient->new(%mic_arg);
 }
 
 sub auth_anon_cb { '' }; # for Mail::IMAPClient::Authcallback
@@ -103,7 +108,6 @@ sub mic_for ($$$$) { # mic = Mail::IMAPClient
         my $mic_arg = {
                 Port => $uri->port,
                 Server => $host,
-                Ssl => $uri->scheme eq 'imaps',
                 %$common, # may set Starttls, Compress, Debug ....
         };
         $mic_arg->{Ssl} = 1 if $uri->scheme eq 'imaps';