CLOUDFLAREAPI: Prevent web UI from displaying warnings about TXT records

This commit is contained in:
Tom Limoncelli 2025-10-27 16:41:27 -04:00
parent 6ef0648778
commit 1ca48e2bd6
4 changed files with 12 additions and 6 deletions

View file

@ -84,6 +84,8 @@ func TestTxtEncode(t *testing.T) {
data []string data []string
expected string expected string
}{ }{
{[]string{"simple"}, `"simple"`},
{[]string{`"quoted"`}, `"\"quoted\""`},
{[]string{}, `""`}, {[]string{}, `""`},
{[]string{``}, `""`}, {[]string{``}, `""`},
{[]string{`foo`}, `"foo"`}, {[]string{`foo`}, `"foo"`},

View file

@ -11,9 +11,7 @@ import (
func AuditRecords(records []*models.RecordConfig) []error { func AuditRecords(records []*models.RecordConfig) []error {
a := rejectif.Auditor{} a := rejectif.Auditor{}
a.Add("TXT", rejectif.TxtHasTrailingSpace) // Last verified 2022-06-18 a.Add("TXT", rejectif.TxtIsEmpty) // Last verified 2024-10-27
a.Add("TXT", rejectif.TxtIsEmpty) // Last verified 2022-06-18
return a.Audit(records) return a.Audit(records)
} }

View file

@ -18,6 +18,7 @@ import (
"github.com/StackExchange/dnscontrol/v4/pkg/diff2" "github.com/StackExchange/dnscontrol/v4/pkg/diff2"
"github.com/StackExchange/dnscontrol/v4/pkg/printer" "github.com/StackExchange/dnscontrol/v4/pkg/printer"
"github.com/StackExchange/dnscontrol/v4/pkg/transform" "github.com/StackExchange/dnscontrol/v4/pkg/transform"
"github.com/StackExchange/dnscontrol/v4/pkg/txtutil"
"github.com/StackExchange/dnscontrol/v4/pkg/zonecache" "github.com/StackExchange/dnscontrol/v4/pkg/zonecache"
"github.com/StackExchange/dnscontrol/v4/providers" "github.com/StackExchange/dnscontrol/v4/providers"
"github.com/StackExchange/dnscontrol/v4/providers/cloudflare/rtypes/cfsingleredirect" "github.com/StackExchange/dnscontrol/v4/providers/cloudflare/rtypes/cfsingleredirect"
@ -871,7 +872,11 @@ func (c *cloudflareProvider) nativeToRecord(domain string, cr cloudflare.DNSReco
return nil, fmt.Errorf("unparsable SRV record received from cloudflare: %w", err) return nil, fmt.Errorf("unparsable SRV record received from cloudflare: %w", err)
} }
case "TXT": case "TXT":
err := rc.SetTargetTXT(cr.Content) s, err := txtutil.ParseQuoted(cr.Content)
if err != nil {
return rc, err
}
err = rc.SetTargetTXT(s)
return rc, err return rc, err
default: default:
if err := rc.PopulateFromString(rType, cr.Content, domain); err != nil { if err := rc.PopulateFromString(rType, cr.Content, domain); err != nil {

View file

@ -10,6 +10,7 @@ import (
"golang.org/x/net/idna" "golang.org/x/net/idna"
"github.com/StackExchange/dnscontrol/v4/models" "github.com/StackExchange/dnscontrol/v4/models"
"github.com/StackExchange/dnscontrol/v4/pkg/txtutil"
"github.com/StackExchange/dnscontrol/v4/providers/cloudflare/rtypes/cfsingleredirect" "github.com/StackExchange/dnscontrol/v4/providers/cloudflare/rtypes/cfsingleredirect"
) )
@ -154,7 +155,7 @@ func (c *cloudflareProvider) createRecDiff2(rec *models.RecordConfig, domainID s
prio = fmt.Sprintf(" %d ", rec.MxPreference) prio = fmt.Sprintf(" %d ", rec.MxPreference)
} }
if rec.Type == "TXT" { if rec.Type == "TXT" {
content = rec.GetTargetTXTJoined() content = txtutil.EncodeQuoted(rec.GetTargetTXTJoined())
} }
if rec.Type == "DS" { if rec.Type == "DS" {
content = fmt.Sprintf("%d %d %d %s", rec.DsKeyTag, rec.DsAlgorithm, rec.DsDigestType, rec.DsDigest) content = fmt.Sprintf("%d %d %d %s", rec.DsKeyTag, rec.DsAlgorithm, rec.DsDigestType, rec.DsDigest)
@ -229,7 +230,7 @@ func (c *cloudflareProvider) modifyRecord(domainID, recID string, proxied bool,
TTL: int(rec.TTL), TTL: int(rec.TTL),
} }
if rec.Type == "TXT" { if rec.Type == "TXT" {
r.Content = rec.GetTargetTXTJoined() r.Content = txtutil.EncodeQuoted(rec.GetTargetTXTJoined())
} }
if rec.Type == "SRV" { if rec.Type == "SRV" {
r.Data = cfSrvData(rec) r.Data = cfSrvData(rec)