github.com/jordwest/imap-server@v0.0.0-20200627020849-1cf758ba359f/conn/command_authenticate.go (about) 1 package conn 2 3 import ( 4 "encoding/base64" 5 "regexp" 6 ) 7 8 // Handles PLAIN text AUTHENTICATE command 9 func cmdAuthPlain(args commandArgs, c *Conn) { 10 // Compile login regex 11 loginRE := regexp.MustCompile("(?:[A-z0-9]+)?\x00([A-z0-9]+)\x00([A-z0-9]+)") 12 13 // Tell client to go ahead 14 c.writeResponse("+", "") 15 16 // Wait for client to send auth details 17 ok := c.RwcScanner.Scan() 18 if !ok { 19 return 20 } 21 authDetails := c.RwcScanner.Text() 22 23 data, err := base64.StdEncoding.DecodeString(authDetails) 24 if err != nil { 25 c.writeResponse("", "BAD Invalid auth details") 26 return 27 } 28 match := loginRE.FindSubmatch(data) 29 if len(match) != 3 { 30 c.writeResponse(args.ID(), "NO Incorrect username/password") 31 return 32 } 33 c.User, err = c.Mailstore.Authenticate(string(match[1]), string(match[2])) 34 if err != nil { 35 c.writeResponse(args.ID(), "NO Incorrect username/password") 36 return 37 } 38 c.SetState(StateAuthenticated) 39 c.writeResponse(args.ID(), "OK Authenticated") 40 }