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  }