Support TLS listeners (fixes issue #2).
This commit is contained in:
parent
b2cb7a02c3
commit
52e449011b
2 changed files with 57 additions and 0 deletions
5
smtpd.go
5
smtpd.go
|
@ -110,6 +110,11 @@ func (srv *Server) newSession(c net.Conn) (s *session) {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check if the underlying connection is already TLS.
|
||||||
|
// This will happen if the Listerner provided Serve()
|
||||||
|
// is from tls.Listen()
|
||||||
|
__, s.tls = c.(*tls.Conn)
|
||||||
|
|
||||||
s.scanner = bufio.NewScanner(s.reader)
|
s.scanner = bufio.NewScanner(s.reader)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
|
@ -1191,3 +1191,55 @@ func TestMailformedMAILFROM(t *testing.T) {
|
||||||
t.Fatalf("Quit failed: %v", err)
|
t.Fatalf("Quit failed: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestTLSListener(t *testing.T) {
|
||||||
|
|
||||||
|
cert, err := tls.X509KeyPair(localhostCert, localhostKey)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Cert load failed: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg := &tls.Config{
|
||||||
|
Certificates: []tls.Certificate{cert},
|
||||||
|
}
|
||||||
|
|
||||||
|
ln, err := tls.Listen("tcp", "127.0.0.1:0", cfg)
|
||||||
|
defer ln.Close()
|
||||||
|
|
||||||
|
addr := ln.Addr().String()
|
||||||
|
|
||||||
|
server := &smtpd.Server{
|
||||||
|
Authenticator: func(peer smtpd.Peer, username, password string) error { return nil },
|
||||||
|
}
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
server.Serve(ln)
|
||||||
|
}()
|
||||||
|
|
||||||
|
conn, err := tls.Dial("tcp", addr, &tls.Config{InsecureSkipVerify: true})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("couldn't connect to tls socket: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
c, err := smtp.NewClient(conn, "localhost")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("couldn't create client: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := c.Hello("localhost"); err != nil {
|
||||||
|
t.Fatalf("HELO failed: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := cmd(c.Text, 334, "AUTH PLAIN"); err != nil {
|
||||||
|
t.Fatalf("AUTH didn't work: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := cmd(c.Text, 235, "Zm9vAGJhcgBxdXV4"); err != nil {
|
||||||
|
t.Fatalf("AUTH didn't work: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := c.Quit(); err != nil {
|
||||||
|
t.Fatalf("Quit failed: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue