From 1329aa51b605cb54ba9aae3a82a0a87b881fb7b3 Mon Sep 17 00:00:00 2001 From: Christopher Speller Date: Mon, 13 Nov 2017 09:09:58 -0800 Subject: Updating server dependancies. (#7816) --- vendor/github.com/xenolf/lego/.travis.yml | 2 +- .../github.com/xenolf/lego/acme/dns_challenge.go | 13 -- .../xenolf/lego/acme/dns_challenge_test.go | 9 +- vendor/github.com/xenolf/lego/cli_handlers.go | 11 +- .../xenolf/lego/providers/dns/dns_providers.go | 3 + .../xenolf/lego/providers/dns/godaddy/godaddy.go | 155 +++++++++++++++++++++ .../lego/providers/dns/godaddy/godaddy_test.go | 60 ++++++++ 7 files changed, 228 insertions(+), 25 deletions(-) create mode 100644 vendor/github.com/xenolf/lego/providers/dns/godaddy/godaddy.go create mode 100644 vendor/github.com/xenolf/lego/providers/dns/godaddy/godaddy_test.go (limited to 'vendor/github.com/xenolf') diff --git a/vendor/github.com/xenolf/lego/.travis.yml b/vendor/github.com/xenolf/lego/.travis.yml index ff9ae963a..8cf9aed1b 100644 --- a/vendor/github.com/xenolf/lego/.travis.yml +++ b/vendor/github.com/xenolf/lego/.travis.yml @@ -1,7 +1,7 @@ language: go go: -- 1.7 - 1.8 +- 1.9 - tip services: - memcached diff --git a/vendor/github.com/xenolf/lego/acme/dns_challenge.go b/vendor/github.com/xenolf/lego/acme/dns_challenge.go index 7c4cb80de..133739748 100644 --- a/vendor/github.com/xenolf/lego/acme/dns_challenge.go +++ b/vendor/github.com/xenolf/lego/acme/dns_challenge.go @@ -11,7 +11,6 @@ import ( "time" "github.com/miekg/dns" - "golang.org/x/net/publicsuffix" ) type preCheckDNSFunc func(fqdn, value string) (bool, error) @@ -242,10 +241,6 @@ func FindZoneByFqdn(fqdn string, nameservers []string) (string, error) { labelIndexes := dns.Split(fqdn) for _, index := range labelIndexes { domain := fqdn[index:] - // Give up if we have reached the TLD - if isTLD(domain) { - break - } in, err := dnsQuery(domain, dns.TypeSOA, nameservers, true) if err != nil { @@ -273,14 +268,6 @@ func FindZoneByFqdn(fqdn string, nameservers []string) (string, error) { return "", fmt.Errorf("Could not find the start of authority") } -func isTLD(domain string) bool { - publicsuffix, _ := publicsuffix.PublicSuffix(UnFqdn(domain)) - if publicsuffix == UnFqdn(domain) { - return true - } - return false -} - // ClearFqdnCache clears the cache of fqdn to zone mappings. Primarily used in testing. func ClearFqdnCache() { fqdnToZone = map[string]string{} diff --git a/vendor/github.com/xenolf/lego/acme/dns_challenge_test.go b/vendor/github.com/xenolf/lego/acme/dns_challenge_test.go index 597aaac17..4a2a7feac 100644 --- a/vendor/github.com/xenolf/lego/acme/dns_challenge_test.go +++ b/vendor/github.com/xenolf/lego/acme/dns_challenge_test.go @@ -37,14 +37,6 @@ var lookupNameserversTestsErr = []struct { {"_null.n0n0.", "Could not determine the zone", }, - // invalid domain - {"_null.com.", - "Could not determine the zone", - }, - // invalid domain - {"in-valid.co.uk.", - "Could not determine the zone", - }, } var findZoneByFqdnTests = []struct { @@ -53,6 +45,7 @@ var findZoneByFqdnTests = []struct { }{ {"mail.google.com.", "google.com."}, // domain is a CNAME {"foo.google.com.", "google.com."}, // domain is a non-existent subdomain + {"example.com.ac.", "ac."}, // domain is a eTLD } var checkAuthoritativeNssTests = []struct { diff --git a/vendor/github.com/xenolf/lego/cli_handlers.go b/vendor/github.com/xenolf/lego/cli_handlers.go index 79bbb37e5..b8790c4b2 100644 --- a/vendor/github.com/xenolf/lego/cli_handlers.go +++ b/vendor/github.com/xenolf/lego/cli_handlers.go @@ -329,8 +329,10 @@ func run(c *cli.Context) error { } func revoke(c *cli.Context) error { - - conf, _, client := setup(c) + conf, acc, client := setup(c) + if acc.Registration == nil { + logger().Fatalf("Account %s is not registered. Use 'run' to register a new account.\n", acc.Email) + } err := checkFolder(conf.CertPath()) if err != nil { @@ -355,7 +357,10 @@ func revoke(c *cli.Context) error { } func renew(c *cli.Context) error { - conf, _, client := setup(c) + conf, acc, client := setup(c) + if acc.Registration == nil { + logger().Fatalf("Account %s is not registered. Use 'run' to register a new account.\n", acc.Email) + } if len(c.GlobalStringSlice("domains")) <= 0 { logger().Fatal("Please specify at least one domain.") diff --git a/vendor/github.com/xenolf/lego/providers/dns/dns_providers.go b/vendor/github.com/xenolf/lego/providers/dns/dns_providers.go index 94c8879b2..d7530f788 100644 --- a/vendor/github.com/xenolf/lego/providers/dns/dns_providers.go +++ b/vendor/github.com/xenolf/lego/providers/dns/dns_providers.go @@ -15,6 +15,7 @@ import ( "github.com/xenolf/lego/providers/dns/dyn" "github.com/xenolf/lego/providers/dns/exoscale" "github.com/xenolf/lego/providers/dns/gandi" + "github.com/xenolf/lego/providers/dns/godaddy" "github.com/xenolf/lego/providers/dns/googlecloud" "github.com/xenolf/lego/providers/dns/linode" "github.com/xenolf/lego/providers/dns/namecheap" @@ -54,6 +55,8 @@ func NewDNSChallengeProviderByName(name string) (acme.ChallengeProvider, error) provider, err = gandi.NewDNSProvider() case "gcloud": provider, err = googlecloud.NewDNSProvider() + case "godaddy": + provider, err = godaddy.NewDNSProvider() case "linode": provider, err = linode.NewDNSProvider() case "manual": diff --git a/vendor/github.com/xenolf/lego/providers/dns/godaddy/godaddy.go b/vendor/github.com/xenolf/lego/providers/dns/godaddy/godaddy.go new file mode 100644 index 000000000..4112f6628 --- /dev/null +++ b/vendor/github.com/xenolf/lego/providers/dns/godaddy/godaddy.go @@ -0,0 +1,155 @@ +// Package godaddy implements a DNS provider for solving the DNS-01 challenge using godaddy DNS. +package godaddy + +import ( + "fmt" + "io" + "net/http" + "os" + "time" + + "bytes" + "encoding/json" + "github.com/xenolf/lego/acme" + "io/ioutil" + "strings" +) + +// GoDaddyAPIURL represents the API endpoint to call. +const apiURL = "https://api.godaddy.com" + +// DNSProvider is an implementation of the acme.ChallengeProvider interface +type DNSProvider struct { + apiKey string + apiSecret string +} + +// NewDNSProvider returns a DNSProvider instance configured for godaddy. +// Credentials must be passed in the environment variables: GODADDY_API_KEY +// and GODADDY_API_SECRET. +func NewDNSProvider() (*DNSProvider, error) { + apikey := os.Getenv("GODADDY_API_KEY") + secret := os.Getenv("GODADDY_API_SECRET") + return NewDNSProviderCredentials(apikey, secret) +} + +// NewDNSProviderCredentials uses the supplied credentials to return a +// DNSProvider instance configured for godaddy. +func NewDNSProviderCredentials(apiKey, apiSecret string) (*DNSProvider, error) { + if apiKey == "" || apiSecret == "" { + return nil, fmt.Errorf("GoDaddy credentials missing") + } + + return &DNSProvider{apiKey, apiSecret}, nil +} + +// Timeout returns the timeout and interval to use when checking for DNS +// propagation. Adjusting here to cope with spikes in propagation times. +func (c *DNSProvider) Timeout() (timeout, interval time.Duration) { + return 120 * time.Second, 2 * time.Second +} + +func (c *DNSProvider) extractRecordName(fqdn, domain string) string { + name := acme.UnFqdn(fqdn) + if idx := strings.Index(name, "."+domain); idx != -1 { + return name[:idx] + } + return name +} + +// Present creates a TXT record to fulfil the dns-01 challenge +func (c *DNSProvider) Present(domain, token, keyAuth string) error { + fqdn, value, ttl := acme.DNS01Record(domain, keyAuth) + domainZone, err := c.getZone(fqdn) + if err != nil { + return err + } + + if ttl < 600 { + ttl = 600 + } + + recordName := c.extractRecordName(fqdn, domainZone) + rec := []DNSRecord{ + { + Type: "TXT", + Name: recordName, + Data: value, + Ttl: ttl, + }, + } + + return c.updateRecords(rec, domainZone, recordName) +} + +func (c *DNSProvider) updateRecords(records []DNSRecord, domainZone string, recordName string) error { + body, err := json.Marshal(records) + if err != nil { + return err + } + + var resp *http.Response + resp, err = c.makeRequest("PUT", fmt.Sprintf("/v1/domains/%s/records/TXT/%s", domainZone, recordName), bytes.NewReader(body)) + if err != nil { + return err + } + + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + bodyBytes, _ := ioutil.ReadAll(resp.Body) + return fmt.Errorf("Could not create record %v; Status: %v; Body: %s\n", string(body), resp.StatusCode, string(bodyBytes)) + } + return nil +} + +// CleanUp sets null value in the TXT DNS record as GoDaddy has no proper DELETE record method +func (c *DNSProvider) CleanUp(domain, token, keyAuth string) error { + fqdn, _, _ := acme.DNS01Record(domain, keyAuth) + domainZone, err := c.getZone(fqdn) + if err != nil { + return err + } + + recordName := c.extractRecordName(fqdn, domainZone) + rec := []DNSRecord{ + { + Type: "TXT", + Name: recordName, + Data: "null", + }, + } + + return c.updateRecords(rec, domainZone, recordName) +} + +func (c *DNSProvider) getZone(fqdn string) (string, error) { + authZone, err := acme.FindZoneByFqdn(fqdn, acme.RecursiveNameservers) + if err != nil { + return "", err + } + + return acme.UnFqdn(authZone), nil +} + +func (c *DNSProvider) makeRequest(method, uri string, body io.Reader) (*http.Response, error) { + req, err := http.NewRequest(method, fmt.Sprintf("%s%s", apiURL, uri), body) + if err != nil { + return nil, err + } + + req.Header.Set("Accept", "application/json") + req.Header.Set("Content-Type", "application/json") + req.Header.Set("Authorization", fmt.Sprintf("sso-key %s:%s", c.apiKey, c.apiSecret)) + + client := http.Client{Timeout: 30 * time.Second} + return client.Do(req) +} + +type DNSRecord struct { + Type string `json:"type"` + Name string `json:"name"` + Data string `json:"data"` + Priority int `json:"priority,omitempty"` + Ttl int `json:"ttl,omitempty"` +} diff --git a/vendor/github.com/xenolf/lego/providers/dns/godaddy/godaddy_test.go b/vendor/github.com/xenolf/lego/providers/dns/godaddy/godaddy_test.go new file mode 100644 index 000000000..de84d827e --- /dev/null +++ b/vendor/github.com/xenolf/lego/providers/dns/godaddy/godaddy_test.go @@ -0,0 +1,60 @@ +package godaddy + +import ( + "os" + "testing" + + "github.com/stretchr/testify/assert" +) + +var ( + godaddyAPIKey string + godaddyAPISecret string + godaddyDomain string + godaddyLiveTest bool +) + +func init() { + godaddyAPIKey = os.Getenv("GODADDY_API_KEY") + godaddyAPISecret = os.Getenv("GODADDY_API_SECRET") + godaddyDomain = os.Getenv("GODADDY_DOMAIN") + + if len(godaddyAPIKey) > 0 && len(godaddyAPISecret) > 0 && len(godaddyDomain) > 0 { + godaddyLiveTest = true + } +} + +func TestNewDNSProvider(t *testing.T) { + provider, err := NewDNSProvider() + + if !godaddyLiveTest { + assert.Error(t, err) + } else { + assert.NotNil(t, provider) + assert.NoError(t, err) + } +} + +func TestDNSProvider_Present(t *testing.T) { + if !godaddyLiveTest { + t.Skip("skipping live test") + } + + provider, err := NewDNSProvider() + assert.NoError(t, err) + + err = provider.Present(godaddyDomain, "", "123d==") + assert.NoError(t, err) +} + +func TestDNSProvider_CleanUp(t *testing.T) { + if !godaddyLiveTest { + t.Skip("skipping live test") + } + + provider, err := NewDNSProvider() + assert.NoError(t, err) + + err = provider.CleanUp(godaddyDomain, "", "123d==") + assert.NoError(t, err) +} -- cgit v1.2.3-1-g7c22