Skip to content

Commit

Permalink
real test good
Browse files Browse the repository at this point in the history
  • Loading branch information
SeanZH committed Apr 30, 2021
1 parent 63c6dd5 commit d86f364
Show file tree
Hide file tree
Showing 12 changed files with 90 additions and 14 deletions.
11 changes: 10 additions & 1 deletion .idea/workspace.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions api.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ type ApiHandler struct {
BadRecordValue []byte
DBErrMsg []byte
BadMethodMsg []byte
TypeConflictMsg []byte
}

func NewApiHandler(conf *MongoClientConfig) *ApiHandler {
Expand Down Expand Up @@ -67,6 +68,10 @@ func NewApiHandler(conf *MongoClientConfig) *ApiHandler {
ret.Msg = "bad method"
bmMsg, _ := json.Marshal(ret)
a.BadMethodMsg = bmMsg
ret.Code = 6
ret.Msg = "type conflict"
tcMsg, _ := json.Marshal(ret)
a.TypeConflictMsg = tcMsg
return &a
}

Expand Down
17 changes: 17 additions & 0 deletions api_add.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ import (
"log"
"net/http"

"github.com/miekg/dns"
"go.mongodb.org/mongo-driver/bson"

"go.mongodb.org/mongo-driver/bson/primitive"
)

Expand Down Expand Up @@ -41,6 +44,20 @@ func (a *ApiHandler) AddRecord(w http.ResponseWriter, r *http.Request) {
log.Println("check record:", err)
return
}
conflictList := []uint16{dns.TypeNS, dns.TypeCNAME}
for _, tp := range conflictList {
// more than one ns records does not conflicts
if tp == dns.TypeNS && record.Type == dns.TypeNS {
continue
}
var ret []DNSRecord
err := a.DB.Find(bson.M{"name": record.Name, "type": tp}, &ret)
if err == nil && len(ret) > 0 {
log.Println("conflict", dns.Type(record.Type), "with", dns.Type(tp))
w.Write(a.TypeConflictMsg)
return
}
}
record.Id = primitive.NewObjectID()
err = a.DB.Insert(record)
if err != nil {
Expand Down
6 changes: 5 additions & 1 deletion api_list.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,14 @@ func (a *ApiHandler) ListRecord(w http.ResponseWriter, r *http.Request) {
var ret []DNSRecord
err = a.DB.Find(bson.M{"name": record.Name, "type": record.Type}, &ret)
if err != nil {
log.Println("insert error:", err)
log.Println("find error:", err)
w.Write(a.DBErrMsg)
return
}
// empty result, make an empty slice
if len(ret) == 0 {
ret = make([]DNSRecord, 0)
}
bt, _ := json.Marshal(ret)
w.Write(bt)
}
6 changes: 3 additions & 3 deletions caa.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ func (cca *CAAHandler) FillRecords(req *dns.Msg, records []DNSRecord) *dns.Msg {
rr[idx].Hdr.Rrtype = dns.TypeCAA
rr[idx].Hdr.Class = dns.ClassINET
rr[idx].Hdr.Ttl = record.Ttl
rr[idx].Value = record.Caa
rr[idx].Tag = record.Tag
rr[idx].Flag = record.Flag
rr[idx].Value = record.CAAValue
rr[idx].Tag = record.CAATag
rr[idx].Flag = record.CAAFlag
m.Answer = append(m.Answer, &rr[idx])
}
return m
Expand Down
1 change: 1 addition & 0 deletions cname.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,6 @@ func (c *CNAMEHandler) CheckRecord(record *DNSRecord) error {
log.Println("bad cname:", record.Cname)
return ErrBadValue
}
record.Cname = AppendDot(record.Cname)
return nil
}
21 changes: 19 additions & 2 deletions dns.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,31 @@ func (h *Handler) ServeDNS(w dns.ResponseWriter, r *dns.Msg) {
w.WriteMsg(h.ServFailMsg)
return
}
w.WriteMsg(msg)
err = w.WriteMsg(msg)
if err != nil {
log.Println("write msg error:", msg, err)
}
}

func (h *Handler) GetRecord(req *dns.Msg) (*dns.Msg, error) {
name := req.Question[0].Name
tp := dns.Type(req.Question[0].Qtype)
log.Println("name and type:", name, tp)
records, err := h.M.FindRecords(ReadRecordArgs{Name: name, Type: uint16(tp)})
// find cname first
records, err := h.M.FindRecords(ReadRecordArgs{Name: name, Type: dns.TypeCNAME})
if err == nil && len(records) > 0 {
log.Println("cname found, return")
msg := TypeHandlerList[dns.TypeCNAME].FillRecords(req, records)
return msg, nil
}
// then ns
records, err = h.M.FindRecords(ReadRecordArgs{Name: name, Type: dns.TypeNS})
if err == nil && len(records) > 0 {
log.Println("ns found, return")
msg := TypeHandlerList[dns.TypeNS].FillRecords(req, records)
return msg, nil
}
records, err = h.M.FindRecords(ReadRecordArgs{Name: name, Type: uint16(tp)})
if err != nil {
log.Println("find records error:", name, tp, err)
return nil, err
Expand Down
22 changes: 18 additions & 4 deletions doc.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,22 @@
package dnslite

// add AAAA record
// curl -X POST -d '{"name":"ipv6.xn--e1t.co", "type":28, "ttl":100, "value":"2001:470:23:976::2"}' http://127.0.0.1:8085/api/add.record
// curl -X POST -d '{"name":"dilfish.dev", "type":28, "ttl":100, "value":"2001:470:23:976::2"}' http://127.0.0.1:8085/api/add.record
// add A record
// curl -X POST -d '{"name":"dilfish.dev", "type":1, "ttl":100, "a":"1.1.1.1"}' http://127.0.0.1:8085/api/add.record
// add TXT record
// curl -X POST -d '{"name":"dilfish.dev", "type":16, "ttl":100, "txt":"abcde"}' http://127.0.0.1:8085/api/add.record
// add CNAME record
// curl -X POST -d '{"name":"dilfish.dev", "type":5, "ttl":100, "cname":"abcde.com"}' http://127.0.0.1:8085/api/add.record
// add NS record
// curl -X POST -d '{"name":"www.dilfish.dev", "type":2, "ttl":100, "ns":"abcde.com"}' http://127.0.0.1:8085/api/add.record
// add CAA record
// curl -X POST -d '{"name":"www.dilfish.dev", "type":257, "ttl":100, "caaTag":"issue", "caaFlag":1, "caaValue":"111"}' http://127.0.0.1:8085/api/add.record
// add SVCB record
// curl -X POST -d '{"name":"svcb.dilfish.dev","type":64, "svcbAlpn":{"Alpn":["a","b"]},"svcbIPv6Hint":{"Hint":["1::1"]},"svcbIPv4Hint":{"Hint":["1.1.1.1"]},"ttl":100,"svcbPriority":1,"svcbTarget":"dilfish.dev"}' http://127.0.0.1:8085/api/add.record

// get record list
// curl http://127.0.0.1:8085/api/list.record
// del aaaa record
// curl -X POST -d '{"name":"ipv6.xn--e1t.co", "type":28, "value":"2001:470:23:976::2"}' http://127.0.0.1:8085/api/del.record
// curl -X POST -d '{"name":"dilfish.dev","type":1}' http://127.0.0.1:8085/api/list.record

// del a record
// curl -X POST -d '{"_id":"608bde64726e4acc0e806d0a"}' http://127.0.0.1:8085/api/del.record
1 change: 1 addition & 0 deletions ns.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,5 +32,6 @@ func (ns *NSHandler) CheckRecord(record *DNSRecord) error {
log.Println("bad ns value:", record.Ns)
return ErrBadValue
}
record.Ns = AppendDot(record.Ns)
return nil
}
6 changes: 3 additions & 3 deletions record.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ type DNSRecord struct {
Ns string `json:"ns,omitempty" bson:"ns,omitempty"`
Cname string `json:"cname,omitempty" bson:"cname,omitempty"`
Txt string `json:"txt,omitempty" bson:"txt,omitempty"`
Caa string `json:"caa,omitempty" bson:"caa,omitempty"`
Tag string `json:"tag,omitempty" bson:"tag,omitempty"`
Flag uint8 `json:"flag,omitempty" bson:"flag,omitempty"`
CAATag string `json:"caaTag,omitempty" bson:"caaTag,omitempty"`
CAAFlag uint8 `json:"CaaFlag,omitempty" bson:"caaFlag,omitempty"`
CAAValue string `json:"caaValue,omitempty" bson:"caaValue,omitempty"`
Code int `json:"code,omitempty" bson:"code,omitempty"`
Msg string `json:"msg,omitempty" bson:"msg,omitempty"`
SVCBTarget string `json:"svcbTarget,omitempty" bson:"svcbTarget,omitempty"`
Expand Down
1 change: 1 addition & 0 deletions svcb.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,5 +56,6 @@ func (svcb *SVCBHandler) CheckRecord(record *DNSRecord) error {
log.Println("bad svcb target")
return ErrBadValue
}
record.SVCBTarget = AppendDot(record.SVCBTarget)
return nil
}
7 changes: 7 additions & 0 deletions type.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,3 +81,10 @@ func GoodName(name string) bool {
}
return true
}

func AppendDot(name string) string {
if name[len(name)-1] != '.' {
name = name + "."
}
return name
}

0 comments on commit d86f364

Please sign in to comment.