diff --git a/providers/namedotcom/auditrecords.go b/providers/namedotcom/auditrecords.go index 378a613b0..3fcbe6667 100644 --- a/providers/namedotcom/auditrecords.go +++ b/providers/namedotcom/auditrecords.go @@ -2,6 +2,8 @@ package namedotcom import ( "fmt" + "strings" + "github.com/StackExchange/dnscontrol/v3/models" "github.com/StackExchange/dnscontrol/v3/pkg/recordaudit" ) @@ -24,13 +26,24 @@ func AuditRecords(records []*models.RecordConfig) error { } // MaxLengthNDC returns and error if the sum of the strings -// are longer than permitted by DigitalOcean. Sadly their +// are longer than permitted by NDC. Sadly their // length limit is undocumented. This seems to work. func MaxLengthNDC(records []*models.RecordConfig) error { for _, rc := range records { if rc.HasFormatIdenticalToTXT() { // TXT and similar: - if len(rc.GetTargetField()) > 512 { + // Sum the length of the segments: + sum := 0 + for _, segment := range rc.TxtStrings { + sum += len(segment) // The length of each segment + sum += strings.Count(segment, `"`) // Add 1 for any char to be escaped + } + // Add the overhead of quoting them: + n := len(rc.TxtStrings) + if n > 0 { + sum += 2 + 3*(n-1) // Start and end double-quotes, plus `" "` between each segment. + } + if sum > 512 { return fmt.Errorf("encoded txt too long") } }