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