session.go raw

   1  package internal
   2  
   3  import (
   4  	"context"
   5  	"encoding/json"
   6  	"net/http"
   7  
   8  	"github.com/go-acme/lego/v4/providers/dns/internal/errutils"
   9  )
  10  
  11  type token string
  12  
  13  const tokenKey token = "token"
  14  
  15  const authTokenHeader = "Auth-Token"
  16  
  17  // login Starts a new Dyn API Session. Authenticates using customerName, username, password
  18  // and receives a token to be used in for subsequent requests.
  19  // https://help.dyn.com/session-log-in/
  20  func (c *Client) login(ctx context.Context) (session, error) {
  21  	endpoint := c.baseURL.JoinPath("Session")
  22  
  23  	payload := &credentials{Customer: c.customerName, User: c.username, Pass: c.password}
  24  
  25  	req, err := newJSONRequest(ctx, http.MethodPost, endpoint, payload)
  26  	if err != nil {
  27  		return session{}, err
  28  	}
  29  
  30  	dynRes, err := c.do(req)
  31  	if err != nil {
  32  		return session{}, err
  33  	}
  34  
  35  	var s session
  36  
  37  	err = json.Unmarshal(dynRes.Data, &s)
  38  	if err != nil {
  39  		return session{}, errutils.NewUnmarshalError(req, http.StatusOK, dynRes.Data, err)
  40  	}
  41  
  42  	return s, nil
  43  }
  44  
  45  // Logout Destroys Dyn Session.
  46  // https://help.dyn.com/session-log-out/
  47  func (c *Client) Logout(ctx context.Context) error {
  48  	endpoint := c.baseURL.JoinPath("Session")
  49  
  50  	req, err := newJSONRequest(ctx, http.MethodDelete, endpoint, nil)
  51  	if err != nil {
  52  		return err
  53  	}
  54  
  55  	tok := getToken(ctx)
  56  	if tok != "" {
  57  		req.Header.Set(authTokenHeader, tok)
  58  	}
  59  
  60  	resp, err := c.HTTPClient.Do(req)
  61  	if err != nil {
  62  		return errutils.NewHTTPDoError(req, err)
  63  	}
  64  
  65  	defer func() { _ = resp.Body.Close() }()
  66  
  67  	if resp.StatusCode != http.StatusOK {
  68  		return errutils.NewUnexpectedResponseStatusCodeError(req, resp)
  69  	}
  70  
  71  	return nil
  72  }
  73  
  74  func (c *Client) CreateAuthenticatedContext(ctx context.Context) (context.Context, error) {
  75  	tok, err := c.login(ctx)
  76  	if err != nil {
  77  		return nil, err
  78  	}
  79  
  80  	return context.WithValue(ctx, tokenKey, tok.Token), nil
  81  }
  82  
  83  func getToken(ctx context.Context) string {
  84  	tok, ok := ctx.Value(tokenKey).(string)
  85  	if !ok {
  86  		return ""
  87  	}
  88  
  89  	return tok
  90  }
  91