diff --git a/README.md b/README.md index 548c8b2f74..85e3e3f782 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,7 @@ Detailed documentation is available [here](https://go-acme.github.io/lego/dns). Cloudflare ClouDNS - CloudXNS + CloudXNS (Deprecated) ConoHa Constellix Core-Networks diff --git a/cmd/zz_gen_cmd_dnshelp.go b/cmd/zz_gen_cmd_dnshelp.go index 112ce281d5..936a99ec4b 100644 --- a/cmd/zz_gen_cmd_dnshelp.go +++ b/cmd/zz_gen_cmd_dnshelp.go @@ -563,7 +563,7 @@ func displayDNSHelp(w io.Writer, name string) error { case "cloudxns": // generated from: providers/dns/cloudxns/cloudxns.toml - ew.writeln(`Configuration for CloudXNS.`) + ew.writeln(`Configuration for CloudXNS (Deprecated).`) ew.writeln(`Code: 'cloudxns'`) ew.writeln(`Since: 'v0.5.0'`) ew.writeln() diff --git a/docs/content/dns/zz_gen_cloudxns.md b/docs/content/dns/zz_gen_cloudxns.md index 16c4543505..5a064bebea 100644 --- a/docs/content/dns/zz_gen_cloudxns.md +++ b/docs/content/dns/zz_gen_cloudxns.md @@ -1,20 +1,20 @@ --- -title: "CloudXNS" +title: "CloudXNS (Deprecated)" date: 2019-03-03T16:39:46+01:00 draft: false slug: cloudxns dnsprovider: since: "v0.5.0" code: "cloudxns" - url: "https://www.cloudxns.net/" + url: "https://github.com/go-acme/lego/issues/2323" --- +The CloudXNS DNS provider has shut down. -Configuration for [CloudXNS](https://www.cloudxns.net/). @@ -23,7 +23,7 @@ Configuration for [CloudXNS](https://www.cloudxns.net/). - Since: v0.5.0 -Here is an example bash command using the CloudXNS provider: +Here is an example bash command using the CloudXNS (Deprecated) provider: ```bash CLOUDXNS_API_KEY=xxxx \ @@ -60,9 +60,6 @@ More information [here]({{% ref "dns#configuration-and-credentials" %}}). -## More information - -- [API documentation](https://www.cloudxns.net/Public/Doc/CloudXNS_api2.0_doc_zh-cn.zip) diff --git a/providers/dns/cloudxns/cloudxns.go b/providers/dns/cloudxns/cloudxns.go index 6269b8da7e..25ff17573e 100644 --- a/providers/dns/cloudxns/cloudxns.go +++ b/providers/dns/cloudxns/cloudxns.go @@ -2,15 +2,11 @@ package cloudxns import ( - "context" "errors" - "fmt" "net/http" "time" "github.com/go-acme/lego/v4/challenge/dns01" - "github.com/go-acme/lego/v4/platform/config/env" - "github.com/go-acme/lego/v4/providers/dns/cloudxns/internal" ) // Environment variables names. @@ -38,101 +34,34 @@ type Config struct { // NewDefaultConfig returns a default configuration for the DNSProvider. func NewDefaultConfig() *Config { - return &Config{ - PropagationTimeout: env.GetOrDefaultSecond(EnvPropagationTimeout, dns01.DefaultPropagationTimeout), - PollingInterval: env.GetOrDefaultSecond(EnvPollingInterval, dns01.DefaultPollingInterval), - TTL: env.GetOrDefaultInt(EnvTTL, dns01.DefaultTTL), - HTTPClient: &http.Client{ - Timeout: env.GetOrDefaultSecond(EnvHTTPTimeout, 30*time.Second), - }, - } + return &Config{} } // DNSProvider implements the challenge.Provider interface. -type DNSProvider struct { - config *Config - client *internal.Client -} +type DNSProvider struct{} // NewDNSProvider returns a DNSProvider instance configured for CloudXNS. -// Credentials must be passed in the environment variables: -// CLOUDXNS_API_KEY and CLOUDXNS_SECRET_KEY. func NewDNSProvider() (*DNSProvider, error) { - values, err := env.Get(EnvAPIKey, EnvSecretKey) - if err != nil { - return nil, fmt.Errorf("cloudxns: %w", err) - } - - config := NewDefaultConfig() - config.APIKey = values[EnvAPIKey] - config.SecretKey = values[EnvSecretKey] - - return NewDNSProviderConfig(config) + return NewDNSProviderConfig(&Config{}) } // NewDNSProviderConfig return a DNSProvider instance configured for CloudXNS. -func NewDNSProviderConfig(config *Config) (*DNSProvider, error) { - if config == nil { - return nil, errors.New("cloudxns: the configuration of the DNS provider is nil") - } - - client, err := internal.NewClient(config.APIKey, config.SecretKey) - if err != nil { - return nil, fmt.Errorf("cloudxns: %w", err) - } - - if config.HTTPClient != nil { - client.HTTPClient = config.HTTPClient - } - - return &DNSProvider{client: client, config: config}, nil +func NewDNSProviderConfig(_ *Config) (*DNSProvider, error) { + return nil, errors.New("cloudxns: provider has shut down") } // Present creates a TXT record to fulfill the dns-01 challenge. -func (d *DNSProvider) Present(domain, token, keyAuth string) error { - challengeInfo := dns01.GetChallengeInfo(domain, keyAuth) - - ctx := context.Background() - - info, err := d.client.GetDomainInformation(ctx, challengeInfo.EffectiveFQDN) - if err != nil { - return fmt.Errorf("cloudxns: %w", err) - } - - err = d.client.AddTxtRecord(ctx, info, challengeInfo.EffectiveFQDN, challengeInfo.Value, d.config.TTL) - if err != nil { - return fmt.Errorf("cloudxns: %w", err) - } - +func (d *DNSProvider) Present(_, _, _ string) error { return nil } // CleanUp removes the TXT record matching the specified parameters. -func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error { - challengeInfo := dns01.GetChallengeInfo(domain, keyAuth) - - ctx := context.Background() - - info, err := d.client.GetDomainInformation(ctx, challengeInfo.EffectiveFQDN) - if err != nil { - return fmt.Errorf("cloudxns: %w", err) - } - - record, err := d.client.FindTxtRecord(ctx, info.ID, challengeInfo.EffectiveFQDN) - if err != nil { - return fmt.Errorf("cloudxns: %w", err) - } - - err = d.client.RemoveTxtRecord(ctx, record.RecordID, info.ID) - if err != nil { - return fmt.Errorf("cloudxns: %w", err) - } - +func (d *DNSProvider) CleanUp(_, _, _ string) error { return nil } // Timeout returns the timeout and interval to use when checking for DNS propagation. // Adjusting here to cope with spikes in propagation times. func (d *DNSProvider) Timeout() (timeout, interval time.Duration) { - return d.config.PropagationTimeout, d.config.PollingInterval + return dns01.DefaultPropagationTimeout, dns01.DefaultPollingInterval } diff --git a/providers/dns/cloudxns/cloudxns.toml b/providers/dns/cloudxns/cloudxns.toml index 4f5424b324..43b776e58f 100644 --- a/providers/dns/cloudxns/cloudxns.toml +++ b/providers/dns/cloudxns/cloudxns.toml @@ -1,6 +1,8 @@ -Name = "CloudXNS" -Description = """""" -URL = "https://www.cloudxns.net/" +Name = "CloudXNS (Deprecated)" +Description = ''' +The CloudXNS DNS provider has shut down. +''' +URL = "https://github.com/go-acme/lego/issues/2323" Code = "cloudxns" Since = "v0.5.0" @@ -19,6 +21,3 @@ lego --email you@example.com --dns cloudxns --domains my.example.org run CLOUDXNS_PROPAGATION_TIMEOUT = "Maximum waiting time for DNS propagation" CLOUDXNS_TTL = "The TTL of the TXT record used for the DNS challenge" CLOUDXNS_HTTP_TIMEOUT = "API request timeout" - -[Links] - API = "https://www.cloudxns.net/Public/Doc/CloudXNS_api2.0_doc_zh-cn.zip" diff --git a/providers/dns/cloudxns/cloudxns_test.go b/providers/dns/cloudxns/cloudxns_test.go deleted file mode 100644 index 0b3271761e..0000000000 --- a/providers/dns/cloudxns/cloudxns_test.go +++ /dev/null @@ -1,152 +0,0 @@ -package cloudxns - -import ( - "testing" - "time" - - "github.com/go-acme/lego/v4/platform/tester" - "github.com/stretchr/testify/require" -) - -const envDomain = envNamespace + "DOMAIN" - -var envTest = tester.NewEnvTest( - EnvAPIKey, - EnvSecretKey). - WithDomain(envDomain) - -func TestNewDNSProvider(t *testing.T) { - testCases := []struct { - desc string - envVars map[string]string - expected string - }{ - { - desc: "success", - envVars: map[string]string{ - EnvAPIKey: "123", - EnvSecretKey: "456", - }, - }, - { - desc: "missing credentials", - envVars: map[string]string{ - EnvAPIKey: "", - EnvSecretKey: "", - }, - expected: "cloudxns: some credentials information are missing: CLOUDXNS_API_KEY,CLOUDXNS_SECRET_KEY", - }, - { - desc: "missing API key", - envVars: map[string]string{ - EnvAPIKey: "", - EnvSecretKey: "456", - }, - expected: "cloudxns: some credentials information are missing: CLOUDXNS_API_KEY", - }, - { - desc: "missing secret key", - envVars: map[string]string{ - EnvAPIKey: "123", - EnvSecretKey: "", - }, - expected: "cloudxns: some credentials information are missing: CLOUDXNS_SECRET_KEY", - }, - } - - for _, test := range testCases { - t.Run(test.desc, func(t *testing.T) { - defer envTest.RestoreEnv() - envTest.ClearEnv() - - envTest.Apply(test.envVars) - - p, err := NewDNSProvider() - - if test.expected == "" { - require.NoError(t, err) - require.NotNil(t, p) - require.NotNil(t, p.config) - require.NotNil(t, p.client) - } else { - require.EqualError(t, err, test.expected) - } - }) - } -} - -func TestNewDNSProviderConfig(t *testing.T) { - testCases := []struct { - desc string - apiKey string - secretKey string - expected string - }{ - { - desc: "success", - apiKey: "123", - secretKey: "456", - }, - { - desc: "missing credentials", - expected: "cloudxns: credentials missing: apiKey", - }, - { - desc: "missing api key", - secretKey: "456", - expected: "cloudxns: credentials missing: apiKey", - }, - { - desc: "missing secret key", - apiKey: "123", - expected: "cloudxns: credentials missing: secretKey", - }, - } - - for _, test := range testCases { - t.Run(test.desc, func(t *testing.T) { - config := NewDefaultConfig() - config.APIKey = test.apiKey - config.SecretKey = test.secretKey - - p, err := NewDNSProviderConfig(config) - - if test.expected == "" { - require.NoError(t, err) - require.NotNil(t, p) - require.NotNil(t, p.config) - require.NotNil(t, p.client) - } else { - require.EqualError(t, err, test.expected) - } - }) - } -} - -func TestLivePresent(t *testing.T) { - if !envTest.IsLiveTest() { - t.Skip("skipping live test") - } - - envTest.RestoreEnv() - provider, err := NewDNSProvider() - require.NoError(t, err) - - err = provider.Present(envTest.GetDomain(), "", "123d==") - require.NoError(t, err) -} - -func TestLiveCleanUp(t *testing.T) { - if !envTest.IsLiveTest() { - t.Skip("skipping live test") - } - - envTest.RestoreEnv() - provider, err := NewDNSProvider() - require.NoError(t, err) - - time.Sleep(2 * time.Second) - - err = provider.CleanUp(envTest.GetDomain(), "", "123d==") - require.NoError(t, err) -} diff --git a/providers/dns/cloudxns/internal/client.go b/providers/dns/cloudxns/internal/client.go deleted file mode 100644 index 37f10fe872..0000000000 --- a/providers/dns/cloudxns/internal/client.go +++ /dev/null @@ -1,221 +0,0 @@ -package internal - -import ( - "bytes" - "context" - "crypto/md5" - "encoding/hex" - "encoding/json" - "errors" - "fmt" - "io" - "net/http" - "net/url" - "strconv" - "time" - - "github.com/go-acme/lego/v4/challenge/dns01" - "github.com/go-acme/lego/v4/providers/dns/internal/errutils" -) - -const defaultBaseURL = "https://www.cloudxns.net/api2/" - -// Client CloudXNS client. -type Client struct { - apiKey string - secretKey string - - baseURL *url.URL - HTTPClient *http.Client -} - -// NewClient creates a CloudXNS client. -func NewClient(apiKey, secretKey string) (*Client, error) { - if apiKey == "" { - return nil, errors.New("credentials missing: apiKey") - } - - if secretKey == "" { - return nil, errors.New("credentials missing: secretKey") - } - - baseURL, _ := url.Parse(defaultBaseURL) - - return &Client{ - apiKey: apiKey, - secretKey: secretKey, - baseURL: baseURL, - HTTPClient: &http.Client{Timeout: 10 * time.Second}, - }, nil -} - -// GetDomainInformation Get domain name information for a FQDN. -func (c *Client) GetDomainInformation(ctx context.Context, fqdn string) (*Data, error) { - endpoint := c.baseURL.JoinPath("domain") - - req, err := c.newRequest(ctx, http.MethodGet, endpoint, nil) - if err != nil { - return nil, err - } - - authZone, err := dns01.FindZoneByFqdn(fqdn) - if err != nil { - return nil, fmt.Errorf("could not find zone: %w", err) - } - - var domains []Data - err = c.do(req, &domains) - if err != nil { - return nil, err - } - - for _, data := range domains { - if data.Domain == authZone { - return &data, nil - } - } - - return nil, fmt.Errorf("zone %s not found for domain %s", authZone, fqdn) -} - -// FindTxtRecord return the TXT record a zone ID and a FQDN. -func (c *Client) FindTxtRecord(ctx context.Context, zoneID, fqdn string) (*TXTRecord, error) { - endpoint := c.baseURL.JoinPath("record", zoneID) - - query := endpoint.Query() - query.Set("host_id", "0") - query.Set("offset", "0") - query.Set("row_num", "2000") - endpoint.RawQuery = query.Encode() - - req, err := c.newRequest(ctx, http.MethodGet, endpoint, nil) - if err != nil { - return nil, err - } - - var records []TXTRecord - err = c.do(req, &records) - if err != nil { - return nil, err - } - - for _, record := range records { - if record.Host == dns01.UnFqdn(fqdn) && record.Type == "TXT" { - return &record, nil - } - } - - return nil, fmt.Errorf("no existing record found for %q", fqdn) -} - -// AddTxtRecord add a TXT record. -func (c *Client) AddTxtRecord(ctx context.Context, info *Data, fqdn, value string, ttl int) error { - id, err := strconv.Atoi(info.ID) - if err != nil { - return fmt.Errorf("invalid zone ID: %w", err) - } - - endpoint := c.baseURL.JoinPath("record") - - subDomain, err := dns01.ExtractSubDomain(fqdn, info.Domain) - if err != nil { - return err - } - - record := TXTRecord{ - ID: id, - Host: subDomain, - Value: value, - Type: "TXT", - LineID: 1, - TTL: ttl, - } - - req, err := c.newRequest(ctx, http.MethodPost, endpoint, record) - if err != nil { - return err - } - - return c.do(req, nil) -} - -// RemoveTxtRecord remove a TXT record. -func (c *Client) RemoveTxtRecord(ctx context.Context, recordID, zoneID string) error { - endpoint := c.baseURL.JoinPath("record", recordID, zoneID) - - req, err := c.newRequest(ctx, http.MethodDelete, endpoint, nil) - if err != nil { - return err - } - - return c.do(req, nil) -} - -func (c *Client) do(req *http.Request, result any) error { - resp, err := c.HTTPClient.Do(req) - if err != nil { - return errutils.NewHTTPDoError(req, err) - } - - defer func() { _ = resp.Body.Close() }() - - raw, err := io.ReadAll(resp.Body) - if err != nil { - return errutils.NewReadResponseError(req, resp.StatusCode, err) - } - - var response apiResponse - err = json.Unmarshal(raw, &response) - if err != nil { - return errutils.NewUnmarshalError(req, resp.StatusCode, raw, err) - } - - if response.Code != 1 { - return fmt.Errorf("[status code %d] invalid code (%v) error: %s", resp.StatusCode, response.Code, response.Message) - } - - if result == nil { - return nil - } - - if len(response.Data) == 0 { - return nil - } - - err = json.Unmarshal(response.Data, result) - if err != nil { - return errutils.NewUnmarshalError(req, resp.StatusCode, raw, err) - } - - return nil -} - -func (c *Client) newRequest(ctx context.Context, method string, endpoint *url.URL, payload any) (*http.Request, error) { - buf := new(bytes.Buffer) - - if payload != nil { - err := json.NewEncoder(buf).Encode(payload) - if err != nil { - return nil, fmt.Errorf("failed to create request JSON body: %w", err) - } - } - - req, err := http.NewRequestWithContext(ctx, method, endpoint.String(), buf) - if err != nil { - return nil, fmt.Errorf("unable to create request: %w", err) - } - - requestDate := time.Now().Format(time.RFC1123Z) - - req.Header.Set("API-KEY", c.apiKey) - req.Header.Set("API-REQUEST-DATE", requestDate) - req.Header.Set("API-HMAC", c.hmac(endpoint.String(), requestDate, buf.String())) - req.Header.Set("API-FORMAT", "json") - - return req, nil -} - -func (c *Client) hmac(endpoint, date, body string) string { - sum := md5.Sum([]byte(c.apiKey + endpoint + body + date + c.secretKey)) - return hex.EncodeToString(sum[:]) -} diff --git a/providers/dns/cloudxns/internal/client_test.go b/providers/dns/cloudxns/internal/client_test.go deleted file mode 100644 index ac4e36d6b7..0000000000 --- a/providers/dns/cloudxns/internal/client_test.go +++ /dev/null @@ -1,292 +0,0 @@ -package internal - -import ( - "bytes" - "context" - "encoding/json" - "fmt" - "io" - "net/http" - "net/http/httptest" - "net/url" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func setupTest(t *testing.T, handler http.HandlerFunc) *Client { - t.Helper() - - server := httptest.NewServer(handler) - t.Cleanup(server.Close) - - client, _ := NewClient("myKey", "mySecret") - client.baseURL, _ = url.Parse(server.URL + "/") - client.HTTPClient = server.Client() - - return client -} - -func handlerMock(method string, response *apiResponse, data interface{}) http.HandlerFunc { - return func(rw http.ResponseWriter, req *http.Request) { - if req.Method != method { - content, err := json.Marshal(apiResponse{ - Code: 999, // random code only for the test - Message: fmt.Sprintf("invalid method: got %s want %s", req.Method, method), - }) - if err != nil { - http.Error(rw, err.Error(), http.StatusInternalServerError) - return - } - - http.Error(rw, string(content), http.StatusBadRequest) - return - } - - jsonData, err := json.Marshal(data) - if err != nil { - http.Error(rw, err.Error(), http.StatusInternalServerError) - return - } - - response.Data = jsonData - - content, err := json.Marshal(response) - if err != nil { - http.Error(rw, err.Error(), http.StatusInternalServerError) - return - } - - _, err = rw.Write(content) - if err != nil { - http.Error(rw, err.Error(), http.StatusInternalServerError) - return - } - } -} - -func TestClient_GetDomainInformation(t *testing.T) { - type result struct { - domain *Data - error bool - } - - testCases := []struct { - desc string - fqdn string - response *apiResponse - data []Data - expected result - }{ - { - desc: "domain found", - fqdn: "_acme-challenge.example.org.", - response: &apiResponse{ - Code: 1, - }, - data: []Data{ - { - ID: "1", - Domain: "example.com.", - }, - { - ID: "2", - Domain: "example.org.", - }, - }, - expected: result{domain: &Data{ - ID: "2", - Domain: "example.org.", - }}, - }, - { - desc: "domains not found", - fqdn: "_acme-challenge.huu.com.", - response: &apiResponse{ - Code: 1, - }, - data: []Data{ - { - ID: "5", - Domain: "example.com.", - }, - { - ID: "6", - Domain: "example.org.", - }, - }, - expected: result{error: true}, - }, - } - - for _, test := range testCases { - t.Run(test.desc, func(t *testing.T) { - client := setupTest(t, handlerMock(http.MethodGet, test.response, test.data)) - - domain, err := client.GetDomainInformation(context.Background(), test.fqdn) - - if test.expected.error { - require.Error(t, err) - } else { - require.NoError(t, err) - assert.Equal(t, test.expected.domain, domain) - } - }) - } -} - -func TestClient_FindTxtRecord(t *testing.T) { - type result struct { - txtRecord *TXTRecord - error bool - } - - testCases := []struct { - desc string - fqdn string - zoneID string - txtRecords []TXTRecord - response *apiResponse - expected result - }{ - { - desc: "record found", - fqdn: "_acme-challenge.example.org.", - zoneID: "test-zone", - txtRecords: []TXTRecord{ - { - ID: 1, - RecordID: "Record-A", - Host: "_acme-challenge.example.org", - Value: "txtTXTtxtTXTtxtTXTtxtTXT", - Type: "TXT", - LineID: 6, - TTL: 30, - }, - { - ID: 2, - RecordID: "Record-B", - Host: "_acme-challenge.example.com", - Value: "TXTtxtTXTtxtTXTtxtTXTtxt", - Type: "TXT", - LineID: 6, - TTL: 30, - }, - }, - response: &apiResponse{ - Code: 1, - }, - expected: result{ - txtRecord: &TXTRecord{ - ID: 1, - RecordID: "Record-A", - Host: "_acme-challenge.example.org", - Value: "txtTXTtxtTXTtxtTXTtxtTXT", - Type: "TXT", - LineID: 6, - TTL: 30, - }, - }, - }, - { - desc: "record not found", - fqdn: "_acme-challenge.huu.com.", - zoneID: "test-zone", - txtRecords: []TXTRecord{ - { - ID: 1, - RecordID: "Record-A", - Host: "_acme-challenge.example.org", - Value: "txtTXTtxtTXTtxtTXTtxtTXT", - Type: "TXT", - LineID: 6, - TTL: 30, - }, - { - ID: 2, - RecordID: "Record-B", - Host: "_acme-challenge.example.com", - Value: "TXTtxtTXTtxtTXTtxtTXTtxt", - Type: "TXT", - LineID: 6, - TTL: 30, - }, - }, - response: &apiResponse{ - Code: 1, - }, - expected: result{error: true}, - }, - } - - for _, test := range testCases { - t.Run(test.desc, func(t *testing.T) { - client := setupTest(t, handlerMock(http.MethodGet, test.response, test.txtRecords)) - - txtRecord, err := client.FindTxtRecord(context.Background(), test.zoneID, test.fqdn) - - if test.expected.error { - require.Error(t, err) - } else { - require.NoError(t, err) - assert.Equal(t, test.expected.txtRecord, txtRecord) - } - }) - } -} - -func TestClient_AddTxtRecord(t *testing.T) { - testCases := []struct { - desc string - domain *Data - fqdn string - value string - ttl int - expected string - }{ - { - desc: "sub-domain", - domain: &Data{ - ID: "1", - Domain: "example.com.", - }, - fqdn: "_acme-challenge.foo.example.com.", - value: "txtTXTtxtTXTtxtTXTtxtTXT", - ttl: 30, - expected: `{"domain_id":1,"host":"_acme-challenge.foo","value":"txtTXTtxtTXTtxtTXTtxtTXT","type":"TXT","line_id":"1","ttl":"30"}`, - }, - { - desc: "main domain", - domain: &Data{ - ID: "2", - Domain: "example.com.", - }, - fqdn: "_acme-challenge.example.com.", - value: "TXTtxtTXTtxtTXTtxtTXTtxt", - ttl: 30, - expected: `{"domain_id":2,"host":"_acme-challenge","value":"TXTtxtTXTtxtTXTtxtTXTtxt","type":"TXT","line_id":"1","ttl":"30"}`, - }, - } - - for _, test := range testCases { - t.Run(test.desc, func(t *testing.T) { - response := &apiResponse{ - Code: 1, - } - - client := setupTest(t, func(rw http.ResponseWriter, req *http.Request) { - assert.NotNil(t, req.Body) - content, err := io.ReadAll(req.Body) - require.NoError(t, err) - - assert.Equal(t, test.expected, string(bytes.TrimSpace(content))) - - handlerMock(http.MethodPost, response, nil).ServeHTTP(rw, req) - }) - - err := client.AddTxtRecord(context.Background(), test.domain, test.fqdn, test.value, test.ttl) - require.NoError(t, err) - }) - } -} diff --git a/providers/dns/cloudxns/internal/types.go b/providers/dns/cloudxns/internal/types.go deleted file mode 100644 index c1b24e30c2..0000000000 --- a/providers/dns/cloudxns/internal/types.go +++ /dev/null @@ -1,28 +0,0 @@ -package internal - -import "encoding/json" - -type apiResponse struct { - Code int `json:"code"` - Message string `json:"message"` - Data json.RawMessage `json:"data,omitempty"` -} - -// Data Domain information. -type Data struct { - ID string `json:"id"` - Domain string `json:"domain"` - TTL int `json:"ttl,omitempty"` -} - -// TXTRecord a TXT record. -type TXTRecord struct { - ID int `json:"domain_id,omitempty"` - RecordID string `json:"record_id,omitempty"` - - Host string `json:"host"` - Value string `json:"value"` - Type string `json:"type"` - LineID int `json:"line_id,string"` - TTL int `json:"ttl,string"` -}