Remove FakeDC hack. Replace with DC Name Varieties

This commit is contained in:
Thomas Limoncelli 2025-12-04 12:10:04 -05:00
parent 26b1913961
commit b0a909b853
No known key found for this signature in database
15 changed files with 98 additions and 90 deletions

View file

@ -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
}

View file

@ -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 != "",
}
}

View file

@ -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,

View file

@ -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

View file

@ -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()

View file

@ -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
}
}
}

View file

@ -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)
}

View file

@ -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
}{

View file

@ -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,

View file

@ -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")

View file

@ -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

View file

@ -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
}

View file

@ -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
}

View file

@ -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")
}

View file

@ -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)
}