1
0
mirror of https://github.com/StackExchange/dnscontrol.git synced 2024-05-11 05:55:12 +00:00

Work around extra whitespace in spf records (#361)

* handle empty spf parts from bad records

* update spf tool
This commit is contained in:
Craig Peterson
2018-05-03 10:03:38 -04:00
committed by GitHub
parent f77f202b65
commit 6c60eac7c7
5 changed files with 45077 additions and 32375 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -21,41 +21,45 @@ type gResp struct {
} }
} }
func (g gResolver) GetTxt(fqdn string) ([]string, error) { func (g gResolver) GetSPF(fqdn string) (string, error) {
resp, err := http.Get("https://dns.google.com/resolve?type=txt&name=" + fqdn) resp, err := http.Get("https://dns.google.com/resolve?type=txt&name=" + fqdn)
if err != nil { if err != nil {
return nil, err return "", err
} }
defer resp.Body.Close() defer resp.Body.Close()
dec := json.NewDecoder(resp.Body) dec := json.NewDecoder(resp.Body)
dat := &gResp{} dat := &gResp{}
if err = dec.Decode(dat); err != nil { if err = dec.Decode(dat); err != nil {
return nil, err return "", err
} }
list := []string{}
for _, a := range dat.Answer { for _, a := range dat.Answer {
list = append(list, strings.Trim(a.Data, "\"")) val := strings.Trim(a.Data, "\"")
if strings.HasPrefix(val, "v=spf1 ") {
return val, nil
}
} }
return list, nil return "", fmt.Errorf("No spf records found")
} }
var jq = jquery.NewJQuery var jq = jquery.NewJQuery
var parsed *spflib.SPFRecord var parsed *spflib.SPFRecord
var domain string var domain string
var resolver = gResolver{}
func main() { func main() {
jq(func() { jq(func() {
jq("#lookup_btn").On(jquery.CLICK, func(e jquery.Event) { jq("#lookup_btn").On(jquery.CLICK, func(e jquery.Event) {
go func() { go func() {
domain = jq("#domain").Val() domain = jq("#domain").Val()
rec, err := spflib.Lookup(domain, gResolver{}) text, err := resolver.GetSPF(domain)
fmt.Println(text)
if err != nil { if err != nil {
panic(err) panic(err)
} }
parsed, err = spflib.Parse(rec, gResolver{}) parsed, err = spflib.Parse(text, resolver)
if err != nil { if err != nil {
// todo: show a better error
panic(err) panic(err)
} }
jq("#results").SetHtml(buildHTML(parsed, domain)) jq("#results").SetHtml(buildHTML(parsed, domain))

View File

@ -53,6 +53,9 @@ func Parse(text string, dnsres Resolver) (*SPFRecord, error) {
parts := strings.Split(text, " ") parts := strings.Split(text, " ")
rec := &SPFRecord{} rec := &SPFRecord{}
for _, part := range parts[1:] { for _, part := range parts[1:] {
if part == "" {
continue
}
p := &SPFPart{Text: part} p := &SPFPart{Text: part}
if qualifiers[part[0]] { if qualifiers[part[0]] {
part = part[1:] part = part[1:]

View File

@ -27,3 +27,15 @@ func TestParse(t *testing.T) {
} }
t.Log(rec.Print()) t.Log(rec.Print())
} }
func TestParseWithDoubleSpaces(t *testing.T) {
dnsres, err := NewCache("testdata-dns1.json")
if err != nil {
t.Fatal(err)
}
rec, err := Parse("v=spf1 ip4:192.111.0.0/24 ip4:192.111.1.0/24 -all", dnsres)
if err != nil {
t.Fatal(err)
}
t.Log(rec.Print())
}