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