From bf0badf2f27566e59a07531db42ee607b4f6e7b3 Mon Sep 17 00:00:00 2001 From: Tom Limoncelli Date: Mon, 26 Dec 2022 09:11:52 -0500 Subject: [PATCH] BUG: SPF split doesn't produce consistent output (#1865) --- pkg/normalize/flatten.go | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/pkg/normalize/flatten.go b/pkg/normalize/flatten.go index 44c2a0a76..60b1f8f59 100644 --- a/pkg/normalize/flatten.go +++ b/pkg/normalize/flatten.go @@ -2,13 +2,26 @@ package normalize import ( "fmt" + "sort" "strconv" "strings" "github.com/StackExchange/dnscontrol/v3/models" "github.com/StackExchange/dnscontrol/v3/pkg/spflib" + "golang.org/x/exp/constraints" ) +func sortedKeys[K constraints.Ordered, V any](m map[K]V) []K { + keys := make([]K, len(m)) + i := 0 + for k := range m { + keys[i] = k + i++ + } + sort.Slice(keys, func(i, j int) bool { return keys[i] < keys[j] }) + return keys +} + // hasSpfRecords returns true if this record requests SPF unrolling. func flattenSPFs(cfg *models.DNSConfig) []error { var cache spflib.CachingResolver @@ -74,7 +87,9 @@ func flattenSPFs(cfg *models.DNSConfig) []error { continue } recs := rec.TXTSplit(split+"."+domain.Name, overhead1, txtMaxSize) - for k, v := range recs { + + for _, k := range sortedKeys(recs) { + v := recs[k] if k == "@" { txt.SetTargetTXTs(v) } else {