2017-09-30 03:30:36 +08:00
package normalize
import (
Switch to Go 1.13 error wrapping (#604)
* Replaced errors.Wrap with fmt.Errorf (#589)
* Find: errors\.Wrap\(([^,]+),\s+(["`][^"`]*)(["`])\)
Replace: fmt.Errorf($2: %w$3, $1)
* Replaced errors.Wrapf with fmt.Errorf (#589)
* Find: errors\.Wrapf\(([^,]+),\s+(["`][^"`]*)(["`])\)
Replace: fmt.Errorf($2: %w$3, $1)
* Find: errors\.Wrapf\(([^,]+),\s+(["`][^"`]*)(["`])(,[^)]+)\)
* Replace: fmt.Errorf($2: %w$3$4, $1)
* Replaced errors.Errorf with fmt.Errorf (#589)
* Find: errors\.Errorf
Replace: fmt.Errorf
* Cleaned up remaining imports
* Cleanup
* Regenerate provider support matrix
This was broken by #533 ... and it's now the third time this has been missed.
2020-01-29 00:06:56 +08:00
"fmt"
2017-09-30 03:30:36 +08:00
"strings"
2020-04-15 04:47:30 +08:00
"github.com/StackExchange/dnscontrol/v3/models"
"github.com/StackExchange/dnscontrol/v3/pkg/spflib"
2017-09-30 03:30:36 +08:00
)
// hasSpfRecords returns true if this record requests SPF unrolling.
func flattenSPFs ( cfg * models . DNSConfig ) [ ] error {
var cache spflib . CachingResolver
var errs [ ] error
var err error
for _ , domain := range cfg . Domains {
2020-01-21 03:13:32 +08:00
apexTXTs := domain . Records . GroupedByKey ( ) [ models . RecordKey { Type : "TXT" , NameFQDN : domain . Name } ]
2017-09-30 03:30:36 +08:00
// flatten all spf records that have the "flatten" metadata
for _ , txt := range apexTXTs {
var rec * spflib . SPFRecord
if txt . Metadata [ "flatten" ] != "" || txt . Metadata [ "split" ] != "" {
if cache == nil {
cache , err = spflib . NewCache ( "spfcache.json" )
if err != nil {
return [ ] error { err }
}
}
2018-03-20 05:18:58 +08:00
rec , err = spflib . Parse ( txt . GetTargetField ( ) , cache )
2017-09-30 03:30:36 +08:00
if err != nil {
errs = append ( errs , err )
continue
}
}
2018-03-20 05:18:58 +08:00
if flatten , ok := txt . Metadata [ "flatten" ] ; ok && strings . HasPrefix ( txt . GetTargetField ( ) , "v=spf1" ) {
2017-09-30 03:30:36 +08:00
rec = rec . Flatten ( flatten )
2018-02-16 01:02:50 +08:00
err = txt . SetTargetTXT ( rec . TXT ( ) )
if err != nil {
errs = append ( errs , err )
continue
}
2017-09-30 03:30:36 +08:00
}
// now split if needed
if split , ok := txt . Metadata [ "split" ] ; ok {
if ! strings . Contains ( split , "%d" ) {
Switch to Go 1.13 error wrapping (#604)
* Replaced errors.Wrap with fmt.Errorf (#589)
* Find: errors\.Wrap\(([^,]+),\s+(["`][^"`]*)(["`])\)
Replace: fmt.Errorf($2: %w$3, $1)
* Replaced errors.Wrapf with fmt.Errorf (#589)
* Find: errors\.Wrapf\(([^,]+),\s+(["`][^"`]*)(["`])\)
Replace: fmt.Errorf($2: %w$3, $1)
* Find: errors\.Wrapf\(([^,]+),\s+(["`][^"`]*)(["`])(,[^)]+)\)
* Replace: fmt.Errorf($2: %w$3$4, $1)
* Replaced errors.Errorf with fmt.Errorf (#589)
* Find: errors\.Errorf
Replace: fmt.Errorf
* Cleaned up remaining imports
* Cleanup
* Regenerate provider support matrix
This was broken by #533 ... and it's now the third time this has been missed.
2020-01-29 00:06:56 +08:00
errs = append ( errs , Warning { fmt . Errorf ( "Split format `%s` in `%s` is not proper format (should have %%d in it)" , split , txt . GetLabelFQDN ( ) ) } )
2017-09-30 03:30:36 +08:00
continue
}
recs := rec . TXTSplit ( split + "." + domain . Name )
for k , v := range recs {
if k == "@" {
2018-02-16 01:02:50 +08:00
txt . SetTargetTXT ( v )
2017-09-30 03:30:36 +08:00
} else {
cp , _ := txt . Copy ( )
2018-02-16 01:02:50 +08:00
cp . SetTargetTXT ( v )
2018-03-20 05:18:58 +08:00
cp . SetLabelFromFQDN ( k , domain . Name )
2017-09-30 03:30:36 +08:00
domain . Records = append ( domain . Records , cp )
}
}
}
}
}
if cache == nil {
return errs
}
// check if cache is stale
for _ , e := range cache . ResolveErrors ( ) {
Switch to Go 1.13 error wrapping (#604)
* Replaced errors.Wrap with fmt.Errorf (#589)
* Find: errors\.Wrap\(([^,]+),\s+(["`][^"`]*)(["`])\)
Replace: fmt.Errorf($2: %w$3, $1)
* Replaced errors.Wrapf with fmt.Errorf (#589)
* Find: errors\.Wrapf\(([^,]+),\s+(["`][^"`]*)(["`])\)
Replace: fmt.Errorf($2: %w$3, $1)
* Find: errors\.Wrapf\(([^,]+),\s+(["`][^"`]*)(["`])(,[^)]+)\)
* Replace: fmt.Errorf($2: %w$3$4, $1)
* Replaced errors.Errorf with fmt.Errorf (#589)
* Find: errors\.Errorf
Replace: fmt.Errorf
* Cleaned up remaining imports
* Cleanup
* Regenerate provider support matrix
This was broken by #533 ... and it's now the third time this has been missed.
2020-01-29 00:06:56 +08:00
errs = append ( errs , Warning { fmt . Errorf ( "problem resolving SPF record: %s" , e ) } )
2017-09-30 03:30:36 +08:00
}
if len ( cache . ResolveErrors ( ) ) == 0 {
changed := cache . ChangedRecords ( )
if len ( changed ) > 0 {
if err := cache . Save ( "spfcache.updated.json" ) ; err != nil {
errs = append ( errs , err )
} else {
Switch to Go 1.13 error wrapping (#604)
* Replaced errors.Wrap with fmt.Errorf (#589)
* Find: errors\.Wrap\(([^,]+),\s+(["`][^"`]*)(["`])\)
Replace: fmt.Errorf($2: %w$3, $1)
* Replaced errors.Wrapf with fmt.Errorf (#589)
* Find: errors\.Wrapf\(([^,]+),\s+(["`][^"`]*)(["`])\)
Replace: fmt.Errorf($2: %w$3, $1)
* Find: errors\.Wrapf\(([^,]+),\s+(["`][^"`]*)(["`])(,[^)]+)\)
* Replace: fmt.Errorf($2: %w$3$4, $1)
* Replaced errors.Errorf with fmt.Errorf (#589)
* Find: errors\.Errorf
Replace: fmt.Errorf
* Cleaned up remaining imports
* Cleanup
* Regenerate provider support matrix
This was broken by #533 ... and it's now the third time this has been missed.
2020-01-29 00:06:56 +08:00
errs = append ( errs , Warning { fmt . Errorf ( "%d spf record lookups are out of date with cache (%s).\nWrote changes to spfcache.updated.json. Please rename and commit:\n $ mv spfcache.updated.json spfcache.json\n $ git commit -m'Update spfcache.json' spfcache.json" , len ( changed ) , strings . Join ( changed , "," ) ) } )
2017-09-30 03:30:36 +08:00
}
}
}
return errs
}