]> Cypherpunks repositories - gostls13.git/commitdiff
net/smtp: preserve Auth errors
authorRick Arnold <rickarnoldjr@gmail.com>
Fri, 28 Jun 2013 19:24:45 +0000 (12:24 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Fri, 28 Jun 2013 19:24:45 +0000 (12:24 -0700)
If authentication failed, the initial error was being thrown away.

Fixes #5700.

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/10744043

src/pkg/net/smtp/smtp.go
src/pkg/net/smtp/smtp_test.go

index dc7e1ceb8f34f8ae21d699984b26a8f0e91b8f25..212c96c1d51cb811789b512bc4d0575b3a8aaec7 100644 (file)
@@ -196,7 +196,9 @@ func (c *Client) Auth(a Auth) error {
                default:
                        err = &textproto.Error{Code: code, Msg: msg64}
                }
-               resp, err = a.Next(msg, code == 334)
+               if err == nil {
+                       resp, err = a.Next(msg, code == 334)
+               }
                if err != nil {
                        // abort the AUTH
                        c.cmd(501, "*")
index b696dbe3cb856fb898ae7edc5d17fb2878b393dc..2133dc7c7baeccdce64274854bd91583487dcaa8 100644 (file)
@@ -504,3 +504,47 @@ SendMail is working for me.
 .
 QUIT
 `
+
+func TestAuthFailed(t *testing.T) {
+       server := strings.Join(strings.Split(authFailedServer, "\n"), "\r\n")
+       client := strings.Join(strings.Split(authFailedClient, "\n"), "\r\n")
+       var cmdbuf bytes.Buffer
+       bcmdbuf := bufio.NewWriter(&cmdbuf)
+       var fake faker
+       fake.ReadWriter = bufio.NewReadWriter(bufio.NewReader(strings.NewReader(server)), bcmdbuf)
+       c, err := NewClient(fake, "fake.host")
+       if err != nil {
+               t.Fatalf("NewClient: %v", err)
+       }
+       defer c.Close()
+
+       c.tls = true
+       c.serverName = "smtp.google.com"
+       err = c.Auth(PlainAuth("", "user", "pass", "smtp.google.com"))
+
+       if err == nil {
+               t.Error("Auth: expected error; got none")
+       } else if err.Error() != "535 Invalid credentials\nplease see www.example.com" {
+               t.Errorf("Auth: got error: %v, want: %s", err, "535 Invalid credentials\nplease see www.example.com")
+       }
+
+       bcmdbuf.Flush()
+       actualcmds := cmdbuf.String()
+       if client != actualcmds {
+               t.Errorf("Got:\n%s\nExpected:\n%s", actualcmds, client)
+       }
+}
+
+var authFailedServer = `220 hello world
+250-mx.google.com at your service
+250 AUTH LOGIN PLAIN
+535-Invalid credentials
+535 please see www.example.com
+221 Goodbye
+`
+
+var authFailedClient = `EHLO localhost
+AUTH PLAIN AHVzZXIAcGFzcw==
+*
+QUIT
+`