Fix $ORIGIN in zonefiles
also check if a dname isn't fq, and add $ORIGIN is not.
This commit is contained in:
parent
822c8c66e2
commit
0322d3a9da
32
defaults.go
32
defaults.go
|
@ -196,53 +196,59 @@ func (dns *Msg) IsEdns0() (ok bool) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsDomainName checks if s is a valid domainname.
|
// IsDomainName checks if s is a valid domainname, it returns
|
||||||
func IsDomainName(s string) bool { // copied from net package.
|
// true and a length, when a domain name is valid. When false
|
||||||
|
// is return the length isn't specified.
|
||||||
|
func IsDomainName(s string) (bool, int) { // copied from net package.
|
||||||
// See RFC 1035, RFC 3696.
|
// See RFC 1035, RFC 3696.
|
||||||
if len(s) == 0 {
|
if len(s) == 0 {
|
||||||
return false
|
return false, 0
|
||||||
}
|
}
|
||||||
if len(s) > 255 {
|
if len(s) > 255 { // Not true...?
|
||||||
return false
|
return false, 0
|
||||||
}
|
|
||||||
if s[len(s)-1] != '.' { // simplify checking loop: make name end in dot
|
|
||||||
s += "."
|
|
||||||
}
|
}
|
||||||
|
if !Fqdn(s) { // simplify checking loop: make name end in dot
|
||||||
|
s += "."
|
||||||
|
}
|
||||||
|
|
||||||
last := byte('.')
|
last := byte('.')
|
||||||
ok := false // ok once we've seen a letter
|
ok := false // ok once we've seen a letter
|
||||||
partlen := 0
|
partlen := 0
|
||||||
|
n := 0
|
||||||
for i := 0; i < len(s); i++ {
|
for i := 0; i < len(s); i++ {
|
||||||
c := s[i]
|
c := s[i]
|
||||||
switch {
|
switch {
|
||||||
default:
|
default:
|
||||||
return false
|
return false, 0
|
||||||
case 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || c == '_' || c == '*':
|
case 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || c == '_' || c == '*':
|
||||||
ok = true
|
ok = true
|
||||||
partlen++
|
partlen++
|
||||||
|
n++
|
||||||
case '0' <= c && c <= '9':
|
case '0' <= c && c <= '9':
|
||||||
// fine
|
// fine
|
||||||
partlen++
|
partlen++
|
||||||
|
n++
|
||||||
case c == '-':
|
case c == '-':
|
||||||
// byte before dash cannot be dot
|
// byte before dash cannot be dot
|
||||||
if last == '.' {
|
if last == '.' {
|
||||||
return false
|
return false, 0
|
||||||
}
|
}
|
||||||
partlen++
|
partlen++
|
||||||
case c == '.':
|
case c == '.':
|
||||||
// byte before dot cannot be dot, dash
|
// byte before dot cannot be dot, dash
|
||||||
if last == '.' || last == '-' {
|
if last == '.' || last == '-' {
|
||||||
return false
|
return false, 0
|
||||||
}
|
}
|
||||||
if partlen > 63 || partlen == 0 {
|
if partlen > 63 || partlen == 0 {
|
||||||
return false
|
return false, 0
|
||||||
}
|
}
|
||||||
partlen = 0
|
partlen = 0
|
||||||
|
n++
|
||||||
}
|
}
|
||||||
last = c
|
last = c
|
||||||
}
|
}
|
||||||
|
|
||||||
return ok
|
return ok, n
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the number of labels in a domain name.
|
// Return the number of labels in a domain name.
|
||||||
|
|
21
dns.go
21
dns.go
|
@ -230,19 +230,10 @@ func zoneMatch(pattern, zone string) (ok bool) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// DnameLength returns the length of a packed dname.
|
// Fqdn checks if a domain name is fully qualified
|
||||||
func DomainNameLength(s string) int { // TODO better name
|
func Fqdn(s string) bool {
|
||||||
// Special case for '.'
|
if len(s) == 0 {
|
||||||
if s == "." {
|
return false // ?
|
||||||
return 1
|
}
|
||||||
}
|
return s[len(s)-1] == '.'
|
||||||
|
|
||||||
// Add trailing dot to canonicalize name.
|
|
||||||
if n := len(s); n == 0 || s[n-1] != '.' {
|
|
||||||
return n + 1
|
|
||||||
} else {
|
|
||||||
return n + 1
|
|
||||||
}
|
|
||||||
panic("not reached")
|
|
||||||
return 0
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -137,6 +137,8 @@ func TestParseBrace(t *testing.T) {
|
||||||
`miek.nl. IN (
|
`miek.nl. IN (
|
||||||
3600 A 127.0.0.1)`: "miek.nl.\t3600\tIN\tA\t127.0.0.1",
|
3600 A 127.0.0.1)`: "miek.nl.\t3600\tIN\tA\t127.0.0.1",
|
||||||
"(miek.nl.) (A) (127.0.0.1)": "miek.nl.\t3600\tIN\tA\t127.0.0.1",
|
"(miek.nl.) (A) (127.0.0.1)": "miek.nl.\t3600\tIN\tA\t127.0.0.1",
|
||||||
|
"miek.nl A 127.0.0.1": "miek.nl.\t3600\tIN\tA\t127.0.0.1",
|
||||||
|
"miek.nl. NS ns.miek.nl": "miek.nl.\t3600\tIN\tNS\tns.miek.nl.",
|
||||||
`(miek.nl.) (
|
`(miek.nl.) (
|
||||||
(IN)
|
(IN)
|
||||||
(AAAA)
|
(AAAA)
|
||||||
|
@ -145,6 +147,7 @@ func TestParseBrace(t *testing.T) {
|
||||||
(IN)
|
(IN)
|
||||||
(AAAA)
|
(AAAA)
|
||||||
(::1))`: "miek.nl.\t3600\tIN\tAAAA\t::1",
|
(::1))`: "miek.nl.\t3600\tIN\tAAAA\t::1",
|
||||||
|
"miek\\.nl. IN A 127.0.0.1": "miek\\.nl.\t3600\tIN\tA\t127.0.0.1",
|
||||||
"miek.nl. IN A 127.0.0.1": "miek.nl.\t3600\tIN\tA\t127.0.0.1",
|
"miek.nl. IN A 127.0.0.1": "miek.nl.\t3600\tIN\tA\t127.0.0.1",
|
||||||
`miek.nl. 86400 IN SOA elektron.atoom.net. miekg.atoom.net. (
|
`miek.nl. 86400 IN SOA elektron.atoom.net. miekg.atoom.net. (
|
||||||
2009032802 ; serial
|
2009032802 ; serial
|
||||||
|
|
104
zscan.go
104
zscan.go
|
@ -46,6 +46,8 @@ const (
|
||||||
_EXPECT_RDATA // The first element of the rdata
|
_EXPECT_RDATA // The first element of the rdata
|
||||||
_EXPECT_DIRTTL_BL // Space after directive $TTL
|
_EXPECT_DIRTTL_BL // Space after directive $TTL
|
||||||
_EXPECT_DIRTTL // Directive $TTL
|
_EXPECT_DIRTTL // Directive $TTL
|
||||||
|
_EXPECT_DIRORIGIN_BL // Space after directive $ORIGIN
|
||||||
|
_EXPECT_DIRORIGIN // Directive $ORIGIN
|
||||||
)
|
)
|
||||||
|
|
||||||
// ParseError contains the parse error and the location in the io.Reader
|
// ParseError contains the parse error and the location in the io.Reader
|
||||||
|
@ -84,9 +86,9 @@ type Token struct {
|
||||||
func NewRR(s string) (RR, error) {
|
func NewRR(s string) (RR, error) {
|
||||||
t := make(chan Token)
|
t := make(chan Token)
|
||||||
if s[len(s)-1] != '\n' { // We need a closing newline
|
if s[len(s)-1] != '\n' { // We need a closing newline
|
||||||
t = ParseZone(strings.NewReader(s+"\n"))
|
t = ParseZone(strings.NewReader(s + "\n"))
|
||||||
} else {
|
} else {
|
||||||
t= ParseZone(strings.NewReader(s))
|
t = ParseZone(strings.NewReader(s))
|
||||||
}
|
}
|
||||||
r := <-t
|
r := <-t
|
||||||
if r.Error != nil {
|
if r.Error != nil {
|
||||||
|
@ -97,10 +99,10 @@ func NewRR(s string) (RR, error) {
|
||||||
|
|
||||||
// ParseZone reads a RFC 1035 zone from r. It returns each parsed RR or on error
|
// ParseZone reads a RFC 1035 zone from r. It returns each parsed RR or on error
|
||||||
// on the returned channel. The channel t is closed by ParseZone when the end of r is reached.
|
// on the returned channel. The channel t is closed by ParseZone when the end of r is reached.
|
||||||
func ParseZone(r io.Reader) (chan Token) {
|
func ParseZone(r io.Reader) chan Token {
|
||||||
t := make(chan Token)
|
t := make(chan Token)
|
||||||
go parseZone(r, t)
|
go parseZone(r, t)
|
||||||
return t
|
return t
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseZone(r io.Reader, t chan Token) {
|
func parseZone(r io.Reader, t chan Token) {
|
||||||
|
@ -124,6 +126,7 @@ func parseZone(r io.Reader, t chan Token) {
|
||||||
var h RR_Header
|
var h RR_Header
|
||||||
var ok bool
|
var ok bool
|
||||||
var defttl uint32 = DefaultTtl
|
var defttl uint32 = DefaultTtl
|
||||||
|
var origin string = "."
|
||||||
for l := range c {
|
for l := range c {
|
||||||
if _DEBUG {
|
if _DEBUG {
|
||||||
fmt.Printf("[%v]\n", l)
|
fmt.Printf("[%v]\n", l)
|
||||||
|
@ -144,9 +147,18 @@ func parseZone(r io.Reader, t chan Token) {
|
||||||
st = _EXPECT_OWNER_DIR
|
st = _EXPECT_OWNER_DIR
|
||||||
case _OWNER:
|
case _OWNER:
|
||||||
h.Name = l.token
|
h.Name = l.token
|
||||||
|
if ok, _ := IsDomainName(l.token); !ok {
|
||||||
|
t <- Token{Error: &ParseError{"bad owner name", l}}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !Fqdn(h.Name) {
|
||||||
|
h.Name += origin
|
||||||
|
}
|
||||||
st = _EXPECT_OWNER_BL
|
st = _EXPECT_OWNER_BL
|
||||||
case _DIRTTL:
|
case _DIRTTL:
|
||||||
st = _EXPECT_DIRTTL_BL
|
st = _EXPECT_DIRTTL_BL
|
||||||
|
case _DIRORIGIN:
|
||||||
|
st = _EXPECT_DIRORIGIN_BL
|
||||||
default:
|
default:
|
||||||
t <- Token{Error: &ParseError{"Error at the start", l}}
|
t <- Token{Error: &ParseError{"Error at the start", l}}
|
||||||
return
|
return
|
||||||
|
@ -167,8 +179,23 @@ func parseZone(r io.Reader, t chan Token) {
|
||||||
} else {
|
} else {
|
||||||
defttl = ttl
|
defttl = ttl
|
||||||
}
|
}
|
||||||
|
|
||||||
st = _EXPECT_OWNER_DIR
|
st = _EXPECT_OWNER_DIR
|
||||||
|
case _EXPECT_DIRORIGIN_BL:
|
||||||
|
if l.value != _BLANK {
|
||||||
|
t <- Token{Error: &ParseError{"No blank after $-directive", l}}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
st = _EXPECT_DIRORIGIN
|
||||||
|
case _EXPECT_DIRORIGIN:
|
||||||
|
if l.value != _STRING {
|
||||||
|
t <- Token{Error: &ParseError{"Expecting $ORIGIN value, not this...", l}}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !Fqdn(l.token) {
|
||||||
|
origin = l.token + origin // Append old origin if the new one isn't a fqdn
|
||||||
|
} else {
|
||||||
|
origin = l.token
|
||||||
|
}
|
||||||
case _EXPECT_OWNER_BL:
|
case _EXPECT_OWNER_BL:
|
||||||
if l.value != _BLANK {
|
if l.value != _BLANK {
|
||||||
t <- Token{Error: &ParseError{"No blank after owner", l}}
|
t <- Token{Error: &ParseError{"No blank after owner", l}}
|
||||||
|
@ -254,7 +281,7 @@ func parseZone(r io.Reader, t chan Token) {
|
||||||
st = _EXPECT_RDATA
|
st = _EXPECT_RDATA
|
||||||
case _EXPECT_RDATA:
|
case _EXPECT_RDATA:
|
||||||
// I could save my token here...? l
|
// I could save my token here...? l
|
||||||
r, e := setRR(h, c)
|
r, e := setRR(h, c, origin)
|
||||||
if e != nil {
|
if e != nil {
|
||||||
// If e.lex is nil than we have encounter a unknown RR type
|
// If e.lex is nil than we have encounter a unknown RR type
|
||||||
// in that case we substitute our current lex token
|
// in that case we substitute our current lex token
|
||||||
|
@ -308,7 +335,7 @@ func zlexer(s scanner.Scanner, c chan lex) {
|
||||||
l.line = s.Position.Line
|
l.line = s.Position.Line
|
||||||
switch x := s.TokenText(); x {
|
switch x := s.TokenText(); x {
|
||||||
case " ", "\t":
|
case " ", "\t":
|
||||||
escape = false
|
escape = false
|
||||||
if commt {
|
if commt {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
@ -319,7 +346,7 @@ func zlexer(s scanner.Scanner, c chan lex) {
|
||||||
// If we have a string and its the first, make it an owner
|
// If we have a string and its the first, make it an owner
|
||||||
l.value = _OWNER
|
l.value = _OWNER
|
||||||
l.token = str
|
l.token = str
|
||||||
// escape $... start with a \ not a $, so this will work
|
// escape $... start with a \ not a $, so this will work
|
||||||
if str == "$TTL" {
|
if str == "$TTL" {
|
||||||
l.value = _DIRTTL
|
l.value = _DIRTTL
|
||||||
}
|
}
|
||||||
|
@ -351,11 +378,11 @@ func zlexer(s scanner.Scanner, c chan lex) {
|
||||||
owner = false
|
owner = false
|
||||||
space = true
|
space = true
|
||||||
case ";":
|
case ";":
|
||||||
if escape {
|
if escape {
|
||||||
escape = false
|
escape = false
|
||||||
str += ";"
|
str += ";"
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if quote {
|
if quote {
|
||||||
// Inside quoted text we allow ;
|
// Inside quoted text we allow ;
|
||||||
str += ";"
|
str += ";"
|
||||||
|
@ -363,8 +390,8 @@ func zlexer(s scanner.Scanner, c chan lex) {
|
||||||
}
|
}
|
||||||
commt = true
|
commt = true
|
||||||
case "\n":
|
case "\n":
|
||||||
// Hmmm, escape newline
|
// Hmmm, escape newline
|
||||||
escape = false
|
escape = false
|
||||||
if commt {
|
if commt {
|
||||||
// Reset a comment
|
// Reset a comment
|
||||||
commt = false
|
commt = false
|
||||||
|
@ -413,42 +440,43 @@ func zlexer(s scanner.Scanner, c chan lex) {
|
||||||
if commt {
|
if commt {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if escape {
|
if escape {
|
||||||
str += "\\"
|
str += "\\"
|
||||||
escape = false
|
escape = false
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
str += "\\"
|
||||||
escape = true
|
escape = true
|
||||||
case "\"":
|
case "\"":
|
||||||
if commt {
|
if commt {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if escape {
|
if escape {
|
||||||
str += "\""
|
str += "\""
|
||||||
escape = false
|
escape = false
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
// str += "\"" don't add quoted quotes
|
// str += "\"" don't add quoted quotes
|
||||||
quote = !quote
|
quote = !quote
|
||||||
case "(":
|
case "(":
|
||||||
if commt {
|
if commt {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if escape {
|
if escape {
|
||||||
str += "("
|
str += "("
|
||||||
escape = false
|
escape = false
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
brace++
|
brace++
|
||||||
case ")":
|
case ")":
|
||||||
if commt {
|
if commt {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if escape {
|
if escape {
|
||||||
str += ")"
|
str += ")"
|
||||||
escape = false
|
escape = false
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
brace--
|
brace--
|
||||||
if brace < 0 {
|
if brace < 0 {
|
||||||
l.err = "Extra closing brace"
|
l.err = "Extra closing brace"
|
||||||
|
@ -459,7 +487,7 @@ func zlexer(s scanner.Scanner, c chan lex) {
|
||||||
if commt {
|
if commt {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
escape = false
|
escape = false
|
||||||
str += x
|
str += x
|
||||||
space = false
|
space = false
|
||||||
}
|
}
|
||||||
|
|
77
zscan_rr.go
77
zscan_rr.go
|
@ -13,7 +13,7 @@ import (
|
||||||
// or immediately a _NEWLINE. If this is not the case we flag
|
// or immediately a _NEWLINE. If this is not the case we flag
|
||||||
// an *ParseError: garbage after rdata.
|
// an *ParseError: garbage after rdata.
|
||||||
|
|
||||||
func setRR(h RR_Header, c chan lex) (RR, *ParseError) {
|
func setRR(h RR_Header, c chan lex, o string) (RR, *ParseError) {
|
||||||
var r RR
|
var r RR
|
||||||
e := new(ParseError)
|
e := new(ParseError)
|
||||||
switch h.Rrtype {
|
switch h.Rrtype {
|
||||||
|
@ -24,16 +24,16 @@ func setRR(h RR_Header, c chan lex) (RR, *ParseError) {
|
||||||
r, e = setAAAA(h, c)
|
r, e = setAAAA(h, c)
|
||||||
goto Slurp
|
goto Slurp
|
||||||
case TypeNS:
|
case TypeNS:
|
||||||
r, e = setNS(h, c)
|
r, e = setNS(h, c, o)
|
||||||
goto Slurp
|
goto Slurp
|
||||||
case TypeMX:
|
case TypeMX:
|
||||||
r, e = setMX(h, c)
|
r, e = setMX(h, c, o)
|
||||||
goto Slurp
|
goto Slurp
|
||||||
case TypeCNAME:
|
case TypeCNAME:
|
||||||
r, e = setCNAME(h, c)
|
r, e = setCNAME(h, c, o)
|
||||||
goto Slurp
|
goto Slurp
|
||||||
case TypeSOA:
|
case TypeSOA:
|
||||||
r, e = setSOA(h, c)
|
r, e = setSOA(h, c, o)
|
||||||
goto Slurp
|
goto Slurp
|
||||||
case TypeSSHFP:
|
case TypeSSHFP:
|
||||||
r, e = setSSHFP(h, c)
|
r, e = setSSHFP(h, c)
|
||||||
|
@ -44,11 +44,11 @@ func setRR(h RR_Header, c chan lex) (RR, *ParseError) {
|
||||||
// newline. Thus there is no need to slurp the remainder, because there is none.
|
// newline. Thus there is no need to slurp the remainder, because there is none.
|
||||||
return setDNSKEY(h, c)
|
return setDNSKEY(h, c)
|
||||||
case TypeRRSIG:
|
case TypeRRSIG:
|
||||||
return setRRSIG(h, c)
|
return setRRSIG(h, c, o)
|
||||||
case TypeNSEC:
|
case TypeNSEC:
|
||||||
return setNSEC(h, c)
|
return setNSEC(h, c, o)
|
||||||
case TypeNSEC3:
|
case TypeNSEC3:
|
||||||
return setNSEC3(h, c)
|
return setNSEC3(h, c, o)
|
||||||
case TypeDS:
|
case TypeDS:
|
||||||
return setDS(h, c)
|
return setDS(h, c)
|
||||||
case TypeTXT:
|
case TypeTXT:
|
||||||
|
@ -117,19 +117,22 @@ func setAAAA(h RR_Header, c chan lex) (RR, *ParseError) {
|
||||||
return rr, nil
|
return rr, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func setNS(h RR_Header, c chan lex) (RR, *ParseError) {
|
func setNS(h RR_Header, c chan lex, o string) (RR, *ParseError) {
|
||||||
rr := new(RR_NS)
|
rr := new(RR_NS)
|
||||||
rr.Hdr = h
|
rr.Hdr = h
|
||||||
|
|
||||||
l := <-c
|
l := <-c
|
||||||
rr.Ns = l.token
|
rr.Ns = l.token
|
||||||
if !IsDomainName(l.token) {
|
if ok, _ := IsDomainName(l.token); !ok {
|
||||||
return nil, &ParseError{"bad NS Ns", l}
|
return nil, &ParseError{"bad NS Ns", l}
|
||||||
}
|
}
|
||||||
|
if !Fqdn(rr.Ns) {
|
||||||
|
rr.Ns += o
|
||||||
|
}
|
||||||
return rr, nil
|
return rr, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func setMX(h RR_Header, c chan lex) (RR, *ParseError) {
|
func setMX(h RR_Header, c chan lex, o string) (RR, *ParseError) {
|
||||||
rr := new(RR_MX)
|
rr := new(RR_MX)
|
||||||
rr.Hdr = h
|
rr.Hdr = h
|
||||||
|
|
||||||
|
@ -142,40 +145,52 @@ func setMX(h RR_Header, c chan lex) (RR, *ParseError) {
|
||||||
<-c // _BLANK
|
<-c // _BLANK
|
||||||
l = <-c // _STRING
|
l = <-c // _STRING
|
||||||
rr.Mx = l.token
|
rr.Mx = l.token
|
||||||
if !IsDomainName(l.token) {
|
if ok, _ := IsDomainName(l.token); !ok {
|
||||||
return nil, &ParseError{"bad MX Mx", l}
|
return nil, &ParseError{"bad MX Mx", l}
|
||||||
}
|
}
|
||||||
|
if !Fqdn(rr.Mx) {
|
||||||
|
rr.Mx += o
|
||||||
|
}
|
||||||
return rr, nil
|
return rr, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func setCNAME(h RR_Header, c chan lex) (RR, *ParseError) {
|
func setCNAME(h RR_Header, c chan lex, o string) (RR, *ParseError) {
|
||||||
rr := new(RR_CNAME)
|
rr := new(RR_CNAME)
|
||||||
rr.Hdr = h
|
rr.Hdr = h
|
||||||
|
|
||||||
l := <-c
|
l := <-c
|
||||||
rr.Cname = l.token
|
rr.Cname = l.token
|
||||||
if !IsDomainName(l.token) {
|
if ok, _ := IsDomainName(l.token); !ok {
|
||||||
return nil, &ParseError{"bad CNAME", l}
|
return nil, &ParseError{"bad CNAME", l}
|
||||||
}
|
}
|
||||||
|
if !Fqdn(rr.Cname) {
|
||||||
|
rr.Cname += o
|
||||||
|
}
|
||||||
return rr, nil
|
return rr, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func setSOA(h RR_Header, c chan lex) (RR, *ParseError) {
|
func setSOA(h RR_Header, c chan lex, o string) (RR, *ParseError) {
|
||||||
rr := new(RR_SOA)
|
rr := new(RR_SOA)
|
||||||
rr.Hdr = h
|
rr.Hdr = h
|
||||||
|
|
||||||
l := <-c
|
l := <-c
|
||||||
rr.Ns = l.token
|
rr.Ns = l.token
|
||||||
<-c // _BLANK
|
<-c // _BLANK
|
||||||
if !IsDomainName(l.token) {
|
if ok, _ := IsDomainName(l.token); !ok {
|
||||||
return nil, &ParseError{"bad SOA mname", l}
|
return nil, &ParseError{"bad SOA mname", l}
|
||||||
}
|
}
|
||||||
|
if !Fqdn(rr.Ns) {
|
||||||
|
rr.Ns += o
|
||||||
|
}
|
||||||
|
|
||||||
l = <-c
|
l = <-c
|
||||||
rr.Mbox = l.token
|
rr.Mbox = l.token
|
||||||
if !IsDomainName(l.token) {
|
if ok, _ := IsDomainName(l.token); !ok {
|
||||||
return nil, &ParseError{"bad SOA rname", l}
|
return nil, &ParseError{"bad SOA rname", l}
|
||||||
}
|
}
|
||||||
|
if !Fqdn(rr.Mbox) {
|
||||||
|
rr.Mbox += o
|
||||||
|
}
|
||||||
<-c // _BLANK
|
<-c // _BLANK
|
||||||
|
|
||||||
var j int
|
var j int
|
||||||
|
@ -205,7 +220,7 @@ func setSOA(h RR_Header, c chan lex) (RR, *ParseError) {
|
||||||
return rr, nil
|
return rr, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func setRRSIG(h RR_Header, c chan lex) (RR, *ParseError) {
|
func setRRSIG(h RR_Header, c chan lex, o string) (RR, *ParseError) {
|
||||||
rr := new(RR_RRSIG)
|
rr := new(RR_RRSIG)
|
||||||
rr.Hdr = h
|
rr.Hdr = h
|
||||||
l := <-c
|
l := <-c
|
||||||
|
@ -258,11 +273,13 @@ func setRRSIG(h RR_Header, c chan lex) (RR, *ParseError) {
|
||||||
}
|
}
|
||||||
<-c // _BLANK
|
<-c // _BLANK
|
||||||
l = <-c
|
l = <-c
|
||||||
if !IsDomainName(l.token) {
|
rr.SignerName = l.token
|
||||||
|
if ok, _ := IsDomainName(l.token); !ok {
|
||||||
return nil, &ParseError{"bad RRSIG signername", l}
|
return nil, &ParseError{"bad RRSIG signername", l}
|
||||||
} else {
|
|
||||||
rr.SignerName = l.token
|
|
||||||
}
|
}
|
||||||
|
if !Fqdn(rr.SignerName) {
|
||||||
|
rr.SignerName += o
|
||||||
|
}
|
||||||
// Get the remaining data until we see a NEWLINE
|
// Get the remaining data until we see a NEWLINE
|
||||||
l = <-c
|
l = <-c
|
||||||
s := ""
|
s := ""
|
||||||
|
@ -281,16 +298,18 @@ func setRRSIG(h RR_Header, c chan lex) (RR, *ParseError) {
|
||||||
return rr, nil
|
return rr, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func setNSEC(h RR_Header, c chan lex) (RR, *ParseError) {
|
func setNSEC(h RR_Header, c chan lex, o string) (RR, *ParseError) {
|
||||||
rr := new(RR_NSEC)
|
rr := new(RR_NSEC)
|
||||||
rr.Hdr = h
|
rr.Hdr = h
|
||||||
|
|
||||||
l := <-c
|
l := <-c
|
||||||
if !IsDomainName(l.token) {
|
rr.NextDomain = l.token
|
||||||
|
if ok, _ := IsDomainName(l.token); !ok {
|
||||||
return nil, &ParseError{"bad NSEC nextdomain", l}
|
return nil, &ParseError{"bad NSEC nextdomain", l}
|
||||||
} else {
|
|
||||||
rr.NextDomain = l.token
|
|
||||||
}
|
}
|
||||||
|
if !Fqdn(rr.NextDomain) {
|
||||||
|
rr.NextDomain += o
|
||||||
|
}
|
||||||
|
|
||||||
rr.TypeBitMap = make([]uint16, 0)
|
rr.TypeBitMap = make([]uint16, 0)
|
||||||
l = <-c
|
l = <-c
|
||||||
|
@ -312,7 +331,7 @@ func setNSEC(h RR_Header, c chan lex) (RR, *ParseError) {
|
||||||
return rr, nil
|
return rr, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func setNSEC3(h RR_Header, c chan lex) (RR, *ParseError) {
|
func setNSEC3(h RR_Header, c chan lex, o string) (RR, *ParseError) {
|
||||||
rr := new(RR_NSEC3)
|
rr := new(RR_NSEC3)
|
||||||
rr.Hdr = h
|
rr.Hdr = h
|
||||||
|
|
||||||
|
@ -345,6 +364,12 @@ func setNSEC3(h RR_Header, c chan lex) (RR, *ParseError) {
|
||||||
l = <-c
|
l = <-c
|
||||||
rr.HashLength = uint8(len(l.token))
|
rr.HashLength = uint8(len(l.token))
|
||||||
rr.NextDomain = l.token
|
rr.NextDomain = l.token
|
||||||
|
if ok, _ := IsDomainName(l.token); !ok {
|
||||||
|
return nil, &ParseError{"bad NSEC nextdomain", l}
|
||||||
|
}
|
||||||
|
if !Fqdn(rr.NextDomain) {
|
||||||
|
rr.NextDomain += o
|
||||||
|
}
|
||||||
|
|
||||||
rr.TypeBitMap = make([]uint16, 0)
|
rr.TypeBitMap = make([]uint16, 0)
|
||||||
l = <-c
|
l = <-c
|
||||||
|
|
Loading…
Reference in New Issue