diff --git a/cli_handlers.go b/cli_handlers.go index 4e17f7ba..e7c3f525 100644 --- a/cli_handlers.go +++ b/cli_handlers.go @@ -18,10 +18,10 @@ import ( "github.com/xenolf/lego/providers/dns/gandi" "github.com/xenolf/lego/providers/dns/googlecloud" "github.com/xenolf/lego/providers/dns/namecheap" + "github.com/xenolf/lego/providers/dns/ovh" "github.com/xenolf/lego/providers/dns/rfc2136" "github.com/xenolf/lego/providers/dns/route53" "github.com/xenolf/lego/providers/dns/vultr" - "github.com/xenolf/lego/providers/dns/ovh" "github.com/xenolf/lego/providers/http/webroot" ) diff --git a/providers/dns/ovh/ovh.go b/providers/dns/ovh/ovh.go index 4e4c7403..290a8d7d 100644 --- a/providers/dns/ovh/ovh.go +++ b/providers/dns/ovh/ovh.go @@ -5,26 +5,24 @@ package ovh import ( "fmt" "os" - "sync" "strings" + "sync" - "github.com/xenolf/lego/acme" "github.com/ovh/go-ovh/ovh" + "github.com/xenolf/lego/acme" ) // OVH API reference: https://eu.api.ovh.com/ // Create a Token: https://eu.api.ovh.com/createToken/ - // DNSProvider is an implementation of the acme.ChallengeProvider interface // that uses OVH's REST API to manage TXT records for a domain. type DNSProvider struct { - client *ovh.Client - recordIDs map[string]int - recordIDsMu sync.Mutex + client *ovh.Client + recordIDs map[string]int + recordIDsMu sync.Mutex } - // NewDNSProvider returns a DNSProvider instance configured for OVH // Credentials must be passed in the environment variable: // OVH_ENDPOINT : it must be ovh-eu or ovh-ca @@ -39,7 +37,6 @@ func NewDNSProvider() (*DNSProvider, error) { return NewDNSProviderCredentials(apiEndpoint, applicationKey, applicationSecret, consumerKey) } - // NewDNSProviderCredentials uses the supplied credentials to return a // DNSProvider instance configured for OVH. func NewDNSProviderCredentials(apiEndpoint, applicationKey, applicationSecret, consumerKey string) (*DNSProvider, error) { @@ -48,38 +45,37 @@ func NewDNSProviderCredentials(apiEndpoint, applicationKey, applicationSecret, c } ovhClient, _ := ovh.NewClient( - apiEndpoint, - applicationKey, - applicationSecret, - consumerKey, - ) + apiEndpoint, + applicationKey, + applicationSecret, + consumerKey, + ) return &DNSProvider{ - client: ovhClient, - recordIDs: make(map[string]int), + client: ovhClient, + recordIDs: make(map[string]int), }, nil } - // Present creates a TXT record to fulfil the dns-01 challenge. func (d *DNSProvider) Present(domain, token, keyAuth string) error { - // txtRecordRequest represents the request body to DO's API to make a TXT record + // txtRecordRequest represents the request body to DO's API to make a TXT record type txtRecordRequest struct { - FieldType string `json:"fieldType"` - SubDomain string `json:"subDomain"` - Target string `json:"target"` - TTL int `json:"ttl"` + FieldType string `json:"fieldType"` + SubDomain string `json:"subDomain"` + Target string `json:"target"` + TTL int `json:"ttl"` } // txtRecordResponse represents a response from DO's API after making a TXT record type txtRecordResponse struct { - ID int `json:"id"` - FieldType string `json:"fieldType"` - SubDomain string `json:"subDomain"` - Target string `json:"target"` - TTL int `json:"ttl"` - Zone string `json:"zone"` + ID int `json:"id"` + FieldType string `json:"fieldType"` + SubDomain string `json:"subDomain"` + Target string `json:"target"` + TTL int `json:"ttl"` + Zone string `json:"zone"` } fqdn, value, ttl := acme.DNS01Record(domain, keyAuth) @@ -93,7 +89,6 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error { authZone = acme.UnFqdn(authZone) subDomain := d.extractRecordName(fqdn, authZone) - reqURL := fmt.Sprintf("/domain/zone/%s/record", authZone) reqData := txtRecordRequest{FieldType: "TXT", SubDomain: subDomain, Target: value, TTL: ttl} var respData txtRecordResponse @@ -117,12 +112,9 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error { d.recordIDs[fqdn] = respData.ID d.recordIDsMu.Unlock() - - return nil } - // CleanUp removes the TXT record matching the specified parameters func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error { fqdn, _, _ := acme.DNS01Record(domain, keyAuth) @@ -135,7 +127,6 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error { return fmt.Errorf("unknown record ID for '%s'", fqdn) } - authZone, err := acme.FindZoneByFqdn(acme.ToFqdn(domain), acme.RecursiveNameservers) if err != nil { return fmt.Errorf("Could not determine zone for domain: '%s'. %s", domain, err) @@ -143,7 +134,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error { authZone = acme.UnFqdn(authZone) - reqURL := fmt.Sprintf("/domain/zone/%s/record/%d",authZone, recordID) + reqURL := fmt.Sprintf("/domain/zone/%s/record/%d", authZone, recordID) err = d.client.Delete(reqURL, nil) if err != nil { @@ -151,7 +142,6 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error { return err } - // Delete record ID from map d.recordIDsMu.Lock() delete(d.recordIDs, fqdn) diff --git a/providers/dns/ovh/ovh_test.go b/providers/dns/ovh/ovh_test.go index 0d2d8933..47da60e5 100644 --- a/providers/dns/ovh/ovh_test.go +++ b/providers/dns/ovh/ovh_test.go @@ -9,12 +9,12 @@ import ( ) var ( - liveTest bool - apiEndpoint string - applicationKey string + liveTest bool + apiEndpoint string + applicationKey string applicationSecret string - consumerKey string - domain string + consumerKey string + domain string ) func init() { @@ -51,7 +51,6 @@ func TestNewDNSProviderMissingCredErr(t *testing.T) { _, err := NewDNSProvider() assert.EqualError(t, err, "OVH credentials missing") - os.Setenv("OVH_ENDPOINT", "ovh-eu") os.Setenv("OVH_APPLICATION_KEY", "") os.Setenv("OVH_APPLICATION_SECRET", "5678") @@ -60,7 +59,6 @@ func TestNewDNSProviderMissingCredErr(t *testing.T) { _, err = NewDNSProvider() assert.EqualError(t, err, "OVH credentials missing") - os.Setenv("OVH_ENDPOINT", "ovh-eu") os.Setenv("OVH_APPLICATION_KEY", "1234") os.Setenv("OVH_APPLICATION_SECRET", "")