Support TLS in POP3.
authorRobert Sesek <rsesek@bluestatic.org>
Sun, 18 Dec 2016 00:47:32 +0000 (19:47 -0500)
committerRobert Sesek <rsesek@bluestatic.org>
Sun, 18 Dec 2016 00:47:32 +0000 (19:47 -0500)
config.go
pop3.go

index a66c37055e0d38f5ebe7fb05b1da85c3e78e80cf..a825cd22d69ca1d3e97c69a3cc1c2f58ec27b724 100644 (file)
--- a/config.go
+++ b/config.go
@@ -1,5 +1,9 @@
 package main
 
+import (
+       "crypto/tls"
+)
+
 type Config struct {
        SMTPPort int
        POP3Port int
@@ -26,3 +30,28 @@ type Server struct {
        // Blacklisted addresses that should not accept mail.
        BlacklistedAddresses []string
 }
+
+func (c Config) GetTLSConfig() (*tls.Config, error) {
+       certs := make([]tls.Certificate, 0, len(c.Servers))
+       for _, server := range c.Servers {
+               if server.TLSCertPath == "" {
+                       continue
+               }
+
+               cert, err := tls.LoadX509KeyPair(server.TLSCertPath, server.TLSKeyPath)
+               if err != nil {
+                       return nil, err
+               }
+               certs = append(certs, cert)
+       }
+
+       if len(certs) == 0 {
+               return nil, nil
+       }
+
+       config := &tls.Config{
+               Certificates: certs,
+       }
+       config.BuildNameToCertificate()
+       return config, nil
+}
diff --git a/pop3.go b/pop3.go
index 6d8dfd26949e28cac89cfb6d1bce89ae91db7f88..0e21ec1fcb938c228fdfebf0083468946ddbea10 100644 (file)
--- a/pop3.go
+++ b/pop3.go
@@ -1,6 +1,7 @@
 package main
 
 import (
+       "crypto/tls"
        "errors"
        "fmt"
        "io"
@@ -33,7 +34,20 @@ func (server *pop3Server) run() {
                }
        }
 
-       l, err := net.Listen("tcp", fmt.Sprintf(":%d", server.config.POP3Port))
+       tlsConfig, err := server.config.GetTLSConfig()
+       if err != nil {
+               server.rc <- err
+               return
+       }
+
+       addr := fmt.Sprintf(":%d", server.config.POP3Port)
+
+       var l net.Listener
+       if tlsConfig == nil {
+               l, err = net.Listen("tcp", addr)
+       } else {
+               l, err = tls.Listen("tcp", addr, tlsConfig)
+       }
        if err != nil {
                server.rc <- err
                return