xoauth2.go

 1package fetcher
 2
 3import (
 4	"fmt"
 5
 6	"github.com/emersion/go-sasl"
 7)
 8
 9// xoauth2Client implements the XOAUTH2 SASL mechanism for IMAP/SMTP.
10// See https://developers.google.com/gmail/imap/xoauth2-protocol
11type xoauth2Client struct {
12	Username string
13	Token    string
14}
15
16func (a *xoauth2Client) Start() (mech string, ir []byte, err error) {
17	// XOAUTH2 initial response format:
18	// "user=" {User} "\x01auth=Bearer " {Access Token} "\x01\x01"
19	ir = []byte(fmt.Sprintf("user=%s\x01auth=Bearer %s\x01\x01", a.Username, a.Token))
20	return "XOAUTH2", ir, nil
21}
22
23func (a *xoauth2Client) Next(challenge []byte) ([]byte, error) {
24	// Server sent an error challenge; respond with empty to complete the exchange.
25	return []byte{}, nil
26}
27
28// Verify xoauth2Client implements sasl.Client at compile time.
29var _ sasl.Client = (*xoauth2Client)(nil)
30
31// newXOAuth2Client creates a new XOAUTH2 SASL client.
32func newXOAuth2Client(username, token string) sasl.Client {
33	return &xoauth2Client{Username: username, Token: token}
34}