Skip to content

Commit 26d5573

Browse files
committed
net/smtp: add TLSConnectionState accessor
Fixes #9451 Change-Id: I0540e398b30c10779ac9d5a67a01d44bb6054a92 Reviewed-on: https://go-review.googlesource.com/2151 Reviewed-by: David Symonds <[email protected]>
1 parent d4e48ee commit 26d5573

File tree

2 files changed

+55
-0
lines changed

2 files changed

+55
-0
lines changed

src/net/smtp/smtp.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,17 @@ func (c *Client) StartTLS(config *tls.Config) error {
157157
return c.ehlo()
158158
}
159159

160+
// TLSConnectionState returns the client's TLS connection state.
161+
// The return values are their zero values if StartTLS did
162+
// not succeed.
163+
func (c *Client) TLSConnectionState() (state tls.ConnectionState, ok bool) {
164+
tc, ok := c.conn.(*tls.Conn)
165+
if !ok {
166+
return
167+
}
168+
return tc.ConnectionState(), true
169+
}
170+
160171
// Verify checks the validity of an email address on the server.
161172
// If Verify returns nil, the address is valid. A non-nil return
162173
// does not necessarily indicate an invalid address. Many servers

src/net/smtp/smtp_test.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -571,6 +571,50 @@ func TestTLSClient(t *testing.T) {
571571
}
572572
}
573573

574+
func TestTLSConnState(t *testing.T) {
575+
ln := newLocalListener(t)
576+
defer ln.Close()
577+
clientDone := make(chan bool)
578+
serverDone := make(chan bool)
579+
go func() {
580+
defer close(serverDone)
581+
c, err := ln.Accept()
582+
if err != nil {
583+
t.Errorf("Server accept: %v", err)
584+
return
585+
}
586+
defer c.Close()
587+
if err := serverHandle(c, t); err != nil {
588+
t.Errorf("server error: %v", err)
589+
}
590+
}()
591+
go func() {
592+
defer close(clientDone)
593+
c, err := Dial(ln.Addr().String())
594+
if err != nil {
595+
t.Errorf("Client dial: %v", err)
596+
return
597+
}
598+
defer c.Quit()
599+
cfg := &tls.Config{ServerName: "example.com"}
600+
testHookStartTLS(cfg) // set the RootCAs
601+
if err := c.StartTLS(cfg); err != nil {
602+
t.Errorf("StartTLS: %v", err)
603+
return
604+
}
605+
cs, ok := c.TLSConnectionState()
606+
if !ok {
607+
t.Errorf("TLSConnectionState returned ok == false; want true")
608+
return
609+
}
610+
if cs.Version == 0 || !cs.HandshakeComplete {
611+
t.Errorf("ConnectionState = %#v; expect non-zero Version and HandshakeComplete", cs)
612+
}
613+
}()
614+
<-clientDone
615+
<-serverDone
616+
}
617+
574618
func newLocalListener(t *testing.T) net.Listener {
575619
ln, err := net.Listen("tcp", "127.0.0.1:0")
576620
if err != nil {

0 commit comments

Comments
 (0)