diff options
| author | Shulhan <ms@kilabit.info> | 2021-11-14 17:46:02 +0700 |
|---|---|---|
| committer | Shulhan <ms@kilabit.info> | 2021-11-14 17:52:52 +0700 |
| commit | 3f02602db8cfe6fbb09d550ac723fc251eb81f1d (patch) | |
| tree | e0e15a163ee22aa5cce3d9e7e45d2dc5cad4a658 | |
| parent | 207a7fa24fe58619628e98a9298a3f877ed16146 (diff) | |
| download | pakakeh.go-3f02602db8cfe6fbb09d550ac723fc251eb81f1d.tar.xz | |
lib/dns: refactoring, create type RecordType to represent type of RR
Previously, we use uint16 to represent type for ResourceRecord Type or
Question type.
To make the code more strict, where parameter or return value, must be
expected as record type, we add new type to represent the RR type:
RecordType.
This changes also rename any variable name of QType or qtype to RType
or rtype because QType is misleading. The type defined the
ResourceRecord to be queried not only question.
36 files changed, 564 insertions, 509 deletions
diff --git a/lib/dns/answer.go b/lib/dns/answer.go index d37cdc3d..d6f9965c 100644 --- a/lib/dns/answer.go +++ b/lib/dns/answer.go @@ -23,8 +23,8 @@ type Answer struct { // QName contains DNS question name, a copy of msg.Question.Name. QName string - // qtype contains DNS question type, a copy of msg.Question.Type. - QType uint16 + // RType contains record type, a copy of msg.Question.Type. + RType RecordType // qclass contains DNS question class, a copy of msg.Question.Class. QClass uint16 @@ -43,7 +43,7 @@ type Answer struct { func newAnswer(msg *Message, isLocal bool) (an *Answer) { an = &Answer{ QName: msg.Question.Name, - QType: msg.Question.Type, + RType: msg.Question.Type, QClass: msg.Question.Class, msg: msg, } diff --git a/lib/dns/answer_test.go b/lib/dns/answer_test.go index 140bdb33..9d8d3110 100644 --- a/lib/dns/answer_test.go +++ b/lib/dns/answer_test.go @@ -26,7 +26,7 @@ func TestNewAnswer(t *testing.T) { }, Answer: []ResourceRecord{{ Name: "test", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, TTL: 3600, rdlen: 4, @@ -40,7 +40,7 @@ func TestNewAnswer(t *testing.T) { exp *Answer expMsg *Message expQName string - expQType uint16 + expRType RecordType expQClass uint16 isLocal bool }{{ @@ -49,12 +49,12 @@ func TestNewAnswer(t *testing.T) { isLocal: true, exp: &Answer{ QName: "test", - QType: 1, + RType: 1, QClass: 1, msg: msg1, }, expQName: "test", - expQType: 1, + expRType: 1, expQClass: 1, expMsg: msg1, }, { @@ -62,12 +62,12 @@ func TestNewAnswer(t *testing.T) { msg: msg1, exp: &Answer{ QName: "test", - QType: 1, + RType: 1, QClass: 1, msg: msg1, }, expQName: "test", - expQType: 1, + expRType: 1, expQClass: 1, expMsg: msg1, }} @@ -91,7 +91,7 @@ func TestNewAnswer(t *testing.T) { } test.Assert(t, "newAnswer.QName", c.expQName, got.QName) - test.Assert(t, "newAnswer.QType", c.expQType, got.QType) + test.Assert(t, "newAnswer.RType", c.expRType, got.RType) test.Assert(t, "newAnswer.QClass", c.expQClass, got.QClass) test.Assert(t, "newAnswer.msg", c.expMsg, got.msg) } @@ -127,12 +127,12 @@ func TestAnswerGet(t *testing.T) { }, Question: SectionQuestion{ Name: "kilabit.info", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "kilabit.info", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, TTL: 3600, rdlen: 4, diff --git a/lib/dns/answers.go b/lib/dns/answers.go index d2ef3d71..77385304 100644 --- a/lib/dns/answers.go +++ b/lib/dns/answers.go @@ -30,9 +30,9 @@ func newAnswers(an *Answer) (ans *answers) { // If found, it will return its element and index in slice; otherwise it will // return nil on answer. // -func (ans *answers) get(qtype, qclass uint16) (an *Answer, x int) { +func (ans *answers) get(rtype RecordType, qclass uint16) (an *Answer, x int) { for x = 0; x < len(ans.v); x++ { - if ans.v[x].QType != qtype { + if ans.v[x].RType != rtype { continue } if ans.v[x].QClass != qclass { @@ -48,8 +48,8 @@ func (ans *answers) get(qtype, qclass uint16) (an *Answer, x int) { // // remove the answer from list. // -func (ans *answers) remove(qtype, qclass uint16) { - an, x := ans.get(qtype, qclass) +func (ans *answers) remove(rtype RecordType, qclass uint16) { + an, x := ans.get(rtype, qclass) if an != nil { ans.v[x] = ans.v[len(ans.v)-1] ans.v[len(ans.v)-1] = nil @@ -66,7 +66,7 @@ func (ans *answers) upsert(nu *Answer) (an *Answer) { if nu == nil || nu.msg == nil { return } - an, _ = ans.get(nu.QType, nu.QClass) + an, _ = ans.get(nu.RType, nu.QClass) if an != nil { an.update(nu) } else { diff --git a/lib/dns/answers_test.go b/lib/dns/answers_test.go index c01ce4e6..41cc7300 100644 --- a/lib/dns/answers_test.go +++ b/lib/dns/answers_test.go @@ -54,7 +54,7 @@ func TestAnswersGet(t *testing.T) { }, Answer: []ResourceRecord{{ Name: "test", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, }}, } @@ -63,7 +63,7 @@ func TestAnswersGet(t *testing.T) { cases := []struct { desc string - QType uint16 + RType RecordType QClass uint16 exp *Answer expIndex int @@ -76,11 +76,11 @@ func TestAnswersGet(t *testing.T) { expIndex: 1, }, { desc: "With query class not found", - QType: 1, + RType: 1, expIndex: 1, }, { desc: "With valid query type and class", - QType: 1, + RType: 1, QClass: 1, exp: an, expIndex: 0, @@ -89,7 +89,7 @@ func TestAnswersGet(t *testing.T) { for _, c := range cases { t.Log(c.desc) - got, x := ans.get(c.QType, c.QClass) + got, x := ans.get(c.RType, c.QClass) test.Assert(t, "answers.get", c.exp, got) test.Assert(t, "answers.get index", c.expIndex, x) @@ -105,7 +105,7 @@ func TestAnswersRemove(t *testing.T) { }, Answer: []ResourceRecord{{ Name: "test", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, }}, } @@ -114,10 +114,11 @@ func TestAnswersRemove(t *testing.T) { ans := newAnswers(an) cases := []struct { - desc string - QType, QClass uint16 - exp *answers - expLen int + desc string + RType RecordType + QClass uint16 + exp *answers + expLen int }{{ desc: "With query type and class not found", exp: ans, @@ -129,12 +130,12 @@ func TestAnswersRemove(t *testing.T) { expLen: 1, }, { desc: "With query class not found", - QType: 1, + RType: 1, exp: ans, expLen: 1, }, { desc: "With valid query type and class", - QType: 1, + RType: 1, QClass: 1, exp: &answers{ v: make([]*Answer, 0, 1), @@ -145,7 +146,7 @@ func TestAnswersRemove(t *testing.T) { for _, c := range cases { t.Log(c.desc) - ans.remove(c.QType, c.QClass) + ans.remove(c.RType, c.QClass) test.Assert(t, "len(answers.v)", c.expLen, len(ans.v)) test.Assert(t, "cap(answers.v)", 1, cap(ans.v)) @@ -155,7 +156,7 @@ func TestAnswersRemove(t *testing.T) { func TestAnswersUpdate(t *testing.T) { an1 := &Answer{ - QType: 1, + RType: 1, QClass: 1, msg: &Message{ Header: SectionHeader{ @@ -164,17 +165,17 @@ func TestAnswersUpdate(t *testing.T) { }, } an2 := &Answer{ - QType: 2, + RType: 2, QClass: 1, msg: &Message{}, } an3 := &Answer{ - QType: 1, + RType: 1, QClass: 2, msg: &Message{}, } an4 := &Answer{ - QType: 1, + RType: 1, QClass: 1, msg: &Message{ Header: SectionHeader{ @@ -217,7 +218,7 @@ func TestAnswersUpdate(t *testing.T) { exp: &answers{ v: []*Answer{ { - QType: 1, + RType: 1, QClass: 1, msg: an4.msg, }, diff --git a/lib/dns/caches.go b/lib/dns/caches.go index 94d69592..77371dfd 100644 --- a/lib/dns/caches.go +++ b/lib/dns/caches.go @@ -98,14 +98,14 @@ func newCaches(pruneDelay, pruneThreshold time.Duration) (ca *caches) { // If answer exist on cache, their accessed time will be updated to current // time and moved to back of LRU to prevent being pruned later. // -func (c *caches) get(qname string, qtype, qclass uint16) (ans *answers, an *Answer) { +func (c *caches) get(qname string, rtype RecordType, qclass uint16) (ans *answers, an *Answer) { c.Lock() var found bool ans, found = c.v[qname] if found { - an, _ = ans.get(qtype, qclass) + an, _ = ans.get(rtype, qclass) if an != nil { // Move the answer to the back of LRU if its not // local and update its accessed time. @@ -155,7 +155,7 @@ func (c *caches) prune() (n int) { _ = c.lru.Remove(e) answers, found := c.v[an.QName] if found { - answers.remove(an.QType, an.QClass) + answers.remove(an.RType, an.QClass) if len(answers.v) == 0 { delete(c.v, an.QName) } @@ -256,7 +256,7 @@ func (c *caches) removeLocalRR(rr *ResourceRecord) (err error) { return nil } for _, an := range ans.v { - if an.QType != rr.Type { + if an.RType != rr.Type { continue } if an.QClass != rr.Class { diff --git a/lib/dns/caches_test.go b/lib/dns/caches_test.go index f9f92d92..80c286dc 100644 --- a/lib/dns/caches_test.go +++ b/lib/dns/caches_test.go @@ -45,7 +45,7 @@ func TestCachesGet(t *testing.T) { an1 := &Answer{ ReceivedAt: 1, QName: "test", - QType: 1, + RType: 1, QClass: 1, msg: &Message{ Header: SectionHeader{ @@ -56,7 +56,7 @@ func TestCachesGet(t *testing.T) { an2 := &Answer{ ReceivedAt: 2, QName: "test", - QType: 2, + RType: 2, QClass: 1, msg: &Message{ Header: SectionHeader{ @@ -67,7 +67,7 @@ func TestCachesGet(t *testing.T) { an3 := &Answer{ ReceivedAt: 3, QName: "test", - QType: 3, + RType: 3, QClass: 1, msg: &Message{ Header: SectionHeader{ @@ -85,7 +85,7 @@ func TestCachesGet(t *testing.T) { cases := []struct { desc string QName string - QType uint16 + RType RecordType QClass uint16 exp *Answer expList []*Answer @@ -97,7 +97,7 @@ func TestCachesGet(t *testing.T) { }, { desc: "With query found", QName: "test", - QType: 1, + RType: 1, QClass: 1, exp: an1, expList: []*Answer{ @@ -108,7 +108,7 @@ func TestCachesGet(t *testing.T) { for _, c := range cases { t.Log(c.desc) - _, got := ca.get(c.QName, c.QType, c.QClass) + _, got := ca.get(c.QName, c.RType, c.QClass) gotList := ca.list() test.Assert(t, "caches.get", c.exp, got) @@ -123,7 +123,7 @@ func TestCachesPrune(t *testing.T) { ReceivedAt: 1, AccessedAt: 1, QName: "test", - QType: 1, + RType: 1, QClass: 1, msg: &Message{ Header: SectionHeader{ @@ -135,7 +135,7 @@ func TestCachesPrune(t *testing.T) { ReceivedAt: 2, AccessedAt: 2, QName: "test", - QType: 2, + RType: 2, QClass: 1, msg: &Message{ Header: SectionHeader{ @@ -147,7 +147,7 @@ func TestCachesPrune(t *testing.T) { ReceivedAt: at, AccessedAt: at, QName: "test", - QType: 3, + RType: 3, QClass: 1, msg: &Message{ Header: SectionHeader{ @@ -192,7 +192,7 @@ func TestCachesUpsert(t *testing.T) { ReceivedAt: 1, AccessedAt: 1, QName: "test", - QType: 1, + RType: 1, QClass: 1, msg: &Message{ Header: SectionHeader{ @@ -204,7 +204,7 @@ func TestCachesUpsert(t *testing.T) { ReceivedAt: 3, AccessedAt: 3, QName: "test", - QType: 1, + RType: 1, QClass: 1, msg: &Message{ Header: SectionHeader{ @@ -216,7 +216,7 @@ func TestCachesUpsert(t *testing.T) { ReceivedAt: 2, AccessedAt: 2, QName: "test", - QType: 2, + RType: 2, QClass: 1, msg: &Message{ Header: SectionHeader{ @@ -228,7 +228,7 @@ func TestCachesUpsert(t *testing.T) { ReceivedAt: 4, AccessedAt: 4, QName: "test", - QType: 2, + RType: 2, QClass: 1, msg: &Message{ Header: SectionHeader{ diff --git a/lib/dns/client.go b/lib/dns/client.go index b16e8fc1..65b52bbb 100644 --- a/lib/dns/client.go +++ b/lib/dns/client.go @@ -13,7 +13,7 @@ import ( // type Client interface { Close() error - Lookup(allowRecursion bool, qtype, qclass uint16, qname string) (*Message, error) + Lookup(allowRecursion bool, rtype RecordType, qclass uint16, qname string) (*Message, error) Query(req *Message) (*Message, error) RemoteAddr() string SetRemoteAddr(addr string) error diff --git a/lib/dns/dns.go b/lib/dns/dns.go index 11eb479b..0faaacd7 100644 --- a/lib/dns/dns.go +++ b/lib/dns/dns.go @@ -17,7 +17,6 @@ package dns import ( "errors" - "net" "time" ) @@ -99,82 +98,6 @@ const ( OpCodeStatus // a server status request (STATUS) ) -// List of code for known DNS query types. -const ( - QueryTypeZERO uint16 = iota // Empty query type. - QueryTypeA // 1 - A host address - QueryTypeNS // 2 - An authoritative name server - QueryTypeMD // 3 - A mail destination (Obsolete - use MX) - QueryTypeMF // 4 - A mail forwarder (Obsolete - use MX) - QueryTypeCNAME // 5 - The canonical name for an alias - QueryTypeSOA // 6 - Marks the start of a zone of authority - QueryTypeMB // 7 - A mailbox domain name (EXPERIMENTAL) - QueryTypeMG // 8 - A mail group member (EXPERIMENTAL) - QueryTypeMR // 9 - A mail rename domain name (EXPERIMENTAL) - QueryTypeNULL // 10 - A null RR (EXPERIMENTAL) - QueryTypeWKS // 11 - A well known service description - QueryTypePTR // 12 - A domain name pointer - QueryTypeHINFO // 13 - Host information - QueryTypeMINFO // 14 - Mailbox or mail list information - QueryTypeMX // 15 - Mail exchange - QueryTypeTXT // 16 - Text strings - QueryTypeAAAA uint16 = 28 // IPv6 address - QueryTypeSRV uint16 = 33 // A SRV RR for locating service. - QueryTypeOPT uint16 = 41 // An OPT pseudo-RR (sometimes called a meta-RR) - QueryTypeAXFR uint16 = 252 // A request for a transfer of an entire zone - QueryTypeMAILB uint16 = 253 // A request for mailbox-related records (MB, MG or MR) - QueryTypeMAILA uint16 = 254 // A request for mail agent RRs (Obsolete - see MX) - QueryTypeALL uint16 = 255 // A request for all records -) - -// -// QueryTypes contains a mapping between string representation of DNS query -// type with their decimal value. -// -var QueryTypes = map[string]uint16{ - "A": QueryTypeA, - "NS": QueryTypeNS, - "CNAME": QueryTypeCNAME, - "SOA": QueryTypeSOA, - "MB": QueryTypeMB, - "MG": QueryTypeMG, - "MR": QueryTypeMR, - "NULL": QueryTypeNULL, - "WKS": QueryTypeWKS, - "PTR": QueryTypePTR, - "HINFO": QueryTypeHINFO, - "MINFO": QueryTypeMINFO, - "MX": QueryTypeMX, - "TXT": QueryTypeTXT, - "AAAA": QueryTypeAAAA, - "SRV": QueryTypeSRV, - "OPT": QueryTypeOPT, -} - -// -// QueryTypeNames contains mapping between query type and and their string -// representation. -// -var QueryTypeNames = map[uint16]string{ - QueryTypeA: "A", - QueryTypeNS: "NS", - QueryTypeCNAME: "CNAME", - QueryTypeSOA: "SOA", - QueryTypeMB: "MB", - QueryTypeMG: "MG", - QueryTypeMR: "MR", - QueryTypeNULL: "NULL", - QueryTypeWKS: "WKS", - QueryTypePTR: "PTR", - QueryTypeHINFO: "HINFO", - QueryTypeMINFO: "MINFO", - QueryTypeMX: "MX", - QueryTypeTXT: "TXT", - QueryTypeAAAA: "AAAA", - QueryTypeSRV: "SRV", - QueryTypeOPT: "OPT", -} - // List of code known DNS query class. const ( QueryClassZERO uint16 = iota // Empty query class. @@ -248,24 +171,3 @@ var rcodeNames = map[ResponseCode]string{ RCodeNotImplemented: "ERR_NOT_IMPLEMENTED", RCodeRefused: "ERR_REFUSED", } - -// -// GetQueryTypeFromAddress return QueryTypeA or QueryTypeAAAA if addr is valid -// IPv4 or IPv6 address, otherwise it will return 0. -// -func GetQueryTypeFromAddress(addr []byte) (qtype uint16) { - ip := net.ParseIP(string(addr)) - if ip == nil { - return 0 - } - - qtype = QueryTypeA - for x := 0; x < len(addr); x++ { - if addr[x] == ':' { - qtype = QueryTypeAAAA - break - } - } - - return qtype -} diff --git a/lib/dns/dns_test.go b/lib/dns/dns_test.go index 38ae3f37..94956095 100644 --- a/lib/dns/dns_test.go +++ b/lib/dns/dns_test.go @@ -9,8 +9,6 @@ import ( "os" "testing" "time" - - "github.com/shuLhan/share/lib/test" ) const ( @@ -61,10 +59,3 @@ func TestMain(m *testing.M) { os.Exit(m.Run()) } - -func TestQueryType(t *testing.T) { - test.Assert(t, "QueryTypeA", QueryTypeA, uint16(1)) - test.Assert(t, "QueryTypeTXT", QueryTypeTXT, uint16(16)) - test.Assert(t, "QueryTypeAXFR", QueryTypeAXFR, uint16(252)) - test.Assert(t, "QueryTypeALL", QueryTypeALL, uint16(255)) -} diff --git a/lib/dns/doh_client.go b/lib/dns/doh_client.go index a3f0f472..97271ec9 100644 --- a/lib/dns/doh_client.go +++ b/lib/dns/doh_client.go @@ -95,15 +95,15 @@ func (cl *DoHClient) Close() error { // synchronous mode. // func (cl *DoHClient) Lookup( - allowRecursion bool, qtype, qclass uint16, qname string, + allowRecursion bool, rtype RecordType, qclass uint16, qname string, ) ( *Message, error, ) { if len(qname) == 0 { return nil, nil } - if qtype == 0 { - qtype = QueryTypeA + if rtype == 0 { + rtype = RecordTypeA } if qclass == 0 { qclass = QueryClassIN @@ -112,7 +112,7 @@ func (cl *DoHClient) Lookup( msg := NewMessage() msg.Header.IsRD = allowRecursion - msg.Question.Type = qtype + msg.Question.Type = rtype msg.Question.Class = qclass msg.Question.Name = qname diff --git a/lib/dns/doh_client_test.go b/lib/dns/doh_client_test.go index af69ec0e..39fe7aee 100644 --- a/lib/dns/doh_client_test.go +++ b/lib/dns/doh_client_test.go @@ -21,13 +21,13 @@ func TestDoHClient_Lookup(t *testing.T) { cases := []struct { desc string allowRecursion bool - qtype uint16 + rtype RecordType qclass uint16 qname string exp *Message }{{ desc: "QType:A QClass:IN QName:kilabit.info", - qtype: QueryTypeA, + rtype: RecordTypeA, qclass: QueryClassIN, qname: "kilabit.info", exp: &Message{ @@ -39,12 +39,12 @@ func TestDoHClient_Lookup(t *testing.T) { }, Question: SectionQuestion{ Name: "kilabit.info", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "kilabit.info", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, TTL: 3600, rdlen: 4, @@ -55,7 +55,7 @@ func TestDoHClient_Lookup(t *testing.T) { }, }, { desc: "QType:SOA QClass:IN QName:kilabit.info", - qtype: QueryTypeSOA, + rtype: RecordTypeSOA, qclass: QueryClassIN, qname: "kilabit.info", exp: &Message{ @@ -67,12 +67,12 @@ func TestDoHClient_Lookup(t *testing.T) { }, Question: SectionQuestion{ Name: "kilabit.info", - Type: QueryTypeSOA, + Type: RecordTypeSOA, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "kilabit.info", - Type: QueryTypeSOA, + Type: RecordTypeSOA, Class: QueryClassIN, TTL: 3600, Value: &RDataSOA{ @@ -90,7 +90,7 @@ func TestDoHClient_Lookup(t *testing.T) { }, }, { desc: "QType:TXT QClass:IN QName:kilabit.info", - qtype: QueryTypeTXT, + rtype: RecordTypeTXT, qclass: QueryClassIN, qname: "kilabit.info", exp: &Message{ @@ -102,12 +102,12 @@ func TestDoHClient_Lookup(t *testing.T) { }, Question: SectionQuestion{ Name: "kilabit.info", - Type: QueryTypeTXT, + Type: RecordTypeTXT, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "kilabit.info", - Type: QueryTypeTXT, + Type: RecordTypeTXT, Class: QueryClassIN, TTL: 3600, Value: "This is a test server", @@ -117,7 +117,7 @@ func TestDoHClient_Lookup(t *testing.T) { }, }, { desc: "QType:AAAA QClass:IN QName:kilabit.info", - qtype: QueryTypeAAAA, + rtype: RecordTypeAAAA, qclass: QueryClassIN, qname: "kilabit.info", exp: &Message{ @@ -129,7 +129,7 @@ func TestDoHClient_Lookup(t *testing.T) { }, Question: SectionQuestion{ Name: "kilabit.info", - Type: QueryTypeAAAA, + Type: RecordTypeAAAA, Class: QueryClassIN, }, Answer: []ResourceRecord{}, @@ -141,7 +141,7 @@ func TestDoHClient_Lookup(t *testing.T) { for _, c := range cases { t.Log(c.desc) - got, err := cl.Lookup(c.allowRecursion, c.qtype, c.qclass, c.qname) + got, err := cl.Lookup(c.allowRecursion, c.rtype, c.qclass, c.qname) if err != nil { t.Fatal(err) } @@ -166,13 +166,13 @@ func TestDoHClient_Post(t *testing.T) { cases := []struct { desc string allowRecursion bool - qtype uint16 + rtype RecordType qclass uint16 qname string exp *Message }{{ desc: "QType:A QClass:IN QName:kilabit.info", - qtype: QueryTypeA, + rtype: RecordTypeA, qclass: QueryClassIN, qname: "kilabit.info", exp: &Message{ @@ -184,12 +184,12 @@ func TestDoHClient_Post(t *testing.T) { }, Question: SectionQuestion{ Name: "kilabit.info", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "kilabit.info", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, TTL: 3600, rdlen: 4, @@ -200,7 +200,7 @@ func TestDoHClient_Post(t *testing.T) { }, }, { desc: "QType:SOA QClass:IN QName:kilabit.info", - qtype: QueryTypeSOA, + rtype: RecordTypeSOA, qclass: QueryClassIN, qname: "kilabit.info", exp: &Message{ @@ -212,12 +212,12 @@ func TestDoHClient_Post(t *testing.T) { }, Question: SectionQuestion{ Name: "kilabit.info", - Type: QueryTypeSOA, + Type: RecordTypeSOA, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "kilabit.info", - Type: QueryTypeSOA, + Type: RecordTypeSOA, Class: QueryClassIN, TTL: 3600, Value: &RDataSOA{ @@ -235,7 +235,7 @@ func TestDoHClient_Post(t *testing.T) { }, }, { desc: "QType:TXT QClass:IN QName:kilabit.info", - qtype: QueryTypeTXT, + rtype: RecordTypeTXT, qclass: QueryClassIN, qname: "kilabit.info", exp: &Message{ @@ -247,12 +247,12 @@ func TestDoHClient_Post(t *testing.T) { }, Question: SectionQuestion{ Name: "kilabit.info", - Type: QueryTypeTXT, + Type: RecordTypeTXT, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "kilabit.info", - Type: QueryTypeTXT, + Type: RecordTypeTXT, Class: QueryClassIN, TTL: 3600, Value: "This is a test server", @@ -262,7 +262,7 @@ func TestDoHClient_Post(t *testing.T) { }, }, { desc: "QType:AAAA QClass:IN QName:kilabit.info", - qtype: QueryTypeAAAA, + rtype: RecordTypeAAAA, qclass: QueryClassIN, qname: "kilabit.info", exp: &Message{ @@ -274,7 +274,7 @@ func TestDoHClient_Post(t *testing.T) { }, Question: SectionQuestion{ Name: "kilabit.info", - Type: QueryTypeAAAA, + Type: RecordTypeAAAA, Class: QueryClassIN, }, Answer: []ResourceRecord{}, @@ -289,7 +289,7 @@ func TestDoHClient_Post(t *testing.T) { msg := NewMessage() msg.Header.IsRD = c.allowRecursion - msg.Question.Type = c.qtype + msg.Question.Type = c.rtype msg.Question.Class = c.qclass msg.Question.Name = c.qname @@ -322,20 +322,20 @@ func TestDoHClient_Get(t *testing.T) { cases := []struct { desc string - qtype uint16 + rtype RecordType qclass uint16 qname string exp *Message expErr string }{{ desc: "QType:A QClass:IN QName:kilabit.info", - qtype: QueryTypeA, + rtype: RecordTypeA, qclass: QueryClassIN, qname: "kilabit.info", expErr: "404 page not found\n", }, { desc: "QType:A QClass:IN QName:kilabit.info", - qtype: QueryTypeA, + rtype: RecordTypeA, qclass: QueryClassIN, qname: "kilabit.info", expErr: "404 page not found\n", @@ -346,7 +346,7 @@ func TestDoHClient_Get(t *testing.T) { msg := NewMessage() - msg.Question.Type = c.qtype + msg.Question.Type = c.rtype msg.Question.Class = c.qclass msg.Question.Name = c.qname diff --git a/lib/dns/dot_client.go b/lib/dns/dot_client.go index 3d43d277..1d6a07bd 100644 --- a/lib/dns/dot_client.go +++ b/lib/dns/dot_client.go @@ -66,15 +66,15 @@ func (cl *DoTClient) Close() error { // Lookup specific type, class, and name in synchronous mode. // func (cl *DoTClient) Lookup( - allowRecursion bool, qtype, qclass uint16, qname string, + allowRecursion bool, rtype RecordType, qclass uint16, qname string, ) ( res *Message, err error, ) { if len(qname) == 0 { return nil, nil } - if qtype == 0 { - qtype = QueryTypeA + if rtype == 0 { + rtype = RecordTypeA } if qclass == 0 { qclass = QueryClassIN @@ -85,7 +85,7 @@ func (cl *DoTClient) Lookup( msg.Header.ID = getNextID() msg.Header.IsRD = allowRecursion msg.Header.QDCount = 1 - msg.Question.Type = qtype + msg.Question.Type = rtype msg.Question.Class = qclass msg.Question.Name = qname diff --git a/lib/dns/dot_client_test.go b/lib/dns/dot_client_test.go index d6f62598..e9075202 100644 --- a/lib/dns/dot_client_test.go +++ b/lib/dns/dot_client_test.go @@ -19,13 +19,13 @@ func TestDoTClient_Lookup(t *testing.T) { cases := []struct { desc string allowRecursion bool - qtype uint16 + rtype RecordType qclass uint16 qname string exp *Message }{{ desc: "QType:A QClass:IN QName:kilabit.info", - qtype: QueryTypeA, + rtype: RecordTypeA, qclass: QueryClassIN, qname: "kilabit.info", exp: &Message{ @@ -37,12 +37,12 @@ func TestDoTClient_Lookup(t *testing.T) { }, Question: SectionQuestion{ Name: "kilabit.info", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "kilabit.info", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, TTL: 3600, rdlen: 4, @@ -53,7 +53,7 @@ func TestDoTClient_Lookup(t *testing.T) { }, }, { desc: "QType:SOA QClass:IN QName:kilabit.info", - qtype: QueryTypeSOA, + rtype: RecordTypeSOA, qclass: QueryClassIN, qname: "kilabit.info", exp: &Message{ @@ -65,12 +65,12 @@ func TestDoTClient_Lookup(t *testing.T) { }, Question: SectionQuestion{ Name: "kilabit.info", - Type: QueryTypeSOA, + Type: RecordTypeSOA, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "kilabit.info", - Type: QueryTypeSOA, + Type: RecordTypeSOA, Class: QueryClassIN, TTL: 3600, Value: &RDataSOA{ @@ -88,7 +88,7 @@ func TestDoTClient_Lookup(t *testing.T) { }, }, { desc: "QType:TXT QClass:IN QName:kilabit.info", - qtype: QueryTypeTXT, + rtype: RecordTypeTXT, qclass: QueryClassIN, qname: "kilabit.info", exp: &Message{ @@ -100,12 +100,12 @@ func TestDoTClient_Lookup(t *testing.T) { }, Question: SectionQuestion{ Name: "kilabit.info", - Type: QueryTypeTXT, + Type: RecordTypeTXT, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "kilabit.info", - Type: QueryTypeTXT, + Type: RecordTypeTXT, Class: QueryClassIN, TTL: 3600, Value: "This is a test server", @@ -118,7 +118,7 @@ func TestDoTClient_Lookup(t *testing.T) { for _, c := range cases { t.Log(c.desc) - got, err := cl.Lookup(c.allowRecursion, c.qtype, c.qclass, c.qname) + got, err := cl.Lookup(c.allowRecursion, c.rtype, c.qclass, c.qname) if err != nil { t.Fatal(err) } diff --git a/lib/dns/funcs.go b/lib/dns/funcs.go index 61d7ad42..587c4196 100644 --- a/lib/dns/funcs.go +++ b/lib/dns/funcs.go @@ -70,12 +70,12 @@ func LookupPTR(client Client, ip net.IP) (answer string, err error) { revIP = append(revIP, []byte(".ip6.arpa")...) } - msg, err := client.Lookup(true, QueryTypePTR, QueryClassIN, string(revIP)) + msg, err := client.Lookup(true, RecordTypePTR, QueryClassIN, string(revIP)) if err != nil { return "", err } - rranswers := msg.FilterAnswers(QueryTypePTR) + rranswers := msg.FilterAnswers(RecordTypePTR) if len(rranswers) == 0 { return "", nil } diff --git a/lib/dns/hosts_file.go b/lib/dns/hosts_file.go index 7a92b9d0..aeab543e 100644 --- a/lib/dns/hosts_file.go +++ b/lib/dns/hosts_file.go @@ -187,13 +187,13 @@ func parse(reader *libio.Reader) (listRR []*ResourceRecord) { } hname, isTerm, c := reader.ReadUntil(seps, terms) if len(hname) > 0 { - qtype := GetQueryTypeFromAddress(addr) - if qtype == 0 { + rtype := RecordTypeFromAddress(addr) + if rtype == 0 { continue } rr := &ResourceRecord{ Name: string(bytes.ToLower(hname)), - Type: qtype, + Type: rtype, Class: QueryClassIN, TTL: defaultTTL, Value: string(addr), diff --git a/lib/dns/message.go b/lib/dns/message.go index 46130051..d1578b1f 100644 --- a/lib/dns/message.go +++ b/lib/dns/message.go @@ -80,7 +80,7 @@ func NewMessage() *Message { QDCount: 1, }, Question: SectionQuestion{ - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, }, dnameOff: make(map[string]uint16), @@ -104,8 +104,8 @@ func NewMessageAddress(hname []byte, addresses [][]byte) (msg *Message) { } addr := addresses[0] - qtype := GetQueryTypeFromAddress(addr) - if qtype == 0 { + rtype := RecordTypeFromAddress(addr) + if rtype == 0 { return nil } @@ -113,7 +113,7 @@ func NewMessageAddress(hname []byte, addresses [][]byte) (msg *Message) { rr := ResourceRecord{ Name: string(hname), - Type: qtype, + Type: rtype, Class: QueryClassIN, TTL: defaultTTL, Value: string(addr), @@ -127,23 +127,23 @@ func NewMessageAddress(hname []byte, addresses [][]byte) (msg *Message) { }, Question: SectionQuestion{ Name: string(hname), - Type: qtype, + Type: rtype, Class: QueryClassIN, }, Answer: []ResourceRecord{rr}, } for _, addr := range addresses[1:] { - qtype = GetQueryTypeFromAddress(addr) - if qtype == 0 { + rtype = RecordTypeFromAddress(addr) + if rtype == 0 { continue } - if qtype != msg.Question.Type { + if rtype != msg.Question.Type { continue } msg.Answer = append(msg.Answer, ResourceRecord{ Name: string(hname), - Type: qtype, + Type: rtype, Class: QueryClassIN, TTL: defaultTTL, Value: string(addr), @@ -188,7 +188,7 @@ func NewMessageFromRR(rr *ResourceRecord) (msg *Message, err error) { // func (msg *Message) AddAnswer(rr *ResourceRecord) (err error) { switch rr.Type { - case QueryTypeSOA, QueryTypePTR: + case RecordTypeSOA, RecordTypePTR: if len(msg.Answer) > 0 { msg.Answer[0] = *rr } else { @@ -208,7 +208,7 @@ func (msg *Message) AddAnswer(rr *ResourceRecord) (err error) { // FilterAnswers return resource record in Answer that match only with // specific query type. // -func (msg *Message) FilterAnswers(t uint16) (answers []ResourceRecord) { +func (msg *Message) FilterAnswers(t RecordType) (answers []ResourceRecord) { for _, rr := range msg.Answer { if rr.Type == t { answers = append(answers, rr) @@ -332,7 +332,7 @@ func (msg *Message) packDomainName(dname []byte, doCompress bool) (n int) { func (msg *Message) packQuestion() { msg.packDomainName([]byte(msg.Question.Name), false) - msg.packet = libbytes.AppendUint16(msg.packet, msg.Question.Type) + msg.packet = libbytes.AppendUint16(msg.packet, uint16(msg.Question.Type)) msg.packet = libbytes.AppendUint16(msg.packet, msg.Question.Class) msg.off += 4 } @@ -342,7 +342,7 @@ func (msg *Message) packRR(rr *ResourceRecord) { rrOPT *RDataOPT ) - if rr.Type == QueryTypeOPT { + if rr.Type == RecordTypeOPT { // MUST be 0 (root domain). msg.packet = append(msg.packet, 0) rrOPT, _ = rr.Value.(*RDataOPT) @@ -350,11 +350,11 @@ func (msg *Message) packRR(rr *ResourceRecord) { msg.packDomainName([]byte(rr.Name), true) } - msg.packet = libbytes.AppendUint16(msg.packet, rr.Type) + msg.packet = libbytes.AppendUint16(msg.packet, uint16(rr.Type)) msg.packet = libbytes.AppendUint16(msg.packet, rr.Class) msg.off += 4 - if rr.Type == QueryTypeOPT { + if rr.Type == RecordTypeOPT { rr.TTL = 0 // Pack extended code and version to TTL @@ -375,43 +375,43 @@ func (msg *Message) packRR(rr *ResourceRecord) { func (msg *Message) packRData(rr *ResourceRecord) { switch rr.Type { - case QueryTypeA: + case RecordTypeA: msg.packA(rr) - case QueryTypeNS: + case RecordTypeNS: msg.packTextAsDomain(rr) - case QueryTypeMD: + case RecordTypeMD: // obsolete - case QueryTypeMF: + case RecordTypeMF: // obsolete - case QueryTypeCNAME: + case RecordTypeCNAME: msg.packTextAsDomain(rr) - case QueryTypeSOA: + case RecordTypeSOA: msg.packSOA(rr) - case QueryTypeMB: + case RecordTypeMB: msg.packTextAsDomain(rr) - case QueryTypeMG: + case RecordTypeMG: msg.packTextAsDomain(rr) - case QueryTypeMR: + case RecordTypeMR: msg.packTextAsDomain(rr) - case QueryTypeNULL: + case RecordTypeNULL: msg.packTextAsDomain(rr) - case QueryTypeWKS: + case RecordTypeWKS: msg.packWKS(rr) - case QueryTypePTR: + case RecordTypePTR: msg.packTextAsDomain(rr) - case QueryTypeHINFO: + case RecordTypeHINFO: msg.packHINFO(rr) - case QueryTypeMINFO: + case RecordTypeMINFO: msg.packMINFO(rr) - case QueryTypeMX: + case RecordTypeMX: msg.packMX(rr) - case QueryTypeTXT: + case RecordTypeTXT: msg.packTXT(rr) - case QueryTypeSRV: + case RecordTypeSRV: msg.packSRV(rr) - case QueryTypeAAAA: + case RecordTypeAAAA: msg.packAAAA(rr) - case QueryTypeOPT: + case RecordTypeOPT: msg.packOPT(rr) } } @@ -822,7 +822,7 @@ func (msg *Message) SubTTL(n uint32) { msg.Authority[x].TTL) } for x := 0; x < len(msg.Additional); x++ { - if msg.Additional[x].Type == QueryTypeOPT { + if msg.Additional[x].Type == RecordTypeOPT { continue } if msg.Additional[x].TTL < n { diff --git a/lib/dns/message_test.go b/lib/dns/message_test.go index 67402b4c..c33e4b64 100644 --- a/lib/dns/message_test.go +++ b/lib/dns/message_test.go @@ -85,7 +85,7 @@ func TestMessagePackQuestion(t *testing.T) { desc: "Empty name", msg: &Message{ Question: SectionQuestion{ - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, }, dnameOff: make(map[string]uint16), @@ -98,7 +98,7 @@ func TestMessagePackQuestion(t *testing.T) { msg: &Message{ Question: SectionQuestion{ Name: "kilaBit", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, }, dnameOff: make(map[string]uint16), @@ -112,7 +112,7 @@ func TestMessagePackQuestion(t *testing.T) { msg: &Message{ Question: SectionQuestion{ Name: "kilabit.info", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, }, dnameOff: make(map[string]uint16), @@ -128,7 +128,7 @@ func TestMessagePackQuestion(t *testing.T) { msg: &Message{ Question: SectionQuestion{ Name: "MAIL.KILABIT.INFO", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, }, dnameOff: make(map[string]uint16), @@ -166,7 +166,7 @@ func TestMessagePack(t *testing.T) { }, Question: SectionQuestion{ Name: "kilabit.INFO", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, }, dnameOff: make(map[string]uint16), @@ -199,18 +199,18 @@ func TestMessagePack(t *testing.T) { }, Question: SectionQuestion{ Name: "kilabit.info", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "KILABIT.INFO", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, TTL: 0x00000168, Value: "103.200.4.162", }}, Additional: []ResourceRecord{{ - Type: QueryTypeOPT, + Type: RecordTypeOPT, Class: 0x0500, TTL: 0, Value: &RDataOPT{}, @@ -288,30 +288,30 @@ func TestMessagePack(t *testing.T) { }, Question: SectionQuestion{ Name: "kilabit.info", - Type: QueryTypeNS, + Type: RecordTypeNS, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "kilabit.info", - Type: QueryTypeNS, + Type: RecordTypeNS, Class: QueryClassIN, TTL: 0x01336e, Value: "ns2.dewaweb.com", }, { Name: "kilabit.INFO", - Type: QueryTypeNS, + Type: RecordTypeNS, Class: QueryClassIN, TTL: 0x01336e, Value: "NS3.DEWAWEB.COM", }, { Name: "kilabit.info", - Type: QueryTypeNS, + Type: RecordTypeNS, Class: QueryClassIN, TTL: 0x01336e, Value: "ns1.dewaweb.com", }}, Additional: []ResourceRecord{{ - Type: QueryTypeOPT, + Type: RecordTypeOPT, Class: 0x0500, TTL: 0, Value: &RDataOPT{}, @@ -354,18 +354,18 @@ func TestMessagePack(t *testing.T) { }, Question: SectionQuestion{ Name: "mail.kilabit.info", - Type: QueryTypeCNAME, + Type: RecordTypeCNAME, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "mail.kilabit.info", - Type: QueryTypeCNAME, + Type: RecordTypeCNAME, Class: QueryClassIN, TTL: 0x0168, Value: "kilabit.info", }}, Additional: []ResourceRecord{{ - Type: QueryTypeOPT, + Type: RecordTypeOPT, Class: 0x0500, TTL: 0, Value: &RDataOPT{}, @@ -398,12 +398,12 @@ func TestMessagePack(t *testing.T) { }, Question: SectionQuestion{ Name: "kilabit.info", - Type: QueryTypeSOA, + Type: RecordTypeSOA, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "kilabit.info", - Type: QueryTypeSOA, + Type: RecordTypeSOA, Class: QueryClassIN, TTL: 10511, Value: &RDataSOA{ @@ -485,12 +485,12 @@ func TestMessagePack(t *testing.T) { }, Question: SectionQuestion{ Name: "google.com", - Type: QueryTypeMX, + Type: RecordTypeMX, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "google.com", - Type: QueryTypeMX, + Type: RecordTypeMX, Class: QueryClassIN, TTL: 0x000000fc, Value: &RDataMX{ @@ -499,7 +499,7 @@ func TestMessagePack(t *testing.T) { }, }, { Name: "google.com", - Type: QueryTypeMX, + Type: RecordTypeMX, Class: QueryClassIN, TTL: 0x000000fc, Value: &RDataMX{ @@ -508,7 +508,7 @@ func TestMessagePack(t *testing.T) { }, }, { Name: "google.com", - Type: QueryTypeMX, + Type: RecordTypeMX, Class: QueryClassIN, TTL: 0x000000fc, Value: &RDataMX{ @@ -517,7 +517,7 @@ func TestMessagePack(t *testing.T) { }, }, { Name: "google.com", - Type: QueryTypeMX, + Type: RecordTypeMX, Class: QueryClassIN, TTL: 0x000000fc, Value: &RDataMX{ @@ -526,7 +526,7 @@ func TestMessagePack(t *testing.T) { }, }, { Name: "google.com", - Type: QueryTypeMX, + Type: RecordTypeMX, Class: QueryClassIN, TTL: 0x000000fc, Value: &RDataMX{ @@ -535,7 +535,7 @@ func TestMessagePack(t *testing.T) { }, }}, Additional: []ResourceRecord{{ - Type: QueryTypeOPT, + Type: RecordTypeOPT, Class: 0x0500, TTL: 0, Value: &RDataOPT{}, @@ -583,30 +583,30 @@ func TestMessagePack(t *testing.T) { }, Question: SectionQuestion{ Name: "google.com", - Type: QueryTypeTXT, + Type: RecordTypeTXT, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "google.com", - Type: QueryTypeTXT, + Type: RecordTypeTXT, Class: QueryClassIN, TTL: 300, Value: "facebook-domain-verification=22rm551cu4k0ab0bxsw536tlds4h95", }, { Name: "google.com", - Type: QueryTypeTXT, + Type: RecordTypeTXT, Class: QueryClassIN, TTL: 300, Value: "v=spf1 include:_spf.google.com ~all", }, { Name: "google.com", - Type: QueryTypeTXT, + Type: RecordTypeTXT, Class: QueryClassIN, TTL: 300, Value: "docusign=05958488-4752-4ef2-95eb-aa7ba8a3bd0e", }}, Additional: []ResourceRecord{{ - Type: QueryTypeOPT, + Type: RecordTypeOPT, Class: 1280, TTL: 0, Value: &RDataOPT{}, @@ -644,18 +644,18 @@ func TestMessagePack(t *testing.T) { }, Question: SectionQuestion{ Name: "google.com", - Type: QueryTypeAAAA, + Type: RecordTypeAAAA, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "google.com", - Type: QueryTypeAAAA, + Type: RecordTypeAAAA, TTL: 0x53, Class: QueryClassIN, Value: "2404:6800:4003:c00::8b", }}, Additional: []ResourceRecord{{ - Type: QueryTypeOPT, + Type: RecordTypeOPT, Class: 1280, TTL: 0, Value: &RDataOPT{}, @@ -742,12 +742,12 @@ func TestMessagePack(t *testing.T) { }, Question: SectionQuestion{ Name: "_xmpp-server._tcp.google.com", - Type: QueryTypeSRV, + Type: RecordTypeSRV, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "_xmpp-server._tcp.google.com", - Type: QueryTypeSRV, + Type: RecordTypeSRV, Class: QueryClassIN, TTL: 0x231, Value: &RDataSRV{ @@ -761,7 +761,7 @@ func TestMessagePack(t *testing.T) { }, }, { Name: "_xmpp-server._tcp.google.com", - Type: QueryTypeSRV, + Type: RecordTypeSRV, Class: QueryClassIN, TTL: 0x231, Value: &RDataSRV{ @@ -775,7 +775,7 @@ func TestMessagePack(t *testing.T) { }, }, { Name: "_xmpp-server._tcp.google.com", - Type: QueryTypeSRV, + Type: RecordTypeSRV, Class: QueryClassIN, TTL: 0x231, Value: &RDataSRV{ @@ -789,7 +789,7 @@ func TestMessagePack(t *testing.T) { }, }, { Name: "_xmpp-server._tcp.google.com", - Type: QueryTypeSRV, + Type: RecordTypeSRV, Class: QueryClassIN, TTL: 0x231, Value: &RDataSRV{ @@ -803,7 +803,7 @@ func TestMessagePack(t *testing.T) { }, }, { Name: "_xmpp-server._tcp.google.com", - Type: QueryTypeSRV, + Type: RecordTypeSRV, Class: QueryClassIN, TTL: 0x231, Value: &RDataSRV{ @@ -817,7 +817,7 @@ func TestMessagePack(t *testing.T) { }, }}, Additional: []ResourceRecord{{ - Type: QueryTypeOPT, + Type: RecordTypeOPT, Class: 512, TTL: 0, Value: &RDataOPT{}, @@ -1071,12 +1071,12 @@ func TestMessageUnpack(t *testing.T) { }, Question: SectionQuestion{ Name: "kilabit.info", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "kilabit.info", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, TTL: 0x00000168, rdlen: 4, @@ -1084,7 +1084,7 @@ func TestMessageUnpack(t *testing.T) { Value: "103.200.4.162", }}, Additional: []ResourceRecord{{ - Type: QueryTypeOPT, + Type: RecordTypeOPT, Class: 0x0500, TTL: 0, Value: &RDataOPT{}, @@ -1144,12 +1144,12 @@ func TestMessageUnpack(t *testing.T) { }, Question: SectionQuestion{ Name: "kilabit.info", - Type: QueryTypeNS, + Type: RecordTypeNS, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "kilabit.info", - Type: QueryTypeNS, + Type: RecordTypeNS, Class: QueryClassIN, TTL: 0x01336e, rdlen: 0x11, @@ -1159,7 +1159,7 @@ func TestMessageUnpack(t *testing.T) { Value: "ns2.dewaweb.com", }, { Name: "kilabit.info", - Type: QueryTypeNS, + Type: RecordTypeNS, Class: QueryClassIN, TTL: 0x01336e, rdlen: 6, @@ -1169,7 +1169,7 @@ func TestMessageUnpack(t *testing.T) { Value: "ns3.dewaweb.com", }, { Name: "kilabit.info", - Type: QueryTypeNS, + Type: RecordTypeNS, Class: QueryClassIN, TTL: 0x01336e, rdlen: 6, @@ -1179,7 +1179,7 @@ func TestMessageUnpack(t *testing.T) { Value: "ns1.dewaweb.com", }}, Additional: []ResourceRecord{{ - Type: QueryTypeOPT, + Type: RecordTypeOPT, Class: 0x0500, TTL: 0, Value: &RDataOPT{}, @@ -1222,12 +1222,12 @@ func TestMessageUnpack(t *testing.T) { }, Question: SectionQuestion{ Name: "mail.kilabit.info", - Type: QueryTypeCNAME, + Type: RecordTypeCNAME, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "mail.kilabit.info", - Type: QueryTypeCNAME, + Type: RecordTypeCNAME, Class: QueryClassIN, TTL: 0x0168, rdlen: 2, @@ -1235,7 +1235,7 @@ func TestMessageUnpack(t *testing.T) { Value: "kilabit.info", }}, Additional: []ResourceRecord{{ - Type: QueryTypeOPT, + Type: RecordTypeOPT, Class: 0x0500, TTL: 0, Value: &RDataOPT{}, @@ -1280,12 +1280,12 @@ func TestMessageUnpack(t *testing.T) { }, Question: SectionQuestion{ Name: "kilabit.info", - Type: QueryTypeSOA, + Type: RecordTypeSOA, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "kilabit.info", - Type: QueryTypeSOA, + Type: RecordTypeSOA, Class: QueryClassIN, TTL: 10511, rdlen: 56, @@ -1377,12 +1377,12 @@ func TestMessageUnpack(t *testing.T) { }, Question: SectionQuestion{ Name: "google.com", - Type: QueryTypeMX, + Type: RecordTypeMX, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "google.com", - Type: QueryTypeMX, + Type: RecordTypeMX, Class: QueryClassIN, TTL: 0x000000fc, rdlen: 0x11, @@ -1399,7 +1399,7 @@ func TestMessageUnpack(t *testing.T) { }, }, { Name: "google.com", - Type: QueryTypeMX, + Type: RecordTypeMX, Class: QueryClassIN, TTL: 0x000000fc, rdlen: 0x04, @@ -1413,7 +1413,7 @@ func TestMessageUnpack(t *testing.T) { }, }, { Name: "google.com", - Type: QueryTypeMX, + Type: RecordTypeMX, Class: QueryClassIN, TTL: 0x000000fc, rdlen: 0x09, @@ -1428,7 +1428,7 @@ func TestMessageUnpack(t *testing.T) { }, }, { Name: "google.com", - Type: QueryTypeMX, + Type: RecordTypeMX, Class: QueryClassIN, TTL: 0x000000fc, rdlen: 0x09, @@ -1443,7 +1443,7 @@ func TestMessageUnpack(t *testing.T) { }, }, { Name: "google.com", - Type: QueryTypeMX, + Type: RecordTypeMX, Class: QueryClassIN, TTL: 0x000000fc, rdlen: 0x09, @@ -1458,7 +1458,7 @@ func TestMessageUnpack(t *testing.T) { }, }}, Additional: []ResourceRecord{{ - Type: QueryTypeOPT, + Type: RecordTypeOPT, Class: 0x0500, TTL: 0, Value: &RDataOPT{}, @@ -1524,12 +1524,12 @@ func TestMessageUnpack(t *testing.T) { }, Question: SectionQuestion{ Name: "google.com", - Type: QueryTypeTXT, + Type: RecordTypeTXT, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "google.com", - Type: QueryTypeTXT, + Type: RecordTypeTXT, Class: QueryClassIN, TTL: 300, rdlen: 60, @@ -1546,7 +1546,7 @@ func TestMessageUnpack(t *testing.T) { Value: "facebook-domain-verification=22rm551cu4k0ab0bxsw536tlds4h95", }, { Name: "google.com", - Type: QueryTypeTXT, + Type: RecordTypeTXT, Class: QueryClassIN, TTL: 300, rdlen: 36, @@ -1560,7 +1560,7 @@ func TestMessageUnpack(t *testing.T) { Value: "v=spf1 include:_spf.google.com ~all", }, { Name: "google.com", - Type: QueryTypeTXT, + Type: RecordTypeTXT, Class: QueryClassIN, TTL: 300, rdlen: 46, @@ -1575,7 +1575,7 @@ func TestMessageUnpack(t *testing.T) { Value: "docusign=05958488-4752-4ef2-95eb-aa7ba8a3bd0e", }}, Additional: []ResourceRecord{{ - Type: QueryTypeOPT, + Type: RecordTypeOPT, Class: 1280, TTL: 0, rdlen: 0, @@ -1614,12 +1614,12 @@ func TestMessageUnpack(t *testing.T) { }, Question: SectionQuestion{ Name: "google.com", - Type: QueryTypeAAAA, + Type: RecordTypeAAAA, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "google.com", - Type: QueryTypeAAAA, + Type: RecordTypeAAAA, Class: QueryClassIN, TTL: 0x53, rdlen: 16, @@ -1630,7 +1630,7 @@ func TestMessageUnpack(t *testing.T) { Value: "2404:6800:4003:c00::8b", }}, Additional: []ResourceRecord{{ - Type: QueryTypeOPT, + Type: RecordTypeOPT, Class: 1280, TTL: 0, rdlen: 0, @@ -1718,12 +1718,12 @@ func TestMessageUnpack(t *testing.T) { }, Question: SectionQuestion{ Name: "_xmpp-server._tcp.google.com", - Type: QueryTypeSRV, + Type: RecordTypeSRV, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "_xmpp-server._tcp.google.com", - Type: QueryTypeSRV, + Type: RecordTypeSRV, Class: QueryClassIN, TTL: 0x231, rdlen: 0x20, @@ -1745,7 +1745,7 @@ func TestMessageUnpack(t *testing.T) { }, }, { Name: "_xmpp-server._tcp.google.com", - Type: QueryTypeSRV, + Type: RecordTypeSRV, Class: QueryClassIN, TTL: 0x231, rdlen: 0x25, @@ -1768,7 +1768,7 @@ func TestMessageUnpack(t *testing.T) { }, }, { Name: "_xmpp-server._tcp.google.com", - Type: QueryTypeSRV, + Type: RecordTypeSRV, Class: QueryClassIN, TTL: 0x231, rdlen: 0x25, @@ -1791,7 +1791,7 @@ func TestMessageUnpack(t *testing.T) { }, }, { Name: "_xmpp-server._tcp.google.com", - Type: QueryTypeSRV, + Type: RecordTypeSRV, Class: QueryClassIN, TTL: 0x231, rdlen: 0x25, @@ -1814,7 +1814,7 @@ func TestMessageUnpack(t *testing.T) { }, }, { Name: "_xmpp-server._tcp.google.com", - Type: QueryTypeSRV, + Type: RecordTypeSRV, Class: QueryClassIN, TTL: 0x231, rdlen: 0x25, @@ -1837,7 +1837,7 @@ func TestMessageUnpack(t *testing.T) { }, }}, Additional: []ResourceRecord{{ - Type: QueryTypeOPT, + Type: RecordTypeOPT, Class: 512, TTL: 0, rdlen: 0, diff --git a/lib/dns/record_type.go b/lib/dns/record_type.go new file mode 100644 index 00000000..f01672b1 --- /dev/null +++ b/lib/dns/record_type.go @@ -0,0 +1,118 @@ +// Copyright 2021, Shulhan <ms@kilabit.info>. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package dns + +import "net" + +// RecordType A two octet code which specifies the type of the record. +type RecordType uint16 + +// List of code for known DNS record types, ordered by value. +const ( + RecordTypeZERO RecordType = iota // Empty record type. + RecordTypeA // 1 - A host address + RecordTypeNS // 2 - An authoritative name server + RecordTypeMD // 3 - A mail destination (Obsolete - use MX) + RecordTypeMF // 4 - A mail forwarder (Obsolete - use MX) + RecordTypeCNAME // 5 - The canonical name for an alias + RecordTypeSOA // 6 - Marks the start of a zone of authority + RecordTypeMB // 7 - A mailbox domain name (EXPERIMENTAL) + RecordTypeMG // 8 - A mail group member (EXPERIMENTAL) + RecordTypeMR // 9 - A mail rename domain name (EXPERIMENTAL) + RecordTypeNULL // 10 - A null RR (EXPERIMENTAL) + RecordTypeWKS // 11 - A well known service description + RecordTypePTR // 12 - A domain name pointer + RecordTypeHINFO // 13 - Host information + RecordTypeMINFO // 14 - Mailbox or mail list information + RecordTypeMX // 15 - Mail exchange + RecordTypeTXT // 16 - Text strings + + RecordTypeAAAA RecordType = 28 // IPv6 address + RecordTypeSRV RecordType = 33 // A SRV RR for locating service. + RecordTypeOPT RecordType = 41 // An OPT pseudo-RR (sometimes called a meta-RR) + RecordTypeAXFR RecordType = 252 // A request for a transfer of an entire zone + RecordTypeMAILB RecordType = 253 // A request for mailbox-related records (MB, MG or MR) + RecordTypeMAILA RecordType = 254 // A request for mail agent RRs (Obsolete - see MX) + RecordTypeALL RecordType = 255 // A request for all records +) + +// +// RecordTypes contains a mapping between string representation of DNS record +// type with their numeric value, ordered by key alphabetically. +// +var RecordTypes = map[string]RecordType{ + "A": RecordTypeA, + "AAAA": RecordTypeAAAA, + "ALL": RecordTypeALL, + "AXFR": RecordTypeAXFR, + "CNAME": RecordTypeCNAME, + "HINFO": RecordTypeHINFO, + "MAILA": RecordTypeMAILA, + "MAILB": RecordTypeMAILB, + "MB": RecordTypeMB, + "MD": RecordTypeMD, + "MF": RecordTypeMF, + "MG": RecordTypeMG, + "MINFO": RecordTypeMINFO, + "MR": RecordTypeMR, + "MX": RecordTypeMX, + "NS": RecordTypeNS, + "NULL": RecordTypeNULL, + "OPT": RecordTypeOPT, + "PTR": RecordTypePTR, + "SOA": RecordTypeSOA, + "SRV": RecordTypeSRV, + "TXT": RecordTypeTXT, + "WKS": RecordTypeWKS, +} + +// +// RecordTypeNames contains mapping between record type and and their string +// representation, ordered alphabetically. +// +var RecordTypeNames = map[RecordType]string{ + RecordTypeA: "A", + RecordTypeAAAA: "AAAA", + RecordTypeALL: "ALL", + RecordTypeAXFR: "AXFR", + RecordTypeCNAME: "CNAME", + RecordTypeHINFO: "HINFO", + RecordTypeMAILA: "MAILA", + RecordTypeMAILB: "MAILB", + RecordTypeMB: "MB", + RecordTypeMD: "MD", + RecordTypeMF: "MF", + RecordTypeMG: "MG", + RecordTypeMINFO: "MINFO", + RecordTypeMR: "MR", + RecordTypeMX: "MX", + RecordTypeNS: "NS", + RecordTypeNULL: "NULL", + RecordTypeOPT: "OPT", + RecordTypePTR: "PTR", + RecordTypeSOA: "SOA", + RecordTypeSRV: "SRV", + RecordTypeTXT: "TXT", + RecordTypeWKS: "WKS", +} + +// +// RecordTypeFromAddress return RecordTypeA or RecordTypeAAAA if addr is valid +// IPv4 or IPv6 address, respectively, otherwise it will return 0. +// +func RecordTypeFromAddress(addr []byte) (rtype RecordType) { + ip := net.ParseIP(string(addr)) + if ip != nil { + ipv4 := ip.To4() + if ipv4 != nil { + return RecordTypeA + } + ipv6 := ip.To16() + if ipv6 != nil { + return RecordTypeAAAA + } + } + return 0 +} diff --git a/lib/dns/record_type_example_test.go b/lib/dns/record_type_example_test.go new file mode 100644 index 00000000..9d8e96d6 --- /dev/null +++ b/lib/dns/record_type_example_test.go @@ -0,0 +1,25 @@ +// Copyright 2021, Shulhan <ms@kilabit.info>. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package dns + +import "fmt" + +func ExampleRecordType() { + fmt.Println(RecordType(1)) // Known record type. + fmt.Println(RecordType(17)) // Unregistered record type. + //Output: + //1 + //17 +} + +func ExampleRecordTypeFromAddress() { + fmt.Println(RecordTypeFromAddress([]byte("127.0.0.1"))) + fmt.Println(RecordTypeFromAddress([]byte("fc00::"))) + fmt.Println(RecordTypeFromAddress([]byte("127"))) + //Output: + //1 + //28 + //0 +} diff --git a/lib/dns/record_type_test.go b/lib/dns/record_type_test.go new file mode 100644 index 00000000..18fe713f --- /dev/null +++ b/lib/dns/record_type_test.go @@ -0,0 +1,18 @@ +// Copyright 2021, Shulhan <ms@kilabit.info>. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package dns + +import ( + "testing" + + "github.com/shuLhan/share/lib/test" +) + +func TestRecordType(t *testing.T) { + test.Assert(t, "RecordTypeA", RecordTypeA, RecordType(1)) + test.Assert(t, "RecordTypeTXT", RecordTypeTXT, RecordType(16)) + test.Assert(t, "RecordTypeAXFR", RecordTypeAXFR, RecordType(252)) + test.Assert(t, "RecordTypeALL", RecordTypeALL, RecordType(255)) +} diff --git a/lib/dns/resource_record.go b/lib/dns/resource_record.go index 8ee65285..bd9f22d1 100644 --- a/lib/dns/resource_record.go +++ b/lib/dns/resource_record.go @@ -27,7 +27,7 @@ type ResourceRecord struct { // Two octets containing one of the RR type codes. This field // specifies the meaning of the data in the RDATA field. - Type uint16 + Type RecordType // Two octets which specify the class of the data in the RDATA field. Class uint16 @@ -84,107 +84,107 @@ func (rr *ResourceRecord) initAndValidate() (err error) { rr.TTL = defaultTTL } - qtype, ok := QueryTypeNames[rr.Type] + rtype, ok := RecordTypeNames[rr.Type] if !ok { return fmt.Errorf("%s: unknown type %d", logp, rr.Type) } switch rr.Type { - case QueryTypeA: + case RecordTypeA: v, ok := rr.Value.(string) if !ok { - return fmt.Errorf("%s: expecting %s got %T", logp, qtype, rr.Value) + return fmt.Errorf("%s: expecting %s got %T", logp, rtype, rr.Value) } ip := net.ParseIP(v) if ip == nil { - return fmt.Errorf("%s: invalid or empty %s: %q", logp, qtype, v) + return fmt.Errorf("%s: invalid or empty %s: %q", logp, rtype, v) } ipv4 := ip.To4() if ipv4 == nil { - return fmt.Errorf("%s: invalid or empty %s: %q", logp, qtype, v) + return fmt.Errorf("%s: invalid or empty %s: %q", logp, rtype, v) } - case QueryTypeNS, QueryTypeCNAME, QueryTypeMB, QueryTypeMG, - QueryTypeMR, QueryTypeNULL, QueryTypePTR: + case RecordTypeNS, RecordTypeCNAME, RecordTypeMB, RecordTypeMG, + RecordTypeMR, RecordTypeNULL, RecordTypePTR: v, ok := rr.Value.(string) if !ok { - return fmt.Errorf("%s: expecting %s got %T", logp, qtype, rr.Value) + return fmt.Errorf("%s: expecting %s got %T", logp, rtype, rr.Value) } if !libnet.IsHostnameValid([]byte(v), true) { - return fmt.Errorf("%s: invalid or empty %s: %q", logp, qtype, v) + return fmt.Errorf("%s: invalid or empty %s: %q", logp, rtype, v) } - case QueryTypeSOA: + case RecordTypeSOA: soa, ok := rr.Value.(*RDataSOA) if !ok { - return fmt.Errorf("%s: expecting %s got %T", logp, qtype, rr.Value) + return fmt.Errorf("%s: expecting %s got %T", logp, rtype, rr.Value) } if !libnet.IsHostnameValid([]byte(soa.MName), true) { - return fmt.Errorf("%s: invalid or empty %s MName: %q", logp, qtype, soa.MName) + return fmt.Errorf("%s: invalid or empty %s MName: %q", logp, rtype, soa.MName) } if !libnet.IsHostnameValid([]byte(soa.RName), true) { - return fmt.Errorf("%s: invalid or empty %s RName: %q", logp, qtype, soa.RName) + return fmt.Errorf("%s: invalid or empty %s RName: %q", logp, rtype, soa.RName) } - case QueryTypeWKS: + case RecordTypeWKS: _, ok := rr.Value.(*RDataWKS) if !ok { - return fmt.Errorf("%s: expecting %s got %T", logp, qtype, rr.Value) + return fmt.Errorf("%s: expecting %s got %T", logp, rtype, rr.Value) } - case QueryTypeHINFO: + case RecordTypeHINFO: _, ok := rr.Value.(*RDataHINFO) if !ok { - return fmt.Errorf("%s: expecting %s got %T", logp, qtype, rr.Value) + return fmt.Errorf("%s: expecting %s got %T", logp, rtype, rr.Value) } - case QueryTypeMINFO: + case RecordTypeMINFO: _, ok := rr.Value.(*RDataMINFO) if !ok { - return fmt.Errorf("%s: expecting %s got %T", logp, qtype, rr.Value) + return fmt.Errorf("%s: expecting %s got %T", logp, rtype, rr.Value) } - case QueryTypeMX: + case RecordTypeMX: mx, ok := rr.Value.(*RDataMX) if !ok { - return fmt.Errorf("%s: expecting %s got %T", logp, qtype, rr.Value) + return fmt.Errorf("%s: expecting %s got %T", logp, rtype, rr.Value) } err = mx.initAndValidate() if err != nil { return fmt.Errorf("%s: %w", logp, err) } - case QueryTypeTXT: + case RecordTypeTXT: txt, ok := rr.Value.(string) if !ok { - return fmt.Errorf("%s: expecting %s got %T", logp, qtype, rr.Value) + return fmt.Errorf("%s: expecting %s got %T", logp, rtype, rr.Value) } if len(txt) == 0 { - return fmt.Errorf("%s: empty %s value", logp, qtype) + return fmt.Errorf("%s: empty %s value", logp, rtype) } - case QueryTypeSRV: + case RecordTypeSRV: srv, ok := rr.Value.(*RDataSRV) if !ok { - return fmt.Errorf("%s: expecting %s got %T", logp, qtype, rr.Value) + return fmt.Errorf("%s: expecting %s got %T", logp, rtype, rr.Value) } err = srv.initAndValidate() if err != nil { return fmt.Errorf("%s: %w", logp, err) } - case QueryTypeAAAA: + case RecordTypeAAAA: v, ok := rr.Value.(string) if !ok { - return fmt.Errorf("%s: expecting %s got %T", logp, qtype, rr.Value) + return fmt.Errorf("%s: expecting %s got %T", logp, rtype, rr.Value) } ip := net.ParseIP(v) if ip == nil { - return fmt.Errorf("%s: invalid or empty %s value: %q", logp, qtype, v) + return fmt.Errorf("%s: invalid or empty %s value: %q", logp, rtype, v) } ipv6 := ip.To16() if ipv6 == nil { - return fmt.Errorf("%s: invalid or empty %s value: %q", logp, qtype, v) + return fmt.Errorf("%s: invalid or empty %s value: %q", logp, rtype, v) } - case QueryTypeOPT: + case RecordTypeOPT: _, ok := rr.Value.(*RDataOPT) if !ok { - return fmt.Errorf("%s: expecting %s got %T", logp, qtype, rr.Value) + return fmt.Errorf("%s: expecting %s got %T", logp, rtype, rr.Value) } } return nil @@ -212,7 +212,7 @@ func (rr *ResourceRecord) unpack(packet []byte, startIdx uint) (x uint, err erro } } - rr.Type = libbytes.ReadUint16(packet, x) + rr.Type = RecordType(libbytes.ReadUint16(packet, x)) x += 2 rr.Class = libbytes.ReadUint16(packet, x) x += 2 @@ -279,7 +279,7 @@ func unpackDomainName(packet []byte, start uint) (name string, end uint, err err func (rr *ResourceRecord) unpackRData(packet []byte, startIdx uint) (err error) { switch rr.Type { - case QueryTypeA: + case RecordTypeA: return rr.unpackA() // @@ -295,7 +295,7 @@ func (rr *ResourceRecord) unpackRData(packet []byte, startIdx uint) (err error) // or Hesiod (HS) class information are normally queried using IN // class protocols. // - case QueryTypeNS: + case RecordTypeNS: rr.Value, _, err = unpackDomainName(packet, startIdx) return err @@ -303,68 +303,68 @@ func (rr *ResourceRecord) unpackRData(packet []byte, startIdx uint) (err error) // the new scheme. The recommended policy for dealing with MD RRs found in // a zone file is to reject them, or to convert them to MX RRs with a // preference of 0. - case QueryTypeMD: + case RecordTypeMD: // MF is obsolete. See the definition of MX and [RFC-974] for details // ofw the new scheme. The recommended policy for dealing with MD RRs // found in a zone file is to reject them, or to convert them to MX // RRs with a preference of 10. - case QueryTypeMF: + case RecordTypeMF: // CNAME RRs cause no additional section processing, but name servers // may choose to restart the query at the canonical name in certain // cases. See the description of name server logic in [RFC-1034] for // details. - case QueryTypeCNAME: + case RecordTypeCNAME: rr.Value, _, err = unpackDomainName(packet, startIdx) return err - case QueryTypeSOA: + case RecordTypeSOA: return rr.unpackSOA(packet, startIdx) - case QueryTypeMB: + case RecordTypeMB: rr.Value, _, err = unpackDomainName(packet, startIdx) return err - case QueryTypeMG: + case RecordTypeMG: rr.Value, _, err = unpackDomainName(packet, startIdx) return err - case QueryTypeMR: + case RecordTypeMR: rr.Value, _, err = unpackDomainName(packet, startIdx) return err // NULL records cause no additional section processing. // NULLs are used as placeholders in some experimental extensions of // the DNS. - case QueryTypeNULL: + case RecordTypeNULL: endIdx := startIdx + uint(rr.rdlen) rr.Value = string(packet[startIdx : startIdx+endIdx]) return nil - case QueryTypeWKS: + case RecordTypeWKS: rrWKS := new(RDataWKS) rr.Value = rrWKS endIdx := startIdx + uint(rr.rdlen) return rrWKS.unpack(packet[startIdx:endIdx]) - case QueryTypePTR: + case RecordTypePTR: rr.Value, _, err = unpackDomainName(packet, startIdx) return err - case QueryTypeHINFO: + case RecordTypeHINFO: rrHInfo := new(RDataHINFO) rr.Value = rrHInfo endIdx := startIdx + uint(rr.rdlen) return rrHInfo.unpack(packet[startIdx:endIdx]) - case QueryTypeMINFO: + case RecordTypeMINFO: return rr.unpackMInfo(packet, startIdx) - case QueryTypeMX: + case RecordTypeMX: return rr.unpackMX(packet, startIdx) - case QueryTypeTXT: + case RecordTypeTXT: endIdx := startIdx + uint(rr.rdlen) // The first byte of TXT is length. @@ -372,13 +372,13 @@ func (rr *ResourceRecord) unpackRData(packet []byte, startIdx uint) (err error) return nil - case QueryTypeAAAA: + case RecordTypeAAAA: return rr.unpackAAAA() - case QueryTypeSRV: + case RecordTypeSRV: return rr.unpackSRV(packet, startIdx) - case QueryTypeOPT: + case RecordTypeOPT: return rr.unpackOPT(packet, startIdx) default: diff --git a/lib/dns/section_question.go b/lib/dns/section_question.go index 8a90579d..b03ad47b 100644 --- a/lib/dns/section_question.go +++ b/lib/dns/section_question.go @@ -28,7 +28,7 @@ type SectionQuestion struct { // for this field include all codes valid for a TYPE field, together // with some more general codes which can match more than one type of // RR. - Type uint16 + Type RecordType // A two octet code that specifies the class of the query. For // example, the QCLASS field is IN for the Internet. @@ -40,14 +40,14 @@ type SectionQuestion struct { // func (question *SectionQuestion) Reset() { question.Name = question.Name[:0] - question.Type = QueryTypeA + question.Type = RecordTypeA question.Class = QueryClassIN } // // size return the section question size, length of name + 2 (1 octet for // beginning size plus 1 octet for end of label) + 2 octets of -// qtype + 2 octets of qclass +// rtype + 2 octets of qclass // func (question *SectionQuestion) size() int { return len(question.Name) + 6 @@ -58,7 +58,7 @@ func (question *SectionQuestion) size() int { // func (question *SectionQuestion) String() string { return fmt.Sprintf("&{Name:%s Type:%s}", question.Name, - QueryTypeNames[question.Type]) + RecordTypeNames[question.Type]) } // @@ -109,7 +109,7 @@ func (question *SectionQuestion) unpack(packet []byte) (err error) { } question.Name = sb.String() - question.Type = libbytes.ReadUint16(packet, uint(x)) + question.Type = RecordType(libbytes.ReadUint16(packet, uint(x))) x += 2 question.Class = libbytes.ReadUint16(packet, uint(x)) diff --git a/lib/dns/server.go b/lib/dns/server.go index 95d151be..8f11471a 100644 --- a/lib/dns/server.go +++ b/lib/dns/server.go @@ -648,12 +648,12 @@ func (srv *Server) isImplemented(msg *Message) bool { return false } - if msg.Question.Type >= QueryTypeA && msg.Question.Type <= QueryTypeTXT { + if msg.Question.Type >= RecordTypeA && msg.Question.Type <= RecordTypeTXT { return true } switch msg.Question.Type { - case QueryTypeAAAA, QueryTypeSRV, QueryTypeOPT, QueryTypeAXFR, - QueryTypeMAILB, QueryTypeMAILA: + case RecordTypeAAAA, RecordTypeSRV, RecordTypeOPT, RecordTypeAXFR, + RecordTypeMAILB, RecordTypeMAILA: return true } diff --git a/lib/dns/server_example_test.go b/lib/dns/server_example_test.go index a2a69eb7..e58977e9 100644 --- a/lib/dns/server_example_test.go +++ b/lib/dns/server_example_test.go @@ -15,7 +15,7 @@ func clientLookup(nameserver string) { return } - msg, err := cl.Lookup(false, dns.QueryTypeA, dns.QueryClassIN, + msg, err := cl.Lookup(false, dns.RecordTypeA, dns.QueryClassIN, "kilabit.info") if err != nil { log.Println(err) diff --git a/lib/dns/tcp_client.go b/lib/dns/tcp_client.go index 42f99fd9..a5ab454b 100644 --- a/lib/dns/tcp_client.go +++ b/lib/dns/tcp_client.go @@ -87,15 +87,15 @@ func (cl *TCPClient) Connect(raddr *net.TCPAddr) (err error) { // This function is safe to be used concurrently. // func (cl *TCPClient) Lookup( - allowRecursion bool, qtype, qclass uint16, qname string, + allowRecursion bool, rtype RecordType, qclass uint16, qname string, ) ( *Message, error, ) { if cl.addr == nil || cl.conn == nil { return nil, nil } - if qtype == 0 { - qtype = QueryTypeA + if rtype == 0 { + rtype = RecordTypeA } if qclass == 0 { qclass = QueryClassIN @@ -106,7 +106,7 @@ func (cl *TCPClient) Lookup( msg.Header.ID = getNextID() msg.Header.IsRD = allowRecursion msg.Header.QDCount = 1 - msg.Question.Type = qtype + msg.Question.Type = rtype msg.Question.Class = qclass msg.Question.Name = qname diff --git a/lib/dns/tcp_client_example_test.go b/lib/dns/tcp_client_example_test.go index a88a44a4..19fec7c8 100644 --- a/lib/dns/tcp_client_example_test.go +++ b/lib/dns/tcp_client_example_test.go @@ -14,7 +14,7 @@ func ExampleTCPClient_Lookup() { return } - msg, err := cl.Lookup(false, dns.QueryTypeA, dns.QueryClassIN, + msg, err := cl.Lookup(false, dns.RecordTypeA, dns.QueryClassIN, "kilabit.info") if err != nil { log.Println(err) diff --git a/lib/dns/tcp_client_test.go b/lib/dns/tcp_client_test.go index 45712ed3..ba4b9d14 100644 --- a/lib/dns/tcp_client_test.go +++ b/lib/dns/tcp_client_test.go @@ -19,13 +19,13 @@ func TestTCPClientLookup(t *testing.T) { cases := []struct { desc string allowRecursion bool - qtype uint16 + rtype RecordType qclass uint16 qname string exp *Message }{{ - desc: "QType:A QClass:IN QName:kilabit.info", - qtype: QueryTypeA, + desc: "RType:A QClass:IN QName:kilabit.info", + rtype: RecordTypeA, qclass: QueryClassIN, qname: "kilabit.info", exp: &Message{ @@ -37,12 +37,12 @@ func TestTCPClientLookup(t *testing.T) { }, Question: SectionQuestion{ Name: "kilabit.info", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "kilabit.info", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, TTL: 3600, rdlen: 4, @@ -52,8 +52,8 @@ func TestTCPClientLookup(t *testing.T) { Additional: []ResourceRecord{}, }, }, { - desc: "QType:SOA QClass:IN QName:kilabit.info", - qtype: QueryTypeSOA, + desc: "RType:SOA QClass:IN QName:kilabit.info", + rtype: RecordTypeSOA, qclass: QueryClassIN, qname: "kilabit.info", exp: &Message{ @@ -65,12 +65,12 @@ func TestTCPClientLookup(t *testing.T) { }, Question: SectionQuestion{ Name: "kilabit.info", - Type: QueryTypeSOA, + Type: RecordTypeSOA, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "kilabit.info", - Type: QueryTypeSOA, + Type: RecordTypeSOA, Class: QueryClassIN, TTL: 3600, Value: &RDataSOA{ @@ -87,8 +87,8 @@ func TestTCPClientLookup(t *testing.T) { Additional: []ResourceRecord{}, }, }, { - desc: "QType:TXT QClass:IN QName:kilabit.info", - qtype: QueryTypeTXT, + desc: "RType:TXT QClass:IN QName:kilabit.info", + rtype: RecordTypeTXT, qclass: QueryClassIN, qname: "kilabit.info", exp: &Message{ @@ -100,12 +100,12 @@ func TestTCPClientLookup(t *testing.T) { }, Question: SectionQuestion{ Name: "kilabit.info", - Type: QueryTypeTXT, + Type: RecordTypeTXT, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "kilabit.info", - Type: QueryTypeTXT, + Type: RecordTypeTXT, Class: QueryClassIN, TTL: 3600, Value: "This is a test server", @@ -118,7 +118,7 @@ func TestTCPClientLookup(t *testing.T) { for _, c := range cases { t.Log(c.desc) - got, err := cl.Lookup(c.allowRecursion, c.qtype, c.qclass, c.qname) + got, err := cl.Lookup(c.allowRecursion, c.rtype, c.qclass, c.qname) if err != nil { t.Fatal(err) } diff --git a/lib/dns/udp_client.go b/lib/dns/udp_client.go index c2bc6014..ef375db4 100644 --- a/lib/dns/udp_client.go +++ b/lib/dns/udp_client.go @@ -85,7 +85,7 @@ func (cl *UDPClient) Close() error { // This function is safe to be used concurrently. // func (cl *UDPClient) Lookup( - allowRecursion bool, qtype, qclass uint16, qname string, + allowRecursion bool, rtype RecordType, qclass uint16, qname string, ) ( *Message, error, ) { @@ -98,7 +98,7 @@ func (cl *UDPClient) Lookup( msg.Header.ID = getNextID() msg.Header.IsRD = allowRecursion msg.Header.QDCount = 1 - msg.Question.Type = qtype + msg.Question.Type = rtype msg.Question.Class = qclass msg.Question.Name = qname diff --git a/lib/dns/udp_client_example_test.go b/lib/dns/udp_client_example_test.go index 88c65d77..5c8b1641 100644 --- a/lib/dns/udp_client_example_test.go +++ b/lib/dns/udp_client_example_test.go @@ -22,7 +22,7 @@ func ExampleUDPClient() { Header: dns.SectionHeader{}, Question: dns.SectionQuestion{ Name: "kilabit.info", - Type: dns.QueryTypeA, + Type: dns.RecordTypeA, Class: dns.QueryClassIN, }, } @@ -58,7 +58,7 @@ func ExampleUDPClient_Lookup() { return } - msg, err := cl.Lookup(false, dns.QueryTypeA, dns.QueryClassIN, + msg, err := cl.Lookup(false, dns.RecordTypeA, dns.QueryClassIN, "kilabit.info") if err != nil { log.Println(err) diff --git a/lib/dns/udp_client_pool_test.go b/lib/dns/udp_client_pool_test.go index b68f7f9b..2a248b47 100644 --- a/lib/dns/udp_client_pool_test.go +++ b/lib/dns/udp_client_pool_test.go @@ -48,7 +48,7 @@ func TestNewUDPClientPool(t *testing.T) { wg.Add(1) go func() { cl := ucp.Get() - _, err := cl.Lookup(false, QueryTypeA, + _, err := cl.Lookup(false, RecordTypeA, QueryClassIN, qname) if err != nil { t.Log("Lookup error: ", err.Error()) diff --git a/lib/dns/udp_client_test.go b/lib/dns/udp_client_test.go index 3ea3b90f..fd028372 100644 --- a/lib/dns/udp_client_test.go +++ b/lib/dns/udp_client_test.go @@ -19,13 +19,13 @@ func TestUDPClientLookup(t *testing.T) { cases := []struct { desc string allowRecursion bool - qtype uint16 + rtype RecordType qclass uint16 qname string exp *Message }{{ desc: "QType:A QClass:IN QName:kilabit.info", - qtype: QueryTypeA, + rtype: RecordTypeA, qclass: QueryClassIN, qname: "kilabit.info", exp: &Message{ @@ -37,12 +37,12 @@ func TestUDPClientLookup(t *testing.T) { }, Question: SectionQuestion{ Name: "kilabit.info", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "kilabit.info", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, TTL: 3600, rdlen: 4, @@ -53,7 +53,7 @@ func TestUDPClientLookup(t *testing.T) { }, }, { desc: "QType:SOA QClass:IN QName:kilabit.info", - qtype: QueryTypeSOA, + rtype: RecordTypeSOA, qclass: QueryClassIN, qname: "kilabit.info", exp: &Message{ @@ -65,12 +65,12 @@ func TestUDPClientLookup(t *testing.T) { }, Question: SectionQuestion{ Name: "kilabit.info", - Type: QueryTypeSOA, + Type: RecordTypeSOA, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "kilabit.info", - Type: QueryTypeSOA, + Type: RecordTypeSOA, Class: QueryClassIN, TTL: 3600, Value: &RDataSOA{ @@ -88,7 +88,7 @@ func TestUDPClientLookup(t *testing.T) { }, }, { desc: "QType:TXT QClass:IN QName:kilabit.info", - qtype: QueryTypeTXT, + rtype: RecordTypeTXT, qclass: QueryClassIN, qname: "kilabit.info", exp: &Message{ @@ -100,12 +100,12 @@ func TestUDPClientLookup(t *testing.T) { }, Question: SectionQuestion{ Name: "kilabit.info", - Type: QueryTypeTXT, + Type: RecordTypeTXT, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "kilabit.info", - Type: QueryTypeTXT, + Type: RecordTypeTXT, Class: QueryClassIN, TTL: 3600, Value: "This is a test server", @@ -115,7 +115,7 @@ func TestUDPClientLookup(t *testing.T) { }, }, { desc: "QType:AAAA QClass:IN QName:kilabit.info", - qtype: QueryTypeAAAA, + rtype: RecordTypeAAAA, qclass: QueryClassIN, qname: "kilabit.info", exp: &Message{ @@ -127,7 +127,7 @@ func TestUDPClientLookup(t *testing.T) { }, Question: SectionQuestion{ Name: "kilabit.info", - Type: QueryTypeAAAA, + Type: RecordTypeAAAA, Class: QueryClassIN, }, Answer: []ResourceRecord{}, @@ -137,13 +137,13 @@ func TestUDPClientLookup(t *testing.T) { }, { desc: "IsRD:true QType:AAAA QClass:IN QName:kilabit.info", allowRecursion: true, - qtype: QueryTypeAAAA, + rtype: RecordTypeAAAA, qclass: QueryClassIN, qname: "kilabit.info", }, { desc: "IsRD:true QType:A QClass:IN QName:random", allowRecursion: true, - qtype: QueryTypeA, + rtype: RecordTypeA, qclass: QueryClassIN, qname: "random", }} @@ -151,7 +151,7 @@ func TestUDPClientLookup(t *testing.T) { for _, c := range cases { t.Log(c.desc) - got, err := cl.Lookup(c.allowRecursion, c.qtype, c.qclass, c.qname) + got, err := cl.Lookup(c.allowRecursion, c.rtype, c.qclass, c.qname) if err != nil { t.Fatal(err) } diff --git a/lib/dns/zone_file.go b/lib/dns/zone_file.go index a0dda77f..9c21e7cf 100644 --- a/lib/dns/zone_file.go +++ b/lib/dns/zone_file.go @@ -35,7 +35,7 @@ func NewZoneFile(file, name string) *ZoneFile { Path: file, Name: name, SOA: ResourceRecord{ - Type: QueryTypeSOA, + Type: RecordTypeSOA, Value: &RDataSOA{ MName: name, }, @@ -141,7 +141,7 @@ func ParseZoneFile(file, origin string, ttl uint32) (*ZoneFile, error) { // Add add new ResourceRecord to ZoneFile. // func (zone *ZoneFile) Add(rr *ResourceRecord) (err error) { - if rr.Type == QueryTypeSOA { + if rr.Type == RecordTypeSOA { zone.SOA = *rr } else { zone.Records.add(rr) @@ -195,9 +195,9 @@ func (zone *ZoneFile) Messages() []*Message { // Remove a ResourceRecord from zone file. // func (zone *ZoneFile) Remove(rr *ResourceRecord) (err error) { - if rr.Type == QueryTypeSOA { + if rr.Type == RecordTypeSOA { zone.SOA = ResourceRecord{ - Type: QueryTypeSOA, + Type: RecordTypeSOA, Value: &RDataSOA{}, } } else { @@ -281,22 +281,22 @@ func (zone *ZoneFile) saveListRR( dname = "\t" } switch rr.Type { - case QueryTypeA, QueryTypeNULL, QueryTypeAAAA: + case RecordTypeA, RecordTypeNULL, RecordTypeAAAA: _, err = fmt.Fprintf(out, "%s %d %s %s %s\n", dname, rr.TTL, QueryClassName[rr.Class], - QueryTypeNames[rr.Type], rr.Value.(string)) + RecordTypeNames[rr.Type], rr.Value.(string)) - case QueryTypeTXT: + case RecordTypeTXT: _, err = fmt.Fprintf(out, "%s %d %s %s %q\n", dname, rr.TTL, QueryClassName[rr.Class], - QueryTypeNames[rr.Type], rr.Value.(string)) + RecordTypeNames[rr.Type], rr.Value.(string)) - case QueryTypeNS, QueryTypeCNAME, QueryTypeMB, - QueryTypeMG, QueryTypeMR: + case RecordTypeNS, RecordTypeCNAME, RecordTypeMB, + RecordTypeMG, RecordTypeMR: v, ok := rr.Value.(string) if !ok { err = errors.New("invalid record value for " + - QueryTypeNames[rr.Type]) + RecordTypeNames[rr.Type]) break } if strings.HasSuffix(v, zone.Name) { @@ -306,13 +306,13 @@ func (zone *ZoneFile) saveListRR( } _, err = fmt.Fprintf(out, "%s %d %s %s %s\n", dname, rr.TTL, QueryClassName[rr.Class], - QueryTypeNames[rr.Type], v) + RecordTypeNames[rr.Type], v) - case QueryTypePTR: + case RecordTypePTR: v, ok := rr.Value.(string) if !ok { err = errors.New("invalid record value for " + - QueryTypeNames[rr.Type]) + RecordTypeNames[rr.Type]) break } if strings.HasSuffix(v, zone.Name) { @@ -323,7 +323,7 @@ func (zone *ZoneFile) saveListRR( _, err = fmt.Fprintf(out, "%s. %d IN PTR %s\n", rr.Name, rr.TTL, v) - case QueryTypeWKS: + case RecordTypeWKS: wks, ok := rr.Value.(*RDataWKS) if !ok { err = errors.New("invalid record value for WKS") @@ -334,7 +334,7 @@ func (zone *ZoneFile) saveListRR( dname, rr.TTL, QueryClassName[rr.Class], wks.Address, wks.Protocol, wks.BitMap) - case QueryTypeHINFO: + case RecordTypeHINFO: hinfo, ok := rr.Value.(*RDataHINFO) if !ok { err = errors.New("invalid record value for HINFO") @@ -345,7 +345,7 @@ func (zone *ZoneFile) saveListRR( dname, rr.TTL, QueryClassName[rr.Class], hinfo.CPU, hinfo.OS) - case QueryTypeMINFO: + case RecordTypeMINFO: minfo, ok := rr.Value.(*RDataMINFO) if !ok { err = errors.New("invalid record value for MINFO") @@ -356,7 +356,7 @@ func (zone *ZoneFile) saveListRR( dname, rr.TTL, QueryClassName[rr.Class], minfo.RMailBox, minfo.EmailBox) - case QueryTypeMX: + case RecordTypeMX: mx, ok := rr.Value.(*RDataMX) if !ok { err = errors.New("invalid record value for MX") @@ -367,7 +367,7 @@ func (zone *ZoneFile) saveListRR( dname, rr.TTL, QueryClassName[rr.Class], mx.Preference, mx.Exchange) - case QueryTypeSRV: + case RecordTypeSRV: srv, ok := rr.Value.(*RDataSRV) if !ok { err = errors.New("invalid record value for SRV") diff --git a/lib/dns/zone_file_test.go b/lib/dns/zone_file_test.go index 82658f9d..db46a04f 100644 --- a/lib/dns/zone_file_test.go +++ b/lib/dns/zone_file_test.go @@ -171,12 +171,12 @@ VAXA A 10.2.0.27 }, Question: SectionQuestion{ Name: "isi.edu", - Type: QueryTypeSOA, + Type: RecordTypeSOA, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "isi.edu", - Type: QueryTypeSOA, + Type: RecordTypeSOA, Class: QueryClassIN, TTL: 3600, Value: &RDataSOA{ @@ -197,24 +197,24 @@ VAXA A 10.2.0.27 }, Question: SectionQuestion{ Name: "isi.edu", - Type: QueryTypeNS, + Type: RecordTypeNS, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "isi.edu", - Type: QueryTypeNS, + Type: RecordTypeNS, Class: QueryClassIN, TTL: 3600, Value: "a.isi.edu", }, { Name: "isi.edu", - Type: QueryTypeNS, + Type: RecordTypeNS, Class: QueryClassIN, TTL: 3600, Value: "venera.isi.edu", }, { Name: "isi.edu", - Type: QueryTypeNS, + Type: RecordTypeNS, Class: QueryClassIN, TTL: 3600, Value: "vaxa.isi.edu", @@ -227,12 +227,12 @@ VAXA A 10.2.0.27 }, Question: SectionQuestion{ Name: "isi.edu", - Type: QueryTypeMX, + Type: RecordTypeMX, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "isi.edu", - Type: QueryTypeMX, + Type: RecordTypeMX, Class: QueryClassIN, TTL: 3600, Value: &RDataMX{ @@ -241,7 +241,7 @@ VAXA A 10.2.0.27 }, }, { Name: "isi.edu", - Type: QueryTypeMX, + Type: RecordTypeMX, Class: QueryClassIN, TTL: 3600, Value: &RDataMX{ @@ -257,12 +257,12 @@ VAXA A 10.2.0.27 }, Question: SectionQuestion{ Name: "a.isi.edu", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "a.isi.edu", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, TTL: 3600, Value: "26.3.0.103", @@ -275,18 +275,18 @@ VAXA A 10.2.0.27 }, Question: SectionQuestion{ Name: "venera.isi.edu", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "venera.isi.edu", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, TTL: 3600, Value: "10.1.0.52", }, { Name: "venera.isi.edu", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, TTL: 3600, Value: "128.9.0.32", @@ -299,18 +299,18 @@ VAXA A 10.2.0.27 }, Question: SectionQuestion{ Name: "vaxa.isi.edu", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "vaxa.isi.edu", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, TTL: 3600, Value: "10.2.0.27", }, { Name: "vaxa.isi.edu", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, TTL: 3600, Value: "128.9.0.33", @@ -402,12 +402,12 @@ relay IN CNAME relay.pair.com. }, Question: SectionQuestion{ Name: "pcguide.com", - Type: QueryTypeSOA, + Type: RecordTypeSOA, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "pcguide.com", - Type: QueryTypeSOA, + Type: RecordTypeSOA, Class: QueryClassIN, TTL: 3600, Value: &RDataSOA{ @@ -428,18 +428,18 @@ relay IN CNAME relay.pair.com. }, Question: SectionQuestion{ Name: "pcguide.com", - Type: QueryTypeNS, + Type: RecordTypeNS, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "pcguide.com", - Type: QueryTypeNS, + Type: RecordTypeNS, Class: QueryClassIN, TTL: 3600, Value: "ns23.pair.com", }, { Name: "pcguide.com", - Type: QueryTypeNS, + Type: RecordTypeNS, Class: QueryClassIN, TTL: 3600, Value: "ns0.ns0.com", @@ -452,12 +452,12 @@ relay IN CNAME relay.pair.com. }, Question: SectionQuestion{ Name: "localhost.pcguide.com", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "localhost.pcguide.com", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, TTL: 3600, Value: "127.0.0.1", @@ -470,12 +470,12 @@ relay IN CNAME relay.pair.com. }, Question: SectionQuestion{ Name: "pcguide.com", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "pcguide.com", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, TTL: 3600, Value: "209.68.14.80", @@ -488,12 +488,12 @@ relay IN CNAME relay.pair.com. }, Question: SectionQuestion{ Name: "pcguide.com", - Type: QueryTypeMX, + Type: RecordTypeMX, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "pcguide.com", - Type: QueryTypeMX, + Type: RecordTypeMX, Class: QueryClassIN, TTL: 3600, Value: &RDataMX{ @@ -509,12 +509,12 @@ relay IN CNAME relay.pair.com. }, Question: SectionQuestion{ Name: "www.pcguide.com", - Type: QueryTypeCNAME, + Type: RecordTypeCNAME, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "www.pcguide.com", - Type: QueryTypeCNAME, + Type: RecordTypeCNAME, Class: QueryClassIN, TTL: 3600, Value: "pcguide.com", @@ -527,12 +527,12 @@ relay IN CNAME relay.pair.com. }, Question: SectionQuestion{ Name: "ftp.pcguide.com", - Type: QueryTypeCNAME, + Type: RecordTypeCNAME, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "ftp.pcguide.com", - Type: QueryTypeCNAME, + Type: RecordTypeCNAME, Class: QueryClassIN, TTL: 3600, Value: "pcguide.com", @@ -545,12 +545,12 @@ relay IN CNAME relay.pair.com. }, Question: SectionQuestion{ Name: "mail.pcguide.com", - Type: QueryTypeCNAME, + Type: RecordTypeCNAME, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "mail.pcguide.com", - Type: QueryTypeCNAME, + Type: RecordTypeCNAME, Class: QueryClassIN, TTL: 3600, Value: "pcguide.com", @@ -563,12 +563,12 @@ relay IN CNAME relay.pair.com. }, Question: SectionQuestion{ Name: "relay.pcguide.com", - Type: QueryTypeCNAME, + Type: RecordTypeCNAME, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "relay.pcguide.com", - Type: QueryTypeCNAME, + Type: RecordTypeCNAME, Class: QueryClassIN, TTL: 3600, Value: "relay.pair.com", @@ -648,12 +648,12 @@ angularjs.doc A 127.0.0.1 }, Question: SectionQuestion{ Name: "dev.kilabit.info", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "dev.kilabit.info", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, TTL: 3600, Value: "127.0.0.1", @@ -666,12 +666,12 @@ angularjs.doc A 127.0.0.1 }, Question: SectionQuestion{ Name: "dev.kilabit.com", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "dev.kilabit.com", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, TTL: 3600, Value: "127.0.0.1", @@ -684,12 +684,12 @@ angularjs.doc A 127.0.0.1 }, Question: SectionQuestion{ Name: "angularjs.doc.localdomain", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "angularjs.doc.localdomain", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, TTL: 3600, Value: "127.0.0.1", @@ -757,12 +757,12 @@ func TestZoneParseTXT(t *testing.T) { }, Question: SectionQuestion{ Name: "kilabit.local", - Type: QueryTypeTXT, + Type: RecordTypeTXT, Class: QueryClassIN, }, Answer: []ResourceRecord{{ Name: "kilabit.local", - Type: QueryTypeTXT, + Type: RecordTypeTXT, Class: QueryClassIN, TTL: 3600, Value: "This is a test", diff --git a/lib/dns/zone_parser.go b/lib/dns/zone_parser.go index 059c6cda..a4a6958c 100644 --- a/lib/dns/zone_parser.go +++ b/lib/dns/zone_parser.go @@ -523,7 +523,7 @@ func (m *zoneParser) parseRR(prevRR *ResourceRecord, tok []byte) ( parseRRClass | parseRRType, parseRRTTL | parseRRClass | parseRRType: - if rr.Type == QueryTypeTXT { + if rr.Type == RecordTypeTXT { if !isTerm { orgtok = append(orgtok, c) } @@ -581,7 +581,7 @@ func (m *zoneParser) parseRRClass(rr *ResourceRecord, stok string) bool { // return false. // func (m *zoneParser) parseRRType(rr *ResourceRecord, stok string) bool { - for k, v := range QueryTypes { + for k, v := range RecordTypes { if stok == k { rr.Type = v return true @@ -592,37 +592,37 @@ func (m *zoneParser) parseRRType(rr *ResourceRecord, stok string) bool { func (m *zoneParser) parseRRData(rr *ResourceRecord, tok []byte) (err error) { switch rr.Type { - case QueryTypeA, QueryTypeAAAA: + case RecordTypeA, RecordTypeAAAA: rr.Value = string(tok) - case QueryTypeNS, QueryTypeCNAME, QueryTypeMB, QueryTypeMG, QueryTypeMR, QueryTypePTR: + case RecordTypeNS, RecordTypeCNAME, RecordTypeMB, RecordTypeMG, RecordTypeMR, RecordTypePTR: rr.Value = m.generateDomainName(tok) - case QueryTypeSOA: + case RecordTypeSOA: err = m.parseSOA(rr, tok) // NULL RRs are not allowed in zone files. - case QueryTypeNULL: + case RecordTypeNULL: err = fmt.Errorf("line %d: NULL type is not allowed", m.lineno) // In zone files, both ports and protocols are expressed using // mnemonics or decimal numbers. - case QueryTypeWKS: + case RecordTypeWKS: // TODO(ms) - case QueryTypeHINFO: + case RecordTypeHINFO: err = m.parseHInfo(rr, tok) - case QueryTypeMINFO: + case RecordTypeMINFO: err = m.parseMInfo(rr, tok) - case QueryTypeMX: + case RecordTypeMX: err = m.parseMX(rr, tok) - case QueryTypeTXT: + case RecordTypeTXT: err = m.parseTXT(rr, tok) - case QueryTypeSRV: + case RecordTypeSRV: err = m.parseSRV(rr, tok) } diff --git a/lib/dns/zone_records.go b/lib/dns/zone_records.go index c7a28e1d..02a138c2 100644 --- a/lib/dns/zone_records.go +++ b/lib/dns/zone_records.go @@ -20,9 +20,9 @@ func (zr zoneRecords) add(rr *ResourceRecord) { // Replace the RR if its type is SOA because only one SOA // should exist per domain name. - if rr.Type == QueryTypeSOA { + if rr.Type == RecordTypeSOA { for x, in := range listRR { - if in.Type != QueryTypeSOA { + if in.Type != RecordTypeSOA { continue } listRR[x] = rr diff --git a/lib/dns/zone_records_test.go b/lib/dns/zone_records_test.go index dc4ca22c..a705544e 100644 --- a/lib/dns/zone_records_test.go +++ b/lib/dns/zone_records_test.go @@ -15,29 +15,29 @@ func testGenerateZoneRecords() (zoneRR zoneRecords, listRR []*ResourceRecord) { listRR = []*ResourceRecord{{ Name: "test", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, Value: "127.0.0.1", TTL: 1, }, { Name: "test", - Type: QueryTypeSOA, + Type: RecordTypeSOA, Class: QueryClassIN, Value: &RDataSOA{}, TTL: 2, }, { Name: "test", - Type: QueryTypeMX, + Type: RecordTypeMX, Class: QueryClassIN, TTL: 3, }, { Name: "test", - Type: QueryTypeSOA, + Type: RecordTypeSOA, Class: QueryClassIN, TTL: 4, }, { Name: "test", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassCH, TTL: 5, }} @@ -75,7 +75,7 @@ func TestZoneRecords_remove(t *testing.T) { // With different value. rr: &ResourceRecord{ Name: "test", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassIN, Value: "127.0.0.2", }, @@ -85,7 +85,7 @@ func TestZoneRecords_remove(t *testing.T) { // With different Class. rr: &ResourceRecord{ Name: "test", - Type: QueryTypeA, + Type: RecordTypeA, Class: QueryClassCH, Value: "127.0.0.1", }, |
