main
c8b91bc ยท 4 months ago 7 commits
 1package handlers
 2
 3import (
 4	"dnsense/dns"
 5	"strings"
 6)
 7
 8func baseResponse(req *dns.Message) *dns.Message {
 9	resp := &dns.Message{}
10	resp.Header = req.Header
11	resp.Header.SetResponse()
12	resp.Header.SetAA()
13	resp.Header.Flags &^= (1 << 5) // clear AD bit
14	resp.Header.ARCount = 0
15	resp.Questions = req.Questions
16	return resp
17}
18
19func errorResponse(req *dns.Message, msg string) *dns.Message {
20	resp := baseResponse(req)
21
22	rr, err := dns.NewTXTRecord(req.Questions[0].Name, 30, "error: "+msg)
23	if err != nil {
24		return resp
25	}
26
27	resp.Answers = append(resp.Answers, *rr)
28	return resp
29}
30
31func Route(req *dns.Message) *dns.Message {
32	if len(req.Questions) == 0 {
33		return errorResponse(req, "no question")
34	}
35
36	q := req.Questions[0]
37
38	if q.Type != dns.TypeTXT {
39		return errorResponse(req, "only TXT queries supported")
40	}
41
42	name := strings.TrimSuffix(q.Name, ".")
43	labels := strings.SplitN(name, ".", 3)
44
45	if len(labels) < 2 {
46		return errorResponse(req, "format: <command>.<input>")
47	}
48
49	command := strings.ToLower(labels[0])
50	input := strings.ReplaceAll(labels[1], "-", " ")
51
52	return handleCMD(req, command, input)
53}