Add SPF record
This commit is contained in:
parent
a00f6f341c
commit
70122e69d5
47
types.go
47
types.go
|
@ -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"
|
||||
|
|
43
zscan_rr.go
43
zscan_rr.go
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue