]> Cypherpunks repositories - gostls13.git/commitdiff
net/smtp: add TLSConnectionState accessor
authorBrad Fitzpatrick <brad@danga.com>
Sun, 28 Dec 2014 19:18:59 +0000 (11:18 -0800)
committerBrad Fitzpatrick <bradfitz@golang.org>
Sun, 28 Dec 2014 21:35:58 +0000 (21:35 +0000)
Fixes #9451

Change-Id: I0540e398b30c10779ac9d5a67a01d44bb6054a92
Reviewed-on: https://go-review.googlesource.com/2151
Reviewed-by: David Symonds <dsymonds@golang.org>
src/net/smtp/smtp.go
src/net/smtp/smtp_test.go

index 87dea442c46e1f7ae841290074aaa64f4e721874..c9b3c07aa8c50fc2b2fea73196fca239c7c846db 100644 (file)
@@ -157,6 +157,17 @@ func (c *Client) StartTLS(config *tls.Config) error {
        return c.ehlo()
 }
 
+// TLSConnectionState returns the client's TLS connection state.
+// The return values are their zero values if StartTLS did
+// not succeed.
+func (c *Client) TLSConnectionState() (state tls.ConnectionState, ok bool) {
+       tc, ok := c.conn.(*tls.Conn)
+       if !ok {
+               return
+       }
+       return tc.ConnectionState(), true
+}
+
 // Verify checks the validity of an email address on the server.
 // If Verify returns nil, the address is valid. A non-nil return
 // does not necessarily indicate an invalid address. Many servers
index 5c659e8a0950085133230241fd66c354dcbbe894..3ae0d5bf1ddea23ff7d46ac43e7be7ea8c46cf97 100644 (file)
@@ -571,6 +571,50 @@ func TestTLSClient(t *testing.T) {
        }
 }
 
+func TestTLSConnState(t *testing.T) {
+       ln := newLocalListener(t)
+       defer ln.Close()
+       clientDone := make(chan bool)
+       serverDone := make(chan bool)
+       go func() {
+               defer close(serverDone)
+               c, err := ln.Accept()
+               if err != nil {
+                       t.Errorf("Server accept: %v", err)
+                       return
+               }
+               defer c.Close()
+               if err := serverHandle(c, t); err != nil {
+                       t.Errorf("server error: %v", err)
+               }
+       }()
+       go func() {
+               defer close(clientDone)
+               c, err := Dial(ln.Addr().String())
+               if err != nil {
+                       t.Errorf("Client dial: %v", err)
+                       return
+               }
+               defer c.Quit()
+               cfg := &tls.Config{ServerName: "example.com"}
+               testHookStartTLS(cfg) // set the RootCAs
+               if err := c.StartTLS(cfg); err != nil {
+                       t.Errorf("StartTLS: %v", err)
+                       return
+               }
+               cs, ok := c.TLSConnectionState()
+               if !ok {
+                       t.Errorf("TLSConnectionState returned ok == false; want true")
+                       return
+               }
+               if cs.Version == 0 || !cs.HandshakeComplete {
+                       t.Errorf("ConnectionState = %#v; expect non-zero Version and HandshakeComplete", cs)
+               }
+       }()
+       <-clientDone
+       <-serverDone
+}
+
 func newLocalListener(t *testing.T) net.Listener {
        ln, err := net.Listen("tcp", "127.0.0.1:0")
        if err != nil {