From fd12b8a9464f3ce35389b3a48a2ae752bc8220c6 Mon Sep 17 00:00:00 2001 From: Miek Gieben Date: Tue, 8 Feb 2011 21:49:37 +0100 Subject: [PATCH] Doesnt work yet --- TODO | 20 +--------- server.go | 5 +++ server_test.go | 104 ++++++++++++++----------------------------------- 3 files changed, 37 insertions(+), 92 deletions(-) diff --git a/TODO b/TODO index 00a2e2bc..b478d984 100644 --- a/TODO +++ b/TODO @@ -1,25 +1,12 @@ Todo: -* responder rework, like the http package http.Handler - responder.HandlerTCP -* os.Error in Pack()/Unpack() or Log??? - again look at http * wildcards, in sig gen, sig checking -* Private key file parsing use io.Reader (or the like) - - NewReader, NewWriter? +* Private key file parsing use io.Reader (or the like) - NewReader, NewWriter? * IP6 testing - in resolver and also in responder code extend Responder interface with ipv6? * Test impl of nameserver, with a small zone, 1 KSK and online signing * NSEC and nsec3 closest encloser helper functions * Tsig generation for replies (request MAC) -* pack/Unpack smaller - -From http package: - -func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) -HandleFunc registers the handler function for the given pattern -in the DefaultServeMux. - -func ListenAndServe(addr string, handler Handler) os.Error - +* pack/Unpack smaller. EDNS 'n stuff can be folded in Longer term: * Parsing from strings, going with goyacc and own lexer @@ -41,6 +28,3 @@ Funkensturm: * use exp/eval - to inteprete the config file?? * TCP how to handle stuff like AXFR * use package log - -log packet - diff --git a/server.go b/server.go index 8e7992f6..63cf4d00 100644 --- a/server.go +++ b/server.go @@ -27,6 +27,11 @@ import ( "net" ) +type Server struct { + // timeout and other stuff + Timeout int +} + // Every nameserver implements the Hander interface. It defines // the kind of nameserver type Handler interface { diff --git a/server_test.go b/server_test.go index d6d076f9..e9c051f0 100644 --- a/server_test.go +++ b/server_test.go @@ -1,30 +1,27 @@ -package responder +package dns import ( - "os" "testing" - "fmt" - "dns" "net" "time" ) -type myserv Server +type server Server func createpkg(id uint16, tcp bool, remove net.Addr) []byte { - m := new(dns.Msg) + m := new(Msg) m.MsgHdr.Id = id m.MsgHdr.Authoritative = true m.MsgHdr.AuthenticatedData = false m.MsgHdr.RecursionAvailable = true m.MsgHdr.Response = true - m.MsgHdr.Opcode = dns.OpcodeQuery - m.MsgHdr.Rcode = dns.RcodeSuccess - m.Question = make([]dns.Question, 1) - m.Question[0] = dns.Question{"miek.nl.", dns.TypeTXT, dns.ClassINET} - m.Answer = make([]dns.RR, 1) - t := new(dns.RR_TXT) - t.Hdr = dns.RR_Header{Name: "miek.nl.", Rrtype: dns.TypeTXT, Class: dns.ClassINET, Ttl: 3600} + m.MsgHdr.Opcode = OpcodeQuery + m.MsgHdr.Rcode = RcodeSuccess + m.Question = make([]Question, 1) + m.Question[0] = Question{"miek.nl.", TypeTXT, ClassINET} + m.Answer = make([]RR, 1) + t := new(RR_TXT) + t.Hdr = RR_Header{Name: "miek.nl.", Rrtype: TypeTXT, Class: ClassINET, Ttl: 3600} if tcp { t.Txt = "Dit is iets anders TCP" } else { @@ -35,8 +32,8 @@ func createpkg(id uint16, tcp bool, remove net.Addr) []byte { return out } -func (s *myserv) ResponderUDP(c *net.UDPConn, a net.Addr, in []byte) { - inmsg := new(dns.Msg) +func (h *server) ServeUDP(c *net.UDPConn, a net.Addr, in []byte) { + inmsg := new(Msg) inmsg.Unpack(in) if inmsg.MsgHdr.Response == true { // Uh... answering to an response?? @@ -45,16 +42,12 @@ func (s *myserv) ResponderUDP(c *net.UDPConn, a net.Addr, in []byte) { } out := createpkg(inmsg.MsgHdr.Id, false, a) SendUDP(out, c, a) - // Meta.QLen/RLen/QueryStart/QueryEnd can be filled in at - // this point for logging purposses or anything else } -func (s *myserv) ResponderTCP(c *net.TCPConn, in []byte) { - inmsg := new(dns.Msg) +func (h *server) ServeTCP(c *net.TCPConn, in []byte) { + inmsg := new(Msg) inmsg.Unpack(in) if inmsg.MsgHdr.Response == true { - // Uh... answering to an response?? - // dont think so return } out := createpkg(inmsg.MsgHdr.Id, true, c.RemoteAddr()) @@ -62,65 +55,29 @@ func (s *myserv) ResponderTCP(c *net.TCPConn, in []byte) { } func TestResponder(t *testing.T) { - /* udp servertje */ - su := new(Server) - su.Address = "127.0.0.1" - su.Port = "8053" - var us *myserv - uch := make(chan os.Error) - go su.NewResponder(us, uch) - - /* tcp servertje */ - st := new(Server) - st.Address = "127.0.0.1" - st.Port = "8053" - st.Tcp = true - var ts *myserv - tch := make(chan os.Error) - go st.NewResponder(ts, tch) - time.Sleep(1 * 1e9) - uch <- nil - tch <- nil + var h server + go ListenAndServeTCP("127.0.0.1:8053", h.(Handler)) + go ListenAndServeUDP("127.0.0.1:8053", h.(Handler)) + time.Sleep(1 * 1e9) } /* -func TestReflectorResponder(t *testing.T) { - stop := make(chan os.Error) - s := new(Server) - s.Port = "8053" - s.Address = "127.0.0.1" - - stoptcp := make(chan os.Error) - stcp := new(Server) - stcp.Port = "8053" - stcp.Address = "127.0.0.1" - stcp.Tcp = true - - go stcp.NewResponder(Reflector, stoptcp) - go s.NewResponder(Reflector, stop) - - time.Sleep(1 * 1e9) - stop <- nil - stoptcp <- nil -} -*/ - type servtsig Server func createpkgtsig(id uint16, tcp bool, remove net.Addr) []byte { - m := new(dns.Msg) + m := new(Msg) m.MsgHdr.Id = id m.MsgHdr.Authoritative = true m.MsgHdr.AuthenticatedData = false m.MsgHdr.RecursionAvailable = true m.MsgHdr.Response = true - m.MsgHdr.Opcode = dns.OpcodeQuery - m.MsgHdr.Rcode = dns.RcodeSuccess - m.Question = make([]dns.Question, 1) - m.Question[0] = dns.Question{"miek.nl.", dns.TypeTXT, dns.ClassINET} - m.Answer = make([]dns.RR, 1) - t := new(dns.RR_TXT) - t.Hdr = dns.RR_Header{Name: "miek.nl.", Rrtype: dns.TypeTXT, Class: dns.ClassINET, Ttl: 3600} + m.MsgHdr.Opcode = OpcodeQuery + m.MsgHdr.Rcode = RcodeSuccess + m.Question = make([]Question, 1) + m.Question[0] = Question{"miek.nl.", TypeTXT, ClassINET} + m.Answer = make([]RR, 1) + t := new(RR_TXT) + t.Hdr = RR_Header{Name: "miek.nl.", Rrtype: TypeTXT, Class: ClassINET, Ttl: 3600} if tcp { t.Txt = "Dit is iets anders TCP" } else { @@ -132,7 +89,7 @@ func createpkgtsig(id uint16, tcp bool, remove net.Addr) []byte { } func (s *servtsig) ResponderUDP(c *net.UDPConn, a net.Addr, in []byte) { - inmsg := new(dns.Msg) + inmsg := new(Msg) inmsg.Unpack(in) fmt.Printf("%v\n", inmsg) if inmsg.MsgHdr.Response == true { @@ -142,7 +99,7 @@ func (s *servtsig) ResponderUDP(c *net.UDPConn, a net.Addr, in []byte) { } rr := inmsg.Extra[len(inmsg.Extra)-1] switch t := rr.(type) { - case *dns.RR_TSIG: + case *RR_TSIG: v := t.Verify(inmsg, "awwLOtRfpGE+rRKF2+DEiw==") println(v) } @@ -155,7 +112,7 @@ func (s *servtsig) ResponderUDP(c *net.UDPConn, a net.Addr, in []byte) { } func (s *servtsig) ResponderTCP(c *net.TCPConn, in []byte) { - inmsg := new(dns.Msg) + inmsg := new(Msg) inmsg.Unpack(in) if inmsg.MsgHdr.Response == true { // Uh... answering to an response?? @@ -167,7 +124,6 @@ func (s *servtsig) ResponderTCP(c *net.TCPConn, in []byte) { } func TestResponderTsig(t *testing.T) { - /* udp servertje */ su := new(Server) su.Address = "127.0.0.1" su.Port = "8053" @@ -175,7 +131,6 @@ func TestResponderTsig(t *testing.T) { uch := make(chan os.Error) go su.NewResponder(us, uch) - /* tcp servertje */ st := new(Server) st.Address = "127.0.0.1" st.Port = "8053" @@ -187,3 +142,4 @@ func TestResponderTsig(t *testing.T) { uch <- nil tch <- nil } +*/