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:
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -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)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return "", err
|
||||
}
|
||||
|
||||
defer resp.Body.Close()
|
||||
dec := json.NewDecoder(resp.Body)
|
||||
dat := &gResp{}
|
||||
if err = dec.Decode(dat); err != nil {
|
||||
return nil, err
|
||||
return "", err
|
||||
}
|
||||
list := []string{}
|
||||
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 parsed *spflib.SPFRecord
|
||||
var domain string
|
||||
|
||||
var resolver = gResolver{}
|
||||
|
||||
func main() {
|
||||
jq(func() {
|
||||
jq("#lookup_btn").On(jquery.CLICK, func(e jquery.Event) {
|
||||
go func() {
|
||||
domain = jq("#domain").Val()
|
||||
rec, err := spflib.Lookup(domain, gResolver{})
|
||||
text, err := resolver.GetSPF(domain)
|
||||
fmt.Println(text)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
parsed, err = spflib.Parse(rec, gResolver{})
|
||||
parsed, err = spflib.Parse(text, resolver)
|
||||
if err != nil {
|
||||
// todo: show a better error
|
||||
panic(err)
|
||||
}
|
||||
jq("#results").SetHtml(buildHTML(parsed, domain))
|
||||
|
@ -53,6 +53,9 @@ func Parse(text string, dnsres Resolver) (*SPFRecord, error) {
|
||||
parts := strings.Split(text, " ")
|
||||
rec := &SPFRecord{}
|
||||
for _, part := range parts[1:] {
|
||||
if part == "" {
|
||||
continue
|
||||
}
|
||||
p := &SPFPart{Text: part}
|
||||
if qualifiers[part[0]] {
|
||||
part = part[1:]
|
||||
|
@ -27,3 +27,15 @@ func TestParse(t *testing.T) {
|
||||
}
|
||||
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())
|
||||
}
|
||||
|
Reference in New Issue
Block a user