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}