Add SPF record

This commit is contained in:
Miek Gieben 2012-02-18 18:59:19 +01:00
parent a00f6f341c
commit 70122e69d5
2 changed files with 72 additions and 18 deletions

View File

@ -402,6 +402,35 @@ func (rr *RR_TXT) Len() int {
return l
}
type RR_SPF struct {
Hdr RR_Header
Txt []string "txt"
}
func (rr *RR_SPF) Header() *RR_Header {
return &rr.Hdr
}
func (rr *RR_SPF) String() string {
s := rr.Hdr.String()
for i, s1 := range rr.Txt {
if i > 0 {
s += " " + "\"" + s1 + "\""
} else {
s += "\"" + s1 + "\""
}
}
return s
}
func (rr *RR_SPF) Len() int {
l := rr.Hdr.Len()
for _, t := range rr.Txt {
l += len(t)
}
return l
}
type RR_SRV struct {
Hdr RR_Header
Priority uint16
@ -859,24 +888,6 @@ func (rr *RR_NSEC3PARAM) Len() int {
return rr.Hdr.Len() + 2 + 4 + 1 + len(rr.Salt)/2
}
// See RFC 4408.
type RR_SPF struct {
Hdr RR_Header
Txt string
}
func (rr *RR_SPF) Header() *RR_Header {
return &rr.Hdr
}
func (rr *RR_SPF) String() string {
return rr.Hdr.String() + "\"" + rr.Txt + "\""
}
func (rr *RR_SPF) Len() int {
return rr.Hdr.Len() + len(rr.Txt)
}
type RR_TKEY struct {
Hdr RR_Header
Algorithm string "domain-name"

View File

@ -68,6 +68,8 @@ func setRR(h RR_Header, c chan lex, o, f string) (RR, *ParseError) {
return setDS(h, c, f)
case TypeTXT:
return setTXT(h, c, f)
case TypeSPF:
return setSPF(h, c, f)
case TypeIPSECKEY:
return setIPSECKEY(h, c, o, f)
default:
@ -780,6 +782,47 @@ func setRFC3597(h RR_Header, c chan lex, f string) (RR, *ParseError) {
return rr, nil
}
func setSPF(h RR_Header, c chan lex, f string) (RR, *ParseError) {
rr := new(RR_SPF)
rr.Hdr = h
// Get the remaining data until we see a NEWLINE
quote := false
l := <-c
var s []string
switch l.value == _QUOTE {
case true: // A number of quoted string
s = make([]string, 0)
for l.value != _NEWLINE && l.value != _EOF {
switch l.value {
case _STRING:
s = append(s, l.token)
case _BLANK:
if quote {
// _BLANK can only be seen in between txt parts.
return nil, &ParseError{f, "bad SPF Txt", l}
}
case _QUOTE:
quote = !quote
default:
return nil, &ParseError{f, "bad SPF Txt", l}
}
l = <-c
}
if quote {
return nil, &ParseError{f, "bad SPF Txt", l}
}
case false: // Unquoted text record
s = make([]string, 1)
for l.value != _NEWLINE && l.value != _EOF {
s[0] += l.token
l = <-c
}
}
rr.Txt = s
return rr, nil
}
func setTXT(h RR_Header, c chan lex, f string) (RR, *ParseError) {
rr := new(RR_TXT)
rr.Hdr = h