This commit is contained in:
Thomas Limoncelli 2025-11-25 17:54:44 -05:00
parent acc6d362d0
commit 76791cefc7
No known key found for this signature in database
2 changed files with 118 additions and 0 deletions

29
pkg/domaintags/idn.go Normal file
View file

@ -0,0 +1,29 @@
package domaintags
import "golang.org/x/net/idna"
func EfficientToASCII(name string) string {
nameIDN, err := idna.ToASCII(name)
if err != nil {
return name // Fallback to raw name on error.
} else {
// Avoid pointless duplication.
if nameIDN == name {
return name
}
}
return nameIDN
}
func EfficientToUnicode(name string) string {
nameUnicode, err := idna.ToUnicode(name)
if err != nil {
return name // Fallback to raw name on error.
} else {
// Avoid pointless duplication.
if nameUnicode == name {
return name
}
}
return nameUnicode
}

View file

@ -0,0 +1,89 @@
package rtypecontrol
import (
"fmt"
"github.com/StackExchange/dnscontrol/v4/models"
"github.com/StackExchange/dnscontrol/v4/pkg/domaintags"
"github.com/miekg/dns/dnsutil"
)
// ImportRawRecords imports the RawRecordConfigs into RecordConfigs.
func ImportRawRecords(domains []*models.DomainConfig) error {
for _, dc := range domains {
for _, rawRec := range dc.RawRecords {
// Create as much of the RecordConfig as we can now. Allow New() to fill in the reset.
rec := &models.RecordConfig{
Type: rawRec.Type,
TTL: rawRec.TTL,
Metadata: stringifyMetas(rawRec.Metas),
//FilePos: models.FixPosition(rawRec.FilePos),
}
setRecordNames(rec, dc, rawRec.Args[0].(string))
// Fill in the .F/.Fields* fields.
err := Func[rawRec.Type].FromArgs(rec, rawRec.Args)
if err != nil {
return err
}
// Free memeory:
clear(rawRec.Args)
rawRec.Args = nil
dc.Records = append(dc.Records, rec)
}
dc.RawRecords = nil
}
return nil
}
func stringifyMetas(metas []map[string]any) map[string]string {
result := make(map[string]string)
for _, m := range metas {
for mk, mv := range m {
if v, ok := mv.(string); ok {
result[mk] = v // Already a string. No new malloc.
} else {
result[mk] = fmt.Sprintf("%v", mv)
}
}
}
return result
}
func setRecordNames(rec *models.RecordConfig, dc *models.DomainConfig, n string) {
if rec.SubDomain == "" {
// Not _EXTEND() mode:
if rec.Name == "@" {
rec.NameRaw = rec.Name
rec.Name = rec.Name
} else {
rec.Name = domaintags.EfficientToASCII(n)
rec.NameRaw = n
rec.Name = domaintags.EfficientToUnicode(n)
}
rec.NameFQDN = dnsutil.AddOrigin(rec.Name, dc.Name)
rec.NameFQDNRaw = dnsutil.AddOrigin(rec.NameRaw, dc.NameRaw)
rec.NameFQDNUnicode = dnsutil.AddOrigin(rec.NameUnicode, dc.NameUnicode)
} else {
// _EXTEND() mode:
// FIXME(tlim): Not implemented.
if rec.Name == "@" {
rec.NameRaw = rec.Name
rec.Name = rec.Name
} else {
rec.Name = domaintags.EfficientToASCII(n)
rec.NameRaw = n
rec.Name = domaintags.EfficientToUnicode(n)
}
rec.NameFQDN = dnsutil.AddOrigin(rec.Name, dc.Name)
rec.NameFQDNRaw = dnsutil.AddOrigin(rec.NameRaw, dc.NameRaw)
rec.NameFQDNUnicode = dnsutil.AddOrigin(rec.NameUnicode, dc.NameUnicode)
}
}