diff options
| author | Elizabeth <elizabeth@simponic.xyz> | 2024-04-02 16:26:39 -0600 |
|---|---|---|
| committer | Elizabeth <elizabeth@simponic.xyz> | 2024-04-02 16:26:39 -0600 |
| commit | bcdcc508ef4a0ae646937c91d0994a90bde719e1 (patch) | |
| tree | e5ee5aa97d2bb898428bb278973c16cc28aaa16a /dns | |
| parent | 657be669482462ada3b88672ff7497b652848176 (diff) | |
| download | hatecomputers.club-bcdcc508ef4a0ae646937c91d0994a90bde719e1.tar.gz hatecomputers.club-bcdcc508ef4a0ae646937c91d0994a90bde719e1.zip | |
add integration tests for dns server
Diffstat (limited to 'dns')
| -rw-r--r-- | dns/server.go | 113 |
1 files changed, 0 insertions, 113 deletions
diff --git a/dns/server.go b/dns/server.go deleted file mode 100644 index 9b3e5e9..0000000 --- a/dns/server.go +++ /dev/null @@ -1,113 +0,0 @@ -package dns - -import ( - "database/sql" - "fmt" - "git.hatecomputers.club/hatecomputers/hatecomputers.club/args" - "git.hatecomputers.club/hatecomputers/hatecomputers.club/database" - "github.com/miekg/dns" - "log" -) - -const MAX_RECURSION = 10 - -func resolveInternalCNAMEs(dbConn *sql.DB, domain string, qtype uint16, maxDepth int) ([]dns.RR, error) { - internalCnames, err := database.FindDNSRecords(dbConn, domain, "CNAME") - if err != nil { - return nil, err - } - - var answers []dns.RR - for _, record := range internalCnames { - cname, err := dns.NewRR(fmt.Sprintf("%s %d IN CNAME %s", record.Name, record.TTL, record.Content)) - if err != nil { - return nil, err - } - answers = append(answers, cname) - - cnameRecursive, err := resolveDNS(dbConn, record.Content, qtype, maxDepth-1) - if err != nil { - return nil, err - } - answers = append(answers, cnameRecursive...) - } - - qtypeName := dns.TypeToString[qtype] - if qtypeName == "" { - return nil, fmt.Errorf("invalid query type %d", qtype) - } - - typeDnsRecords, err := database.FindDNSRecords(dbConn, domain, qtypeName) - if err != nil { - return nil, err - } - for _, record := range typeDnsRecords { - answer, err := dns.NewRR(fmt.Sprintf("%s %d IN %s %s", record.Name, record.TTL, qtypeName, record.Content)) - if err != nil { - return nil, err - } - answers = append(answers, answer) - } - - return answers, nil -} - -func resolveDNS(dbConn *sql.DB, domain string, qtype uint16, maxDepth int) ([]dns.RR, error) { - if maxDepth == 0 { - return nil, fmt.Errorf("too much recursion") - } - - answers, err := resolveInternalCNAMEs(dbConn, domain, qtype, maxDepth) - if err != nil { - return nil, err - } - - if len(answers) > 0 { - return answers, nil - } - - return nil, fmt.Errorf("no records found for %s", domain) -} - -type DnsHandler struct { - DnsResolvers []string - DbConn *sql.DB -} - -func (h *DnsHandler) ServeDNS(w dns.ResponseWriter, r *dns.Msg) { - msg := new(dns.Msg) - msg.SetReply(r) - msg.Authoritative = true - - for _, question := range r.Question { - answers, err := resolveDNS(h.DbConn, question.Name, question.Qtype, MAX_RECURSION) - if err != nil { - fmt.Println(err) - continue - } - msg.Answer = append(msg.Answer, answers...) - } - - if len(msg.Answer) == 0 { - msg.SetRcode(r, dns.RcodeNameError) - } - - log.Println(msg.Answer) - w.WriteMsg(msg) -} - -func MakeServer(argv *args.Arguments, dbConn *sql.DB) *dns.Server { - handler := &DnsHandler{ - DnsResolvers: argv.DnsRecursion, - DbConn: dbConn, - } - addr := fmt.Sprintf(":%d", argv.DnsPort) - - return &dns.Server{ - Addr: addr, - Net: "udp", - Handler: handler, - UDPSize: 65535, - ReusePort: true, - } -} |
