From b0a909b853b7f31f3fbbd655ed97fca5f7c99662 Mon Sep 17 00:00:00 2001 From: Thomas Limoncelli Date: Thu, 4 Dec 2025 12:10:04 -0500 Subject: [PATCH] Remove FakeDC hack. Replace with DC Name Varieties --- integrationTest/helpers_integration_test.go | 13 ++--- models/domain.go | 17 ++++--- pkg/domaintags/domaintags.go | 23 ++++----- pkg/domaintags/permitlist.go | 2 +- pkg/rtype/rp.go | 7 +-- pkg/rtypecontrol/import.go | 50 +++++++++---------- pkg/rtypecontrol/rtypecontrol.go | 5 +- pkg/rtypecontrol/setrecordnames_test.go | 11 ++-- providers/bind/bindProvider.go | 6 +-- providers/bind/fnames.go | 2 +- providers/bind/fnames_test.go | 12 ++--- providers/cloudflare/rest.go | 3 +- .../rtypes/cfsingleredirect/cfredirect.go | 21 ++++---- .../cfsingleredirect/cfsingleredirect.go | 11 ++-- providers/gandiv5/convert.go | 5 +- 15 files changed, 98 insertions(+), 90 deletions(-) diff --git a/integrationTest/helpers_integration_test.go b/integrationTest/helpers_integration_test.go index a03fde593..750efd077 100644 --- a/integrationTest/helpers_integration_test.go +++ b/integrationTest/helpers_integration_test.go @@ -12,6 +12,7 @@ import ( "time" "github.com/StackExchange/dnscontrol/v4/models" + "github.com/StackExchange/dnscontrol/v4/pkg/domaintags" "github.com/StackExchange/dnscontrol/v4/pkg/nameservers" "github.com/StackExchange/dnscontrol/v4/pkg/rtypecontrol" "github.com/StackExchange/dnscontrol/v4/pkg/zonerecs" @@ -27,7 +28,7 @@ var ( ) // Global variable to hold the current DomainConfig for use in FromRaw calls. -var globalDC *models.DomainConfig +var globalDCN *domaintags.DomainNameVarieties // Helper constants/funcs for the CLOUDFLARE proxy testing: @@ -203,7 +204,7 @@ func makeChanges(t *testing.T, prv providers.DNSServiceProvider, dc *models.Doma func runTests(t *testing.T, prv providers.DNSServiceProvider, domainName string, origConfig map[string]string) { dc := getDomainConfigWithNameservers(t, prv, domainName) - globalDC = dc + globalDCN = dc.DomainNameVarieties() testGroups := makeTests() @@ -343,7 +344,7 @@ func cfSingleRedirectEnabled() bool { } func cfSingleRedirect(name string, code any, when, then string) *models.RecordConfig { - rec, err := rtypecontrol.NewRecordConfigFromRaw("CLOUDFLAREAPI_SINGLE_REDIRECT", 1, []any{name, code, when, then}, globalDC) + rec, err := rtypecontrol.NewRecordConfigFromRaw("CLOUDFLAREAPI_SINGLE_REDIRECT", 1, []any{name, code, when, then}, globalDCN) panicOnErr(err) return rec } @@ -355,13 +356,13 @@ func cfWorkerRoute(pattern, target string) *models.RecordConfig { } func cfRedir(pattern, target string) *models.RecordConfig { - rec, err := rtypecontrol.NewRecordConfigFromRaw("CF_REDIRECT", 1, []any{pattern, target}, globalDC) + rec, err := rtypecontrol.NewRecordConfigFromRaw("CF_REDIRECT", 1, []any{pattern, target}, globalDCN) panicOnErr(err) return rec } func cfRedirTemp(pattern, target string) *models.RecordConfig { - rec, err := rtypecontrol.NewRecordConfigFromRaw("CF_TEMP_REDIRECT", 1, []any{pattern, target}, globalDC) + rec, err := rtypecontrol.NewRecordConfigFromRaw("CF_TEMP_REDIRECT", 1, []any{pattern, target}, globalDCN) panicOnErr(err) return rec } @@ -487,7 +488,7 @@ func r53alias(name, aliasType, target, evalTargetHealth string) *models.RecordCo } func rp(name string, m, t string) *models.RecordConfig { - rec, err := rtypecontrol.NewRecordConfigFromRaw("RP", 300, []any{name, m, t}, globalDC) + rec, err := rtypecontrol.NewRecordConfigFromRaw("RP", 300, []any{name, m, t}, globalDCN) panicOnErr(err) return rec } diff --git a/models/domain.go b/models/domain.go index 1af4483a2..53869376e 100644 --- a/models/domain.go +++ b/models/domain.go @@ -233,13 +233,14 @@ func (dc *DomainConfig) GetPopulateCorrections(providerName string) []*Correctio return dc.pendingPopulateCorrections[providerName] } -// MakeFakeDomainConfig makes a DomainConfig with the given domain name. This is a workaround so we don't have to change sygnatures of every function that needs a DomainConfig. -// In the future we'll eliminate this by passing a DomainFixedForms instead (and possibly renaming DomainFixedForms). -func MakeFakeDomainConfig(domain string) *DomainConfig { - v := domaintags.MakeDomainNameVarieties(domain) - return &DomainConfig{ - Name: v.NameASCII, - NameRaw: v.NameRaw, - NameUnicode: v.NameUnicode, +// DomainNameVarieties returns the domain's names in various forms. +func (dc *DomainConfig) DomainNameVarieties() *domaintags.DomainNameVarieties { + return &domaintags.DomainNameVarieties{ + NameRaw: dc.NameRaw, + NameASCII: dc.Name, + NameUnicode: dc.NameUnicode, + UniqueName: dc.UniqueName, + Tag: dc.Tag, + HasBang: dc.Tag != "", } } diff --git a/pkg/domaintags/domaintags.go b/pkg/domaintags/domaintags.go index 3b2381e23..2b22b534e 100644 --- a/pkg/domaintags/domaintags.go +++ b/pkg/domaintags/domaintags.go @@ -6,25 +6,24 @@ import ( "golang.org/x/net/idna" ) -// DomainFixedForms stores the various fixed forms of a domain name and tag. -// TODO(tlim): Rename this to DomainNameVarieties or something similar. -type DomainFixedForms struct { - NameRaw string // "originalinput.com" (name as input by the user, lowercased (no tag)) - NameASCII string // "punycode.com" - NameUnicode string // "unicode.com" (converted to downcase BEFORE unicode conversion) - UniqueName string // "punycode.com!tag" +// DomainNameVarieties stores the various forms of a domain name and tag. +type DomainNameVarieties struct { + NameRaw string // "originalinput.com" (name as input by the user (no tag)) + NameASCII string // "punycode.com" (converted to punycode and downcase) + NameUnicode string // "unicode.com" (converted to unicode, ASCII portions downcased) + UniqueName string // "punycode.com!tag" (canonical unique name with tag) Tag string // The tag portion of `example.com!tag` HasBang bool // Was there a "!" in the input when creating this struct? } -// MakeDomainFixedForms turns the user-supplied name into the fixed forms. +// MakeDomainNameVarieties turns the user-supplied name into the varioius forms. // * .Tag: the domain tag (of "example.com!tag") -// * .NameRaw: lowercase version of how the user input the name in dnsconfig.js. -// * .Name: punycode version, downcased. +// * .NameRaw: how the user input the name in dnsconfig.js (no tag) +// * .NameASCII: punycode version, downcased // * .NameUnicode: unicode version of the name, downcased. // * .UniqueName: "example.com!tag" unique across the entire config. -func MakeDomainNameVarieties(n string) DomainFixedForms { +func MakeDomainNameVarieties(n string) *DomainNameVarieties { var err error var tag, nameRaw, nameASCII, nameUnicode, uniqueName string var hasBang bool @@ -74,7 +73,7 @@ func MakeDomainNameVarieties(n string) DomainFixedForms { uniqueName = nameASCII } - return DomainFixedForms{ + return &DomainNameVarieties{ Tag: tag, NameRaw: nameRaw, NameASCII: nameASCII, diff --git a/pkg/domaintags/permitlist.go b/pkg/domaintags/permitlist.go index ee01c02ef..b3a61fbc5 100644 --- a/pkg/domaintags/permitlist.go +++ b/pkg/domaintags/permitlist.go @@ -7,7 +7,7 @@ import ( type PermitList struct { // If the permit list is "all" or "". all bool - items []DomainFixedForms + items []*DomainNameVarieties } // CompilePermitList compiles a list of domain strings into a PermitList structure. The diff --git a/pkg/rtype/rp.go b/pkg/rtype/rp.go index 6bb0681e6..62942b5f2 100644 --- a/pkg/rtype/rp.go +++ b/pkg/rtype/rp.go @@ -2,6 +2,7 @@ package rtype import ( "github.com/StackExchange/dnscontrol/v4/models" + "github.com/StackExchange/dnscontrol/v4/pkg/domaintags" "github.com/StackExchange/dnscontrol/v4/pkg/rtypecontrol" "github.com/miekg/dns" ) @@ -20,7 +21,7 @@ func (handle *RP) Name() string { } // FromArgs fills in the RecordConfig from []any, which is typically from a parsed config file. -func (handle *RP) FromArgs(dc *models.DomainConfig, rec *models.RecordConfig, args []any) error { +func (handle *RP) FromArgs(dcn *domaintags.DomainNameVarieties, rec *models.RecordConfig, args []any) error { if err := rtypecontrol.PaveArgs(args[1:], "ss"); err != nil { return err } @@ -31,11 +32,11 @@ func (handle *RP) FromArgs(dc *models.DomainConfig, rec *models.RecordConfig, ar }, } - return handle.FromStruct(dc, rec, args[0].(string), fields) + return handle.FromStruct(dcn, rec, args[0].(string), fields) } // FromStruct fills in the RecordConfig from a struct, typically from an API response. -func (handle *RP) FromStruct(dc *models.DomainConfig, rec *models.RecordConfig, name string, fields any) error { +func (handle *RP) FromStruct(dcn *domaintags.DomainNameVarieties, rec *models.RecordConfig, name string, fields any) error { rec.F = fields rec.ZonefilePartial = rec.GetTargetRFC1035Quoted() diff --git a/pkg/rtypecontrol/import.go b/pkg/rtypecontrol/import.go index cd90720da..f94697807 100644 --- a/pkg/rtypecontrol/import.go +++ b/pkg/rtypecontrol/import.go @@ -14,7 +14,7 @@ func ImportRawRecords(domains []*models.DomainConfig) error { for _, dc := range domains { for _, rawRec := range dc.RawRecords { - rec, err := NewRecordConfigFromRaw(rawRec.Type, rawRec.TTL, rawRec.Args, dc) + rec, err := NewRecordConfigFromRaw(rawRec.Type, rawRec.TTL, rawRec.Args, dc.DomainNameVarieties()) if err != nil { return err } @@ -32,7 +32,7 @@ func ImportRawRecords(domains []*models.DomainConfig) error { return nil } -func NewRecordConfigFromRaw(t string, ttl uint32, args []any, dc *models.DomainConfig) (*models.RecordConfig, error) { +func NewRecordConfigFromRaw(t string, ttl uint32, args []any, dcn *domaintags.DomainNameVarieties) (*models.RecordConfig, error) { if _, ok := Func[t]; !ok { return nil, fmt.Errorf("record type %q is not supported", t) } @@ -46,10 +46,10 @@ func NewRecordConfigFromRaw(t string, ttl uint32, args []any, dc *models.DomainC TTL: ttl, Metadata: map[string]string{}, } - setRecordNames(rec, dc, args[0].(string)) + setRecordNames(rec, dcn, args[0].(string)) // Fill in the .F/.Fields* fields. - err := Func[t].FromArgs(dc, rec, args) + err := Func[t].FromArgs(dcn, rec, args) if err != nil { return nil, err } @@ -57,7 +57,7 @@ func NewRecordConfigFromRaw(t string, ttl uint32, args []any, dc *models.DomainC return rec, nil } -func NewRecordConfigFromString(name string, ttl uint32, t string, s string, dc *models.DomainConfig) (*models.RecordConfig, error) { +func NewRecordConfigFromString(name string, ttl uint32, t string, s string, dcn *domaintags.DomainNameVarieties) (*models.RecordConfig, error) { if _, ok := Func[t]; !ok { return nil, fmt.Errorf("record type %q is not supported", t) } @@ -69,11 +69,11 @@ func NewRecordConfigFromString(name string, ttl uint32, t string, s string, dc * if err != nil { return nil, err } - return NewRecordConfigFromStruct(name, ttl, t, rec, dc) + return NewRecordConfigFromStruct(name, ttl, t, rec, dcn) } -func NewRecordConfigFromStruct(name string, ttl uint32, t string, fields any, dc *models.DomainConfig) (*models.RecordConfig, error) { +func NewRecordConfigFromStruct(name string, ttl uint32, t string, fields any, dcn *domaintags.DomainNameVarieties) (*models.RecordConfig, error) { if _, ok := Func[t]; !ok { return nil, fmt.Errorf("record type %q is not supported", t) } @@ -87,9 +87,9 @@ func NewRecordConfigFromStruct(name string, ttl uint32, t string, fields any, dc TTL: ttl, Metadata: map[string]string{}, } - setRecordNames(rec, dc, name) + setRecordNames(rec, dcn, name) - err := Func[t].FromStruct(dc, rec, name, fields) + err := Func[t].FromStruct(dcn, rec, name, fields) if err != nil { return nil, err } @@ -98,7 +98,7 @@ func NewRecordConfigFromStruct(name string, ttl uint32, t string, fields any, dc } // setRecordNames updates the .Name* fields. -func setRecordNames(rec *models.RecordConfig, dc *models.DomainConfig, n string) { +func setRecordNames(rec *models.RecordConfig, dcn *domaintags.DomainNameVarieties, n string) { // FYI(tlim): This code could be collapse if rec.SubDomain == "" { // Not _EXTEND() mode: @@ -106,19 +106,19 @@ func setRecordNames(rec *models.RecordConfig, dc *models.DomainConfig, n string) rec.Name = "@" rec.NameRaw = "@" rec.NameUnicode = "@" - rec.NameFQDN = dc.Name - rec.NameFQDNRaw = dc.NameRaw - rec.NameFQDNUnicode = dc.NameUnicode - rec.NameFQDN = dc.Name - rec.NameFQDNRaw = dc.NameRaw - rec.NameFQDNUnicode = dc.NameUnicode + rec.NameFQDN = dcn.NameASCII + rec.NameFQDNRaw = dcn.NameRaw + rec.NameFQDNUnicode = dcn.NameUnicode + rec.NameFQDN = dcn.NameASCII + rec.NameFQDNRaw = dcn.NameRaw + rec.NameFQDNUnicode = dcn.NameUnicode } else { rec.Name = strings.ToLower(domaintags.EfficientToASCII(n)) rec.NameRaw = n rec.NameUnicode = domaintags.EfficientToUnicode(n) - rec.NameFQDN = rec.Name + "." + dc.Name - rec.NameFQDNRaw = rec.NameRaw + "." + dc.NameRaw - rec.NameFQDNUnicode = rec.NameUnicode + "." + dc.NameUnicode + rec.NameFQDN = rec.Name + "." + dcn.NameASCII + rec.NameFQDNRaw = rec.NameRaw + "." + dcn.NameRaw + rec.NameFQDNUnicode = rec.NameUnicode + "." + dcn.NameUnicode } } else { // D_EXTEND() mode: @@ -129,16 +129,16 @@ func setRecordNames(rec *models.RecordConfig, dc *models.DomainConfig, n string) rec.Name = sdASCII rec.NameRaw = sdRaw rec.NameUnicode = sdUnicode - rec.NameFQDN = rec.Name + "." + dc.Name - rec.NameFQDNRaw = rec.NameRaw + "." + dc.NameRaw - rec.NameFQDNUnicode = rec.NameUnicode + "." + dc.NameUnicode + rec.NameFQDN = rec.Name + "." + dcn.NameASCII + rec.NameFQDNRaw = rec.NameRaw + "." + dcn.NameRaw + rec.NameFQDNUnicode = rec.NameUnicode + "." + dcn.NameUnicode } else { rec.Name = domaintags.EfficientToASCII(n) + "." + sdASCII rec.NameRaw = n + "." + sdRaw rec.NameUnicode = domaintags.EfficientToUnicode(rec.Name) - rec.NameFQDN = rec.Name + "." + dc.Name - rec.NameFQDNRaw = rec.NameRaw + "." + dc.NameRaw - rec.NameFQDNUnicode = rec.NameUnicode + "." + dc.NameUnicode + rec.NameFQDN = rec.Name + "." + dcn.NameASCII + rec.NameFQDNRaw = rec.NameRaw + "." + dcn.NameRaw + rec.NameFQDNUnicode = rec.NameUnicode + "." + dcn.NameUnicode } } } diff --git a/pkg/rtypecontrol/rtypecontrol.go b/pkg/rtypecontrol/rtypecontrol.go index ebfbbd957..3c5b7077c 100644 --- a/pkg/rtypecontrol/rtypecontrol.go +++ b/pkg/rtypecontrol/rtypecontrol.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/StackExchange/dnscontrol/v4/models" + "github.com/StackExchange/dnscontrol/v4/pkg/domaintags" "github.com/StackExchange/dnscontrol/v4/providers" ) @@ -15,8 +16,8 @@ type RType interface { Name() string // RecordConfig factory. Updates a RecordConfig's fields based on args. - FromArgs(*models.DomainConfig, *models.RecordConfig, []any) error - FromStruct(*models.DomainConfig, *models.RecordConfig, string, any) error + FromArgs(*domaintags.DomainNameVarieties, *models.RecordConfig, []any) error + FromStruct(*domaintags.DomainNameVarieties, *models.RecordConfig, string, any) error CopyToLegacyFields(*models.RecordConfig) } diff --git a/pkg/rtypecontrol/setrecordnames_test.go b/pkg/rtypecontrol/setrecordnames_test.go index 3ed0956f4..8764b39b8 100644 --- a/pkg/rtypecontrol/setrecordnames_test.go +++ b/pkg/rtypecontrol/setrecordnames_test.go @@ -4,16 +4,17 @@ import ( "testing" "github.com/StackExchange/dnscontrol/v4/models" + "github.com/StackExchange/dnscontrol/v4/pkg/domaintags" ) func TestSetRecordNames(t *testing.T) { - dc := &models.DomainConfig{ - Name: "example.com", + dc := &domaintags.DomainNameVarieties{ + NameASCII: "example.com", NameRaw: "example.com", NameUnicode: "example.com", } - dcIDN := &models.DomainConfig{ - Name: "xn--bcher-kva.com", + dcIDN := &domaintags.DomainNameVarieties{ + NameASCII: "xn--bcher-kva.com", NameRaw: "bücher.com", NameUnicode: "bücher.com", } @@ -21,7 +22,7 @@ func TestSetRecordNames(t *testing.T) { tests := []struct { name string rec *models.RecordConfig - dc *models.DomainConfig + dc *domaintags.DomainNameVarieties n string expectedRec *models.RecordConfig }{ diff --git a/providers/bind/bindProvider.go b/providers/bind/bindProvider.go index a4b7b17c1..e7bc11211 100644 --- a/providers/bind/bindProvider.go +++ b/providers/bind/bindProvider.go @@ -170,7 +170,7 @@ func (c *bindProvider) GetZoneRecords(domain string, meta map[string]string) (mo if _, err := os.Stat(c.directory); os.IsNotExist(err) { printer.Printf("\nWARNING: BIND directory %q does not exist! (will create)\n", c.directory) } - ff := domaintags.DomainFixedForms{ + ff := domaintags.DomainNameVarieties{ Tag: meta[models.DomainTag], NameRaw: meta[models.DomainNameRaw], NameASCII: domain, @@ -216,7 +216,7 @@ func ParseZoneContents(content string, zoneName string, zonefileName string) (mo case dns.TypeRP: name := rr.Header().Name name = strings.TrimSuffix(name, ".") - prec, err = rtypecontrol.NewRecordConfigFromStruct(name, rr.Header().Ttl, "RP", rr, models.MakeFakeDomainConfig(zoneName)) + prec, err = rtypecontrol.NewRecordConfigFromStruct(name, rr.Header().Ttl, "RP", rr, domaintags.MakeDomainNameVarieties(zoneName)) if err != nil { return nil, err } @@ -301,7 +301,7 @@ func (c *bindProvider) GetZoneRecordsCorrections(dc *models.DomainConfig, foundR zonefile = filepath.Join(c.directory, makeFileName( c.filenameformat, - domaintags.DomainFixedForms{ + domaintags.DomainNameVarieties{ Tag: dc.Tag, NameRaw: dc.NameRaw, NameASCII: dc.Name, diff --git a/providers/bind/fnames.go b/providers/bind/fnames.go index b333e390d..0cdf7b318 100644 --- a/providers/bind/fnames.go +++ b/providers/bind/fnames.go @@ -11,7 +11,7 @@ import ( ) // makeFileName uses format to generate a zone's filename. See the -func makeFileName(format string, ff domaintags.DomainFixedForms) string { +func makeFileName(format string, ff domaintags.DomainNameVarieties) string { //fmt.Printf("DEBUG: makeFileName(%q, %+v)\n", format, ff) if format == "" { panic("BUG: makeFileName called with null format") diff --git a/providers/bind/fnames_test.go b/providers/bind/fnames_test.go index eee6e4591..e753fd6d0 100644 --- a/providers/bind/fnames_test.go +++ b/providers/bind/fnames_test.go @@ -15,14 +15,14 @@ func Test_makeFileName(t *testing.T) { fmtErrorOpt := "literal%?" fmtErrorUnk := "literal%o" // Unknown % verb - ff := domaintags.DomainFixedForms{ + ff := domaintags.DomainNameVarieties{ NameRaw: "domy", NameASCII: "idn", NameUnicode: "uni", UniqueName: "unique!taga", Tag: "tagy", } - tagless := domaintags.DomainFixedForms{ + tagless := domaintags.DomainNameVarieties{ NameRaw: "domy", NameASCII: "idn", NameUnicode: "uni", @@ -32,7 +32,7 @@ func Test_makeFileName(t *testing.T) { type args struct { format string - ff domaintags.DomainFixedForms + ff domaintags.DomainNameVarieties } tests := []struct { name string @@ -63,9 +63,9 @@ func Test_makeFileName(t *testing.T) { } func Test_makeFileName_2(t *testing.T) { - ff1 := domaintags.MakeDomainNameVarieties(`EXAMple.com`) - ff2 := domaintags.MakeDomainNameVarieties(`EXAMple.com!myTag`) - ff3 := domaintags.MakeDomainNameVarieties(`рф.com!myTag`) + ff1 := *domaintags.MakeDomainNameVarieties(`EXAMple.com`) + ff2 := *domaintags.MakeDomainNameVarieties(`EXAMple.com!myTag`) + ff3 := *domaintags.MakeDomainNameVarieties(`рф.com!myTag`) tests := []struct { name string diff --git a/providers/cloudflare/rest.go b/providers/cloudflare/rest.go index db2a29aba..bb6cbd1b1 100644 --- a/providers/cloudflare/rest.go +++ b/providers/cloudflare/rest.go @@ -10,6 +10,7 @@ import ( "golang.org/x/net/idna" "github.com/StackExchange/dnscontrol/v4/models" + "github.com/StackExchange/dnscontrol/v4/pkg/domaintags" "github.com/StackExchange/dnscontrol/v4/pkg/rtypecontrol" "github.com/StackExchange/dnscontrol/v4/providers/cloudflare/rtypes/cfsingleredirect" ) @@ -325,7 +326,7 @@ func (c *cloudflareProvider) getSingleRedirects(id string, domain string) ([]*mo "CLOUDFLAREAPI_SINGLE_REDIRECT", 1, []any{srName, code, srWhen, srThen}, - models.MakeFakeDomainConfig(domain)) + domaintags.MakeDomainNameVarieties(domain)) if err != nil { return nil, err } diff --git a/providers/cloudflare/rtypes/cfsingleredirect/cfredirect.go b/providers/cloudflare/rtypes/cfsingleredirect/cfredirect.go index 2f47e3ae9..779600804 100644 --- a/providers/cloudflare/rtypes/cfsingleredirect/cfredirect.go +++ b/providers/cloudflare/rtypes/cfsingleredirect/cfredirect.go @@ -5,6 +5,7 @@ import ( "sync" "github.com/StackExchange/dnscontrol/v4/models" + "github.com/StackExchange/dnscontrol/v4/pkg/domaintags" "github.com/StackExchange/dnscontrol/v4/pkg/rtypecontrol" ) @@ -20,11 +21,11 @@ func (handle *CfRedirect) Name() string { return "CF_REDIRECT" } -func (handle *CfRedirect) FromArgs(dc *models.DomainConfig, rec *models.RecordConfig, args []any) error { - return FromArgs_helper(dc, rec, args, 301) +func (handle *CfRedirect) FromArgs(dcn *domaintags.DomainNameVarieties, rec *models.RecordConfig, args []any) error { + return FromArgs_helper(dcn, rec, args, 301) } -func (handle *CfRedirect) FromStruct(dc *models.DomainConfig, rec *models.RecordConfig, name string, fields any) error { +func (handle *CfRedirect) FromStruct(dcn *domaintags.DomainNameVarieties, rec *models.RecordConfig, name string, fields any) error { panic("CF_REDIRECT: FromStruct not implemented") } @@ -39,11 +40,11 @@ func (handle *CfTempRedirect) Name() string { return "CF_TEMP_REDIRECT" } -func (handle *CfTempRedirect) FromArgs(dc *models.DomainConfig, rec *models.RecordConfig, args []any) error { - return FromArgs_helper(dc, rec, args, 302) +func (handle *CfTempRedirect) FromArgs(dcn *domaintags.DomainNameVarieties, rec *models.RecordConfig, args []any) error { + return FromArgs_helper(dcn, rec, args, 302) } -func (handle *CfTempRedirect) FromStruct(dc *models.DomainConfig, rec *models.RecordConfig, name string, fields any) error { +func (handle *CfTempRedirect) FromStruct(dcn *domaintags.DomainNameVarieties, rec *models.RecordConfig, name string, fields any) error { panic("CF_TEMP_REDIRECT: FromStruct not implemented") } @@ -51,7 +52,7 @@ func (handle *CfTempRedirect) CopyToLegacyFields(rec *models.RecordConfig) { // Nothing needs to be copied. The CLOUDFLAREAPI_SINGLE_REDIRECT FromArgs copies everything needed. } -func FromArgs_helper(dc *models.DomainConfig, rec *models.RecordConfig, args []any, code int) error { +func FromArgs_helper(dcn *domaintags.DomainNameVarieties, rec *models.RecordConfig, args []any, code int) error { // Pave the args to be the expected types. if err := rtypecontrol.PaveArgs(args, "ss"); err != nil { @@ -67,12 +68,12 @@ func FromArgs_helper(dc *models.DomainConfig, rec *models.RecordConfig, args []a } // Create the old-school name with a count prefix. - incRedirCount(dc.UniqueName) - name := fmt.Sprintf("%03d,%03d,%s,%s", getRedirCount(dc.UniqueName), code, prWhen, prThen) + incRedirCount(dcn.UniqueName) + name := fmt.Sprintf("%03d,%03d,%s,%s", getRedirCount(dcn.UniqueName), code, prWhen, prThen) sr := SingleRedirectConfig{} rec.Type = sr.Name() // This record is now a CLOUDFLAREAPI_SINGLE_REDIRECT - err = sr.FromArgs(dc, rec, []any{name, code, srWhen, srThen}) + err = sr.FromArgs(dcn, rec, []any{name, code, srWhen, srThen}) if err != nil { return err } diff --git a/providers/cloudflare/rtypes/cfsingleredirect/cfsingleredirect.go b/providers/cloudflare/rtypes/cfsingleredirect/cfsingleredirect.go index bf556d268..1545668b3 100644 --- a/providers/cloudflare/rtypes/cfsingleredirect/cfsingleredirect.go +++ b/providers/cloudflare/rtypes/cfsingleredirect/cfsingleredirect.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/StackExchange/dnscontrol/v4/models" + "github.com/StackExchange/dnscontrol/v4/pkg/domaintags" "github.com/StackExchange/dnscontrol/v4/pkg/rtypecontrol" ) @@ -30,7 +31,7 @@ func (handle *SingleRedirectConfig) Name() string { return "CLOUDFLAREAPI_SINGLE_REDIRECT" } -func (handle *SingleRedirectConfig) FromArgs(dc *models.DomainConfig, rec *models.RecordConfig, args []any) error { +func (handle *SingleRedirectConfig) FromArgs(dcn *domaintags.DomainNameVarieties, rec *models.RecordConfig, args []any) error { // Pave the args to be the expected types. if err := rtypecontrol.PaveArgs(args, "siss"); err != nil { return err @@ -66,9 +67,9 @@ func (handle *SingleRedirectConfig) FromArgs(dc *models.DomainConfig, rec *model rec.Name = "@" rec.NameRaw = "@" rec.NameUnicode = "@" - rec.NameFQDN = dc.Name - rec.NameFQDNRaw = dc.NameRaw - rec.NameFQDNUnicode = dc.NameUnicode + rec.NameFQDN = dcn.NameASCII + rec.NameFQDNRaw = dcn.NameRaw + rec.NameFQDNUnicode = dcn.NameUnicode rec.TTL = 1 // Fill in the legacy fields: @@ -76,7 +77,7 @@ func (handle *SingleRedirectConfig) FromArgs(dc *models.DomainConfig, rec *model return nil } -func (handle *SingleRedirectConfig) FromStruct(dc *models.DomainConfig, rec *models.RecordConfig, name string, fields any) error { +func (handle *SingleRedirectConfig) FromStruct(dcn *domaintags.DomainNameVarieties, rec *models.RecordConfig, name string, fields any) error { panic("CLOUDFLAREAPI_SINGLE_REDIRECT: FromStruct not implemented") } diff --git a/providers/gandiv5/convert.go b/providers/gandiv5/convert.go index 882e8bfa5..128c1c210 100644 --- a/providers/gandiv5/convert.go +++ b/providers/gandiv5/convert.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/StackExchange/dnscontrol/v4/models" + "github.com/StackExchange/dnscontrol/v4/pkg/domaintags" "github.com/StackExchange/dnscontrol/v4/pkg/printer" "github.com/StackExchange/dnscontrol/v4/pkg/rtypecontrol" "github.com/StackExchange/dnscontrol/v4/pkg/rtypeinfo" @@ -21,7 +22,7 @@ func nativeToRecords(n livedns.DomainRecord, origin string) (rcs []*models.Recor // n.RrsetValues rather than having many livedns.DomainRecord's. // We must split them out into individual records, one for each value. - dc := models.MakeFakeDomainConfig(origin) + dcn := domaintags.MakeDomainNameVarieties(origin) for _, value := range n.RrsetValues { var rc *models.RecordConfig @@ -30,7 +31,7 @@ func nativeToRecords(n livedns.DomainRecord, origin string) (rcs []*models.Recor rtype := n.RrsetType if rtypeinfo.IsModernType(rtype) { - rc, err = rtypecontrol.NewRecordConfigFromString(n.RrsetName, uint32(n.RrsetTTL), rtype, value, dc) + rc, err = rtypecontrol.NewRecordConfigFromString(n.RrsetName, uint32(n.RrsetTTL), rtype, value, dcn) if err != nil { return nil, fmt.Errorf("unparsable record received from gandi: %w", err) }