-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtype.go
121 lines (113 loc) · 2.03 KB
/
type.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package main
import (
"log"
"strings"
"github.com/miekg/dns"
)
type TypeHandler interface {
FillRecords(req *dns.Msg, records []DNSRecord) *dns.Msg
CheckRecord(record *DNSRecord) error
RRToRecord(rr dns.RR) DNSRecord
}
var TypeHandlerList = map[uint16]TypeHandler{
dns.TypeA: &AHandler{},
dns.TypeAAAA: &AAAAHandler{},
dns.TypeNS: &NSHandler{},
dns.TypeCNAME: &CNAMEHandler{},
dns.TypeTXT: &TXTHandler{},
dns.TypeCAA: &CAAHandler{},
dns.TypeSVCB: &SVCBHandler{},
dns.TypeSOA: &SoaHandler{},
dns.TypeMX: &MxHandler{},
dns.TypePTR: &PtrHandler{},
}
func CommonCheck(r *DNSRecord) error {
if r.Name == "" {
log.Println("bad record name:", r.Name)
return ErrBadName
}
if r.Name[len(r.Name)-1] != '.' {
r.Name = r.Name + "."
}
if r.Ttl > 600 || r.Ttl < 1 {
log.Println("bad ttl:", r.Ttl)
return ErrBadTTL
}
return nil
}
func GoodName(name string) bool {
if len(name) < 1 || len(name) > 255 {
log.Println("bad name:", len(name), name)
return false
}
name = strings.ToLower(name)
validMap := map[rune]bool{
'a': true,
'b': true,
'c': true,
'd': true,
'e': true,
'f': true,
'g': true,
'h': true,
'i': true,
'j': true,
'k': true,
'l': true,
'm': true,
'n': true,
'o': true,
'p': true,
'q': true,
'r': true,
's': true,
't': true,
'u': true,
'v': true,
'w': true,
'x': true,
'y': true,
'z': true,
'-': true,
'.': true,
}
for _, n := range name {
_, ok := validMap[n]
if !ok {
return false
}
}
return true
}
func AppendDot(name string) string {
if name[len(name)-1] != '.' {
name = name + "."
}
return name
}
func TypeStrToInt(tp string) uint16 {
tp = strings.ToUpper(tp)
switch tp {
case "A":
return dns.TypeA
case "AAAA":
return dns.TypeAAAA
case "NS":
return dns.TypeNS
case "CNAME":
return dns.TypeCNAME
case "TXT":
return dns.TypeTXT
case "CAA":
return dns.TypeCAA
case "SVCB":
return dns.TypeSVCB
case "SOA":
return dns.TypeSOA
case "MX":
return dns.TypeMX
case "PTR":
return dns.TypePTR
}
return dns.TypeNone
}