identity.go raw
1 package internal
2
3 import (
4 "context"
5 "encoding/json"
6 "fmt"
7 "io"
8 "net/http"
9 "net/url"
10 "time"
11
12 "github.com/go-acme/lego/v4/providers/dns/internal/errutils"
13 )
14
15 const identityBaseURL = "https://identity.%s.conoha.io"
16
17 type Identifier struct {
18 baseURL *url.URL
19 HTTPClient *http.Client
20 }
21
22 // NewIdentifier creates a new Identifier.
23 func NewIdentifier(region string) (*Identifier, error) {
24 baseURL, err := url.Parse(fmt.Sprintf(identityBaseURL, region))
25 if err != nil {
26 return nil, err
27 }
28
29 return &Identifier{
30 baseURL: baseURL,
31 HTTPClient: &http.Client{Timeout: 5 * time.Second},
32 }, nil
33 }
34
35 // GetToken gets valid token information.
36 // https://doc.conoha.jp/reference/api-vps2/api-identity-vps2/identity-post_tokens-v2/?btn_id=reference-paas-dns-delete-a-record-v2--sidebar_reference-identity-post_tokens-v2
37 func (c *Identifier) GetToken(ctx context.Context, auth Auth) (*IdentityResponse, error) {
38 endpoint := c.baseURL.JoinPath("v2.0", "tokens")
39
40 req, err := newJSONRequest(ctx, http.MethodPost, endpoint, &IdentityRequest{Auth: auth})
41 if err != nil {
42 return nil, err
43 }
44
45 identity := &IdentityResponse{}
46
47 err = c.do(req, identity)
48 if err != nil {
49 return nil, err
50 }
51
52 return identity, nil
53 }
54
55 func (c *Identifier) do(req *http.Request, result any) error {
56 resp, err := c.HTTPClient.Do(req)
57 if err != nil {
58 return errutils.NewHTTPDoError(req, err)
59 }
60
61 defer func() { _ = resp.Body.Close() }()
62
63 if resp.StatusCode != http.StatusOK {
64 return errutils.NewUnexpectedResponseStatusCodeError(req, resp)
65 }
66
67 if result == nil {
68 return nil
69 }
70
71 raw, err := io.ReadAll(resp.Body)
72 if err != nil {
73 return errutils.NewReadResponseError(req, resp.StatusCode, err)
74 }
75
76 err = json.Unmarshal(raw, result)
77 if err != nil {
78 return errutils.NewUnmarshalError(req, resp.StatusCode, raw, err)
79 }
80
81 return nil
82 }
83