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)
|
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))
|
||||||
|
@ -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:]
|
||||||
|
@ -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())
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user