diff --git a/docs/_providers/cloudflare.md b/docs/_providers/cloudflare.md index fb039ac5b..5f3d6f278 100644 --- a/docs/_providers/cloudflare.md +++ b/docs/_providers/cloudflare.md @@ -41,6 +41,7 @@ Record level metadata available: Domain level metadata available: * `cloudflare_proxy_default` ("on", "off", or "full") + * `cloudflare_universalssl` (unset to keep untouched; otherwise "on, or "off") Provider level metadata available: * `ip_conversions` @@ -76,6 +77,10 @@ var CF_PROXY_FULL = {'cloudflare_proxy': 'full'}; // Proxy+Railgun enabled. var CF_PROXY_DEFAULT_OFF = {'cloudflare_proxy_default': 'off'}; // Proxy default on for entire domain: var CF_PROXY_DEFAULT_ON = {'cloudflare_proxy_default': 'on'}; +// UniversalSSL off for entire domain: +var CF_UNIVERSALSSL_OFF = { cloudflare_universalssl: 'off' }; +// UniversalSSL on for entire domain: +var CF_UNIVERSALSSL_ON = { cloudflare_universalssl: 'on' }; {% endhighlight %} The following example shows how to set meta variables with and without aliases: diff --git a/pkg/js/helpers.js b/pkg/js/helpers.js index c001be821..6ad8f6811 100644 --- a/pkg/js/helpers.js +++ b/pkg/js/helpers.js @@ -605,6 +605,10 @@ var CF_PROXY_FULL = { cloudflare_proxy: 'full' }; // Proxy+Railgun enabled. var CF_PROXY_DEFAULT_OFF = { cloudflare_proxy_default: 'off' }; // Proxy default on for entire domain: var CF_PROXY_DEFAULT_ON = { cloudflare_proxy_default: 'on' }; +// UniversalSSL off for entire domain: +var CF_UNIVERSALSSL_OFF = { cloudflare_universalssl: 'off' }; +// UniversalSSL on for entire domain: +var CF_UNIVERSALSSL_ON = { cloudflare_universalssl: 'on' }; // CUSTOM, PROVIDER SPECIFIC RECORD TYPES diff --git a/pkg/js/static.go b/pkg/js/static.go index 23df70f4e..6a726f20b 100644 --- a/pkg/js/static.go +++ b/pkg/js/static.go @@ -192,102 +192,103 @@ var _escData = map[string]*_escFile{ "/helpers.js": { local: "pkg/js/helpers.js", - size: 21587, + size: 21786, modtime: 0, compressed: ` -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 `, }, diff --git a/providers/cloudflare/cloudflareProvider.go b/providers/cloudflare/cloudflareProvider.go index edf15d94f..b0613f3b6 100644 --- a/providers/cloudflare/cloudflareProvider.go +++ b/providers/cloudflare/cloudflareProvider.go @@ -103,9 +103,11 @@ func (c *CloudflareApi) GetDomainCorrections(dc *models.DomainConfig) ([]*models if !ok { return nil, errors.Errorf("%s not listed in zones for cloudflare account", dc.Name) } + if err := c.preprocessConfig(dc); err != nil { return nil, err } + records, err := c.getRecordsForDomain(id, dc.Name) if err != nil { return nil, err @@ -118,6 +120,7 @@ func (c *CloudflareApi) GetDomainCorrections(dc *models.DomainConfig) ([]*models records = append(records[:i], records[i+1:]...) } } + if c.manageRedirects { prs, err := c.getPageRules(id, dc.Name) if err != nil { @@ -125,6 +128,7 @@ func (c *CloudflareApi) GetDomainCorrections(dc *models.DomainConfig) ([]*models } records = append(records, prs...) } + for _, rec := range dc.Records { if rec.Type == "ALIAS" { rec.Type = "CNAME" @@ -139,6 +143,7 @@ func (c *CloudflareApi) GetDomainCorrections(dc *models.DomainConfig) ([]*models log.Fatalf("FATAL: dnsconfig contains label that matches ignored_labels: %#v is in %v)\n", rec.GetLabel(), c.ignoredLabels) } } + checkNSModifications(dc) // Normalize @@ -189,6 +194,21 @@ func (c *CloudflareApi) GetDomainCorrections(dc *models.DomainConfig) ([]*models }) } } + + // Add universalSSL change to corrections when needed + if changed, newState, err := c.checkUniversalSSL(dc, id); err == nil && changed { + var newStateString string + if newState { + newStateString = "enabled" + } else { + newStateString = "disabled" + } + corrections = append(corrections, &models.Correction{ + Msg: fmt.Sprintf("Universal SSL will be %s for this domain.", newStateString), + F: func() error { return c.changeUniversalSSL(id, newState) }, + }) + } + return corrections, nil } @@ -206,10 +226,34 @@ func checkNSModifications(dc *models.DomainConfig) { dc.Records = newList } +func (c *CloudflareApi) checkUniversalSSL(dc *models.DomainConfig, id string) (changed bool, newState bool, err error) { + expected_str := dc.Metadata[metaUniversalSSL] + if expected_str == "" { + return false, false, errors.Errorf("Metadata not set.") + } + + if actual, err := c.getUniversalSSL(id); err == nil { + // convert str to bool + var expected bool + if expected_str == "off" { + expected = false + } else { + expected = true + } + // did something change? + if actual != expected { + return true, expected, nil + } + return false, expected, nil + } + return false, false, errors.Errorf("error receiving universal ssl state:") +} + const ( metaProxy = "cloudflare_proxy" metaProxyDefault = metaProxy + "_default" - metaOriginalIP = "original_ip" // TODO(tlim): Unclear what this means. + metaOriginalIP = "original_ip" // TODO(tlim): Unclear what this means. + metaUniversalSSL = "cloudflare_universalssl" metaIPConversions = "ip_conversions" // TODO(tlim): Rename to obscure_rules. ) @@ -235,23 +279,31 @@ func (c *CloudflareApi) preprocessConfig(dc *models.DomainConfig) error { } } - currentPrPrio := 1 + // Check UniversalSSL setting + if u := dc.Metadata[metaUniversalSSL]; u != "" { + u = strings.ToLower(u) + if (u != "on" && u != "off") { + return errors.Errorf("Bad metadata value for %s: '%s'. Use on/off.", metaUniversalSSL, u) + } + } // Normalize the proxy setting for each record. // A and CNAMEs: Validate. If null, set to default. // else: Make sure it wasn't set. Set to default. // iterate backwards so first defined page rules have highest priority + currentPrPrio := 1 for i := len(dc.Records) - 1; i >= 0; i-- { rec := dc.Records[i] if rec.Metadata == nil { rec.Metadata = map[string]string{} } - if rec.TTL == 0 || rec.TTL == 300 { + if rec.TTL == 0 { // Please read: https://github.com/StackExchange/dnscontrol/issues/490 rec.TTL = 1 } if rec.TTL != 1 && rec.TTL < 120 { rec.TTL = 120 } + if rec.Type != "A" && rec.Type != "CNAME" && rec.Type != "AAAA" && rec.Type != "ALIAS" { if rec.Metadata[metaProxy] != "" { return errors.Errorf("cloudflare_proxy set on %v record: %#v cloudflare_proxy=%#v", rec.Type, rec.GetLabel(), rec.Metadata[metaProxy]) @@ -269,6 +321,7 @@ func (c *CloudflareApi) preprocessConfig(dc *models.DomainConfig) error { rec.Metadata[metaProxy] = val } } + // CF_REDIRECT record types. Encode target as $FROM,$TO,$PRIO,$CODE if rec.Type == "CF_REDIRECT" || rec.Type == "CF_TEMP_REDIRECT" { if !c.manageRedirects { diff --git a/providers/cloudflare/rest.go b/providers/cloudflare/rest.go index 3e7f26a34..80d06fdc9 100644 --- a/providers/cloudflare/rest.go +++ b/providers/cloudflare/rest.go @@ -286,6 +286,56 @@ func (c *CloudflareApi) modifyRecord(domainID, recID string, proxied bool, rec * return err } +// change universal ssl state +func (c *CloudflareApi) changeUniversalSSL(domainID string, state bool) error { + type setUniversalSSL struct { + Enabled bool `json:"enabled"` + } + us := &setUniversalSSL{ + Enabled: state, + } + + // create json + buf := &bytes.Buffer{} + encoder := json.NewEncoder(buf) + if err := encoder.Encode(us); err != nil { + return err + } + + // send request. + endpoint := fmt.Sprintf(zonesURL+"%s/ssl/universal/settings", domainID) + req, err := http.NewRequest("PATCH", endpoint, buf) + if err != nil { + return err + } + c.setHeaders(req) + _, err = handleActionResponse(http.DefaultClient.Do(req)) + + return err +} + +// change universal ssl state +func (c *CloudflareApi) getUniversalSSL(domainID string) (bool, error) { + type universalSSLResponse struct { + Success bool `json:"success"` + Errors []interface{} `json:"errors"` + Messages []interface{} `json:"messages"` + Result struct { + Enabled bool `json:"enabled"` + } `json:"result"` + } + + // send request. + endpoint := fmt.Sprintf(zonesURL+"%s/ssl/universal/settings", domainID) + var result universalSSLResponse + err := c.get(endpoint, &result) + if err != nil { + return true, err + } + + return result.Result.Enabled, err +} + // common error handling for all action responses func handleActionResponse(resp *http.Response, err error) (id string, e error) { if err != nil {