From 33aaf946633791f8954784a693de27990c43e0f5 Mon Sep 17 00:00:00 2001 From: Robin Jarry Date: Tue, 7 Dec 2021 00:00:01 +0100 Subject: imap: use low level tcp connection In preparation for tcp keepalive options, we need access to the net.TCPConn object associated with an IMAP connection. The only way to do this is to create the connection ourselves. No functional change. Signed-off-by: Robin Jarry --- worker/imap/worker.go | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/worker/imap/worker.go b/worker/imap/worker.go index 55469cf..80d861d 100644 --- a/worker/imap/worker.go +++ b/worker/imap/worker.go @@ -3,6 +3,7 @@ package imap import ( "crypto/tls" "fmt" + "net" "net/url" "strings" @@ -214,29 +215,44 @@ func (w *IMAPWorker) handleImapUpdate(update client.Update) { func (w *IMAPWorker) connect() (*client.Client, error) { var ( - c *client.Client - err error + conn *net.TCPConn + c *client.Client ) + + addr, err := net.ResolveTCPAddr("tcp", w.config.addr) + if err != nil { + return nil, err + } + + conn, err = net.DialTCP("tcp", nil, addr) + if err != nil { + return nil, err + } + + serverName, _, _ := net.SplitHostPort(w.config.addr) + tlsConfig := &tls.Config{ServerName: serverName} + switch w.config.scheme { case "imap": - c, err = client.Dial(w.config.addr) + c, err = client.New(conn) if err != nil { return nil, err } - if !w.config.insecure { - if err := c.StartTLS(&tls.Config{}); err != nil { + if err = c.StartTLS(tlsConfig); err != nil { return nil, err } } case "imaps": - c, err = client.DialTLS(w.config.addr, &tls.Config{}) + tlsConn := tls.Client(conn, tlsConfig) + c, err = client.New(tlsConn) if err != nil { return nil, err } default: return nil, fmt.Errorf("Unknown IMAP scheme %s", w.config.scheme) } + c.ErrorLog = w.worker.Logger if w.config.user != nil { -- cgit 1.4.1-2-gfad0