From 4f5655e51046e9546896a5c9006524328cb3090a Mon Sep 17 00:00:00 2001 From: Costas Drogos Date: Mon, 27 Jan 2025 17:29:26 +0200 Subject: [PATCH] NS1: remove deprecated NS1_URLFWD (#3400) Co-authored-by: Tom Limoncelli --- commands/types/dnscontrol.d.ts | 26 ------------- documentation/SUMMARY.md | 2 - documentation/adding-new-rtypes.md | 2 - .../domain-modifiers/NS1_URLFWD.md | 38 ------------------- models/domain.go | 2 +- models/record.go | 1 - pkg/js/helpers.js | 1 - pkg/normalize/validate.go | 4 -- pkg/normalize/validate_test.go | 22 ----------- providers/ns1/ns1Provider.go | 14 ------- providers/vultr/vultrProvider.go | 4 +- 11 files changed, 3 insertions(+), 113 deletions(-) delete mode 100644 documentation/language-reference/domain-modifiers/NS1_URLFWD.md diff --git a/commands/types/dnscontrol.d.ts b/commands/types/dnscontrol.d.ts index 48adeef40e..2a898dcfec 100644 --- a/commands/types/dnscontrol.d.ts +++ b/commands/types/dnscontrol.d.ts @@ -2294,32 +2294,6 @@ declare const NO_PURGE: DomainModifier; */ declare function NS(name: string, target: string, ...modifiers: RecordModifier[]): DomainModifier; -/** - * `NS1_URLFWD` is an NS1-specific feature that maps to NS1's URLFWD record, which creates HTTP 301 (permanent) or 302 (temporary) redirects. - * - * ```javascript - * D("example.com", REG_MY_PROVIDER, DnsProvider(DSP_MY_PROVIDER), - * NS1_URLFWD("urlfwd", "/ http://example.com 302 2 0") - * ); - * ``` - * - * The fields are: - * * name: the record name - * * target: a complex field containing the following, space separated: - * * from - the path to match - * * to - the url to redirect to - * * redirectType - (0 - masking, 301, 302) - * * pathForwardingMode - (0 - All, 1 - Capture, 2 - None) - * * queryForwardingMode - (0 - disabled, 1 - enabled) - * - * WARNING: According to NS1, this type of record is deprecated and in the process - * of being replaced by the premium-only `REDIRECT` record type. While still able to be - * configured through the API, as suggested by NS1, please try not to use it, going forward. - * - * @see https://docs.dnscontrol.org/language-reference/domain-modifiers/service-provider-specific/ns1/ns1_urlfwd - */ -declare function NS1_URLFWD(name: string, target: string, ...modifiers: RecordModifier[]): DomainModifier; - /** * NewDnsProvider activates a DNS Service Provider (DSP) specified in `creds.json`. * A DSP stores a DNS zone's records and provides DNS service for the zone (i.e. diff --git a/documentation/SUMMARY.md b/documentation/SUMMARY.md index 261da0cb4a..2c39e1b807 100644 --- a/documentation/SUMMARY.md +++ b/documentation/SUMMARY.md @@ -91,8 +91,6 @@ * [CF_WORKER_ROUTE](language-reference/domain-modifiers/CF_WORKER_ROUTE.md) * ClouDNS * [CLOUDNS_WR](language-reference/domain-modifiers/CLOUDNS_WR.md) - * NS1 - * [NS1_URLFWD](language-reference/domain-modifiers/NS1_URLFWD.md) * Record Modifiers * [TTL](language-reference/record-modifiers/TTL.md) * Service Provider specific diff --git a/documentation/adding-new-rtypes.md b/documentation/adding-new-rtypes.md index 895f3a071b..e3185b3c39 100644 --- a/documentation/adding-new-rtypes.md +++ b/documentation/adding-new-rtypes.md @@ -317,8 +317,6 @@ Add the new file `FOO.md` to the documentation table of contents [`documentation * [CLOUDNS_WR](language-reference/domain-modifiers/CLOUDNS_WR.md) + * ASDF + * [ASDF_NINJA](language-reference/domain-modifiers/ASDF_NINJA.md) - * NS1 - * [NS1_URLFWD](language-reference/domain-modifiers/NS1_URLFWD.md) ... * Record Modifiers ... diff --git a/documentation/language-reference/domain-modifiers/NS1_URLFWD.md b/documentation/language-reference/domain-modifiers/NS1_URLFWD.md deleted file mode 100644 index 626a009383..0000000000 --- a/documentation/language-reference/domain-modifiers/NS1_URLFWD.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -name: NS1_URLFWD -parameters: - - name - - target - - modifiers... -provider: NS1 -parameter_types: - name: string - target: string - "modifiers...": RecordModifier[] ---- - -`NS1_URLFWD` is an NS1-specific feature that maps to NS1's URLFWD record, which creates HTTP 301 (permanent) or 302 (temporary) redirects. - - -{% code title="dnsconfig.js" %} -```javascript -D("example.com", REG_MY_PROVIDER, DnsProvider(DSP_MY_PROVIDER), - NS1_URLFWD("urlfwd", "/ http://example.com 302 2 0") -); -``` -{% endcode %} - -The fields are: -* name: the record name -* target: a complex field containing the following, space separated: - * from - the path to match - * to - the url to redirect to - * redirectType - (0 - masking, 301, 302) - * pathForwardingMode - (0 - All, 1 - Capture, 2 - None) - * queryForwardingMode - (0 - disabled, 1 - enabled) - -{% hint style="warning" %} -**WARNING**: According to NS1, this type of record is deprecated and in the process -of being replaced by the premium-only `REDIRECT` record type. While still able to be -configured through the API, as suggested by NS1, please try not to use it, going forward. -{% endhint %} diff --git a/models/domain.go b/models/domain.go index 6b1c80c26d..48b4157118 100644 --- a/models/domain.go +++ b/models/domain.go @@ -125,7 +125,7 @@ func (dc *DomainConfig) Punycode() error { // Set the target: switch rec.Type { // #rtype_variations - case "ALIAS", "MX", "NS", "CNAME", "DNAME", "PTR", "SRV", "URL", "URL301", "FRAME", "R53_ALIAS", "NS1_URLFWD", "AKAMAICDN", "CLOUDNS_WR", "PORKBUN_URLFWD": + case "ALIAS", "MX", "NS", "CNAME", "DNAME", "PTR", "SRV", "URL", "URL301", "FRAME", "R53_ALIAS", "AKAMAICDN", "CLOUDNS_WR", "PORKBUN_URLFWD": // These rtypes are hostnames, therefore need to be converted (unlike, for example, an AAAA record) t, err := idna.ToASCII(rec.GetTargetField()) if err != nil { diff --git a/models/record.go b/models/record.go index 3d977b9256..7587885a6b 100644 --- a/models/record.go +++ b/models/record.go @@ -45,7 +45,6 @@ import ( // IMPORT_TRANSFORM // NAMESERVER // NO_PURGE -// NS1_URLFWD // PAGE_RULE // PORKBUN_URLFWD // PURGE diff --git a/pkg/js/helpers.js b/pkg/js/helpers.js index 88f52c0fe5..c5ea9f07b8 100644 --- a/pkg/js/helpers.js +++ b/pkg/js/helpers.js @@ -1376,7 +1376,6 @@ var CF_WORKER_ROUTE = recordBuilder('CF_WORKER_ROUTE', { var URL = recordBuilder('URL'); var URL301 = recordBuilder('URL301'); var FRAME = recordBuilder('FRAME'); -var NS1_URLFWD = recordBuilder('NS1_URLFWD'); var CLOUDNS_WR = recordBuilder('CLOUDNS_WR'); var PORKBUN_URLFWD = recordBuilder('PORKBUN_URLFWD'); diff --git a/pkg/normalize/validate.go b/pkg/normalize/validate.go index e92dd40bbb..1945a79000 100644 --- a/pkg/normalize/validate.go +++ b/pkg/normalize/validate.go @@ -213,10 +213,6 @@ func checkTargets(rec *models.RecordConfig, domain string) (errs []error) { if label == "@" { check(errors.New("cannot create NS record for bare domain. Use NAMESERVER instead")) } - case "NS1_URLFWD": - if len(strings.Fields(target)) != 5 { - check(errors.New("record should follow format: \"from to redirectType pathForwardingMode queryForwarding\"")) - } case "PTR": check(checkTarget(target)) case "SOA": diff --git a/pkg/normalize/validate_test.go b/pkg/normalize/validate_test.go index 7664c33938..517093a405 100644 --- a/pkg/normalize/validate_test.go +++ b/pkg/normalize/validate_test.go @@ -274,28 +274,6 @@ func TestNSAtRoot(t *testing.T) { } } -func TestNS1URLFWDValid(t *testing.T) { - rec := &models.RecordConfig{Type: "NS1_URLFWD"} - rec.SetLabel("test1", "foo.com") - rec.MustSetTarget("/ http://example.com 302 2 0") - - errs := checkTargets(rec, "foo.com") - if len(errs) > 0 { - t.Error("Expect no error with valid NS1_URLFWD target") - } -} - -func TestNS1URLFWDInvalid(t *testing.T) { - rec := &models.RecordConfig{Type: "NS1_URLFWD"} - rec.SetLabel("test2", "foo.com") - rec.MustSetTarget("/ http://example.com 302 2") - - errs := checkTargets(rec, "foo.com") - if len(errs) == 0 { - t.Error("Expect error with invalid NS1_URLFWD target") - } -} - func TestTransforms(t *testing.T) { tests := []struct { givenIP string diff --git a/providers/ns1/ns1Provider.go b/providers/ns1/ns1Provider.go index 8b18764c09..8c732452dd 100644 --- a/providers/ns1/ns1Provider.go +++ b/providers/ns1/ns1Provider.go @@ -51,7 +51,6 @@ func init() { RecordAuditor: AuditRecords, } providers.RegisterDomainServiceProviderType(providerName, fns, providers.CanUseSRV, docNotes) - providers.RegisterCustomRecordType("NS1_URLFWD", providerName, "") providers.RegisterMaintainer(providerName, providerMaintainer) } @@ -253,10 +252,6 @@ func (n *nsone) add(recs models.Records, domain string) error { } func (n *nsone) remove(key models.RecordKey, domain string) error { - if key.Type == "NS1_URLFWD" { - key.Type = "URLFWD" - } - for rtr := 0; ; rtr++ { httpResp, err := n.Records.Delete(domain, key.NameFQDN, key.Type) if httpResp.StatusCode == http.StatusTooManyRequests && rtr < clientRetries { @@ -340,10 +335,6 @@ func buildRecord(recs models.Records, domain string, id string) *dns.Record { strconv.Itoa(int(r.DsDigestType)), r.DsDigest, }}) - } else if r.Type == "NS1_URLFWD" { - printer.Warnf("NS1_URLFWD is deprecated and may stop working anytime now. Please avoid such records going forward.\n") - rec.Type = "URLFWD" - rec.AddAnswer(&dns.Answer{Rdata: strings.Fields(r.GetTargetField())}) } else if r.Type == "SVCB" || r.Type == "HTTPS" { rec.AddAnswer(&dns.Answer{Rdata: []string{ strconv.Itoa(int(r.SvcPriority)), @@ -383,11 +374,6 @@ func convert(zr *dns.ZoneRecord, domain string) ([]*models.RecordConfig, error) if err := rec.SetTarget(ans); err != nil { return nil, fmt.Errorf("unparsable %s record received from ns1: %w", rtype, err) } - case "URLFWD": - rec.Type = "NS1_URLFWD" - if err := rec.SetTarget(ans); err != nil { - return nil, fmt.Errorf("unparsable %s record received from ns1: %w", rtype, err) - } case "CAA": // dnscontrol expects quotes around multivalue CAA entries, API doesn't add them xAns := strings.SplitN(ans, " ", 3) diff --git a/providers/vultr/vultrProvider.go b/providers/vultr/vultrProvider.go index 820c8c5aa2..6a6db04832 100644 --- a/providers/vultr/vultrProvider.go +++ b/providers/vultr/vultrProvider.go @@ -119,7 +119,7 @@ func (api *vultrProvider) GetZoneRecordsCorrections(dc *models.DomainConfig, cur for _, rec := range dc.Records { switch rec.Type { // #rtype_variations - case "ALIAS", "MX", "NS", "CNAME", "PTR", "SRV", "URL", "URL301", "FRAME", "R53_ALIAS", "NS1_URLFWD", "AKAMAICDN", "CLOUDNS_WR": + case "ALIAS", "MX", "NS", "CNAME", "PTR", "SRV", "URL", "URL301", "FRAME", "R53_ALIAS", "AKAMAICDN", "CLOUDNS_WR": // These rtypes are hostnames, therefore need to be converted (unlike, for example, an AAAA record) t, err := idna.ToUnicode(rec.GetTargetField()) if err != nil { @@ -230,7 +230,7 @@ func toRecordConfig(domain string, r govultr.DomainRecord) (*models.RecordConfig rc.SetLabel(r.Name, domain) switch rtype := r.Type; rtype { - case "ALIAS", "MX", "NS", "CNAME", "PTR", "SRV", "URL", "URL301", "FRAME", "R53_ALIAS", "NS1_URLFWD", "AKAMAICDN", "CLOUDNS_WR": + case "ALIAS", "MX", "NS", "CNAME", "PTR", "SRV", "URL", "URL301", "FRAME", "R53_ALIAS", "AKAMAICDN", "CLOUDNS_WR": var err error data, err = idna.ToUnicode(data) if err != nil {