Doesnt work yet

This commit is contained in:
Miek Gieben 2011-02-08 21:49:37 +01:00
parent ea180d5051
commit fd12b8a946
3 changed files with 37 additions and 92 deletions

20
TODO
View File

@ -1,25 +1,12 @@
Todo: 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 * wildcards, in sig gen, sig checking
* Private key file parsing use io.Reader (or the like) * Private key file parsing use io.Reader (or the like) - NewReader, NewWriter?
- NewReader, NewWriter?
* IP6 testing - in resolver and also in responder code * IP6 testing - in resolver and also in responder code
extend Responder interface with ipv6? extend Responder interface with ipv6?
* Test impl of nameserver, with a small zone, 1 KSK and online signing * Test impl of nameserver, with a small zone, 1 KSK and online signing
* NSEC and nsec3 closest encloser helper functions * NSEC and nsec3 closest encloser helper functions
* Tsig generation for replies (request MAC) * Tsig generation for replies (request MAC)
* pack/Unpack smaller * pack/Unpack smaller. EDNS 'n stuff can be folded in
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
Longer term: Longer term:
* Parsing from strings, going with goyacc and own lexer * Parsing from strings, going with goyacc and own lexer
@ -41,6 +28,3 @@ Funkensturm:
* use exp/eval - to inteprete the config file?? * use exp/eval - to inteprete the config file??
* TCP how to handle stuff like AXFR * TCP how to handle stuff like AXFR
* use package log * use package log
log packet

View File

@ -27,6 +27,11 @@ import (
"net" "net"
) )
type Server struct {
// timeout and other stuff
Timeout int
}
// Every nameserver implements the Hander interface. It defines // Every nameserver implements the Hander interface. It defines
// the kind of nameserver // the kind of nameserver
type Handler interface { type Handler interface {

View File

@ -1,30 +1,27 @@
package responder package dns
import ( import (
"os"
"testing" "testing"
"fmt"
"dns"
"net" "net"
"time" "time"
) )
type myserv Server type server Server
func createpkg(id uint16, tcp bool, remove net.Addr) []byte { func createpkg(id uint16, tcp bool, remove net.Addr) []byte {
m := new(dns.Msg) m := new(Msg)
m.MsgHdr.Id = id m.MsgHdr.Id = id
m.MsgHdr.Authoritative = true m.MsgHdr.Authoritative = true
m.MsgHdr.AuthenticatedData = false m.MsgHdr.AuthenticatedData = false
m.MsgHdr.RecursionAvailable = true m.MsgHdr.RecursionAvailable = true
m.MsgHdr.Response = true m.MsgHdr.Response = true
m.MsgHdr.Opcode = dns.OpcodeQuery m.MsgHdr.Opcode = OpcodeQuery
m.MsgHdr.Rcode = dns.RcodeSuccess m.MsgHdr.Rcode = RcodeSuccess
m.Question = make([]dns.Question, 1) m.Question = make([]Question, 1)
m.Question[0] = dns.Question{"miek.nl.", dns.TypeTXT, dns.ClassINET} m.Question[0] = Question{"miek.nl.", TypeTXT, ClassINET}
m.Answer = make([]dns.RR, 1) m.Answer = make([]RR, 1)
t := new(dns.RR_TXT) t := new(RR_TXT)
t.Hdr = dns.RR_Header{Name: "miek.nl.", Rrtype: dns.TypeTXT, Class: dns.ClassINET, Ttl: 3600} t.Hdr = RR_Header{Name: "miek.nl.", Rrtype: TypeTXT, Class: ClassINET, Ttl: 3600}
if tcp { if tcp {
t.Txt = "Dit is iets anders TCP" t.Txt = "Dit is iets anders TCP"
} else { } else {
@ -35,8 +32,8 @@ func createpkg(id uint16, tcp bool, remove net.Addr) []byte {
return out return out
} }
func (s *myserv) ResponderUDP(c *net.UDPConn, a net.Addr, in []byte) { func (h *server) ServeUDP(c *net.UDPConn, a net.Addr, in []byte) {
inmsg := new(dns.Msg) inmsg := new(Msg)
inmsg.Unpack(in) inmsg.Unpack(in)
if inmsg.MsgHdr.Response == true { if inmsg.MsgHdr.Response == true {
// Uh... answering to an response?? // 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) out := createpkg(inmsg.MsgHdr.Id, false, a)
SendUDP(out, c, 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) { func (h *server) ServeTCP(c *net.TCPConn, in []byte) {
inmsg := new(dns.Msg) inmsg := new(Msg)
inmsg.Unpack(in) inmsg.Unpack(in)
if inmsg.MsgHdr.Response == true { if inmsg.MsgHdr.Response == true {
// Uh... answering to an response??
// dont think so
return return
} }
out := createpkg(inmsg.MsgHdr.Id, true, c.RemoteAddr()) 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) { func TestResponder(t *testing.T) {
/* udp servertje */ var h server
su := new(Server) go ListenAndServeTCP("127.0.0.1:8053", h.(Handler))
su.Address = "127.0.0.1" go ListenAndServeUDP("127.0.0.1:8053", h.(Handler))
su.Port = "8053" time.Sleep(1 * 1e9)
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
} }
/* /*
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 type servtsig Server
func createpkgtsig(id uint16, tcp bool, remove net.Addr) []byte { func createpkgtsig(id uint16, tcp bool, remove net.Addr) []byte {
m := new(dns.Msg) m := new(Msg)
m.MsgHdr.Id = id m.MsgHdr.Id = id
m.MsgHdr.Authoritative = true m.MsgHdr.Authoritative = true
m.MsgHdr.AuthenticatedData = false m.MsgHdr.AuthenticatedData = false
m.MsgHdr.RecursionAvailable = true m.MsgHdr.RecursionAvailable = true
m.MsgHdr.Response = true m.MsgHdr.Response = true
m.MsgHdr.Opcode = dns.OpcodeQuery m.MsgHdr.Opcode = OpcodeQuery
m.MsgHdr.Rcode = dns.RcodeSuccess m.MsgHdr.Rcode = RcodeSuccess
m.Question = make([]dns.Question, 1) m.Question = make([]Question, 1)
m.Question[0] = dns.Question{"miek.nl.", dns.TypeTXT, dns.ClassINET} m.Question[0] = Question{"miek.nl.", TypeTXT, ClassINET}
m.Answer = make([]dns.RR, 1) m.Answer = make([]RR, 1)
t := new(dns.RR_TXT) t := new(RR_TXT)
t.Hdr = dns.RR_Header{Name: "miek.nl.", Rrtype: dns.TypeTXT, Class: dns.ClassINET, Ttl: 3600} t.Hdr = RR_Header{Name: "miek.nl.", Rrtype: TypeTXT, Class: ClassINET, Ttl: 3600}
if tcp { if tcp {
t.Txt = "Dit is iets anders TCP" t.Txt = "Dit is iets anders TCP"
} else { } 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) { func (s *servtsig) ResponderUDP(c *net.UDPConn, a net.Addr, in []byte) {
inmsg := new(dns.Msg) inmsg := new(Msg)
inmsg.Unpack(in) inmsg.Unpack(in)
fmt.Printf("%v\n", inmsg) fmt.Printf("%v\n", inmsg)
if inmsg.MsgHdr.Response == true { 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] rr := inmsg.Extra[len(inmsg.Extra)-1]
switch t := rr.(type) { switch t := rr.(type) {
case *dns.RR_TSIG: case *RR_TSIG:
v := t.Verify(inmsg, "awwLOtRfpGE+rRKF2+DEiw==") v := t.Verify(inmsg, "awwLOtRfpGE+rRKF2+DEiw==")
println(v) 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) { func (s *servtsig) ResponderTCP(c *net.TCPConn, in []byte) {
inmsg := new(dns.Msg) inmsg := new(Msg)
inmsg.Unpack(in) inmsg.Unpack(in)
if inmsg.MsgHdr.Response == true { if inmsg.MsgHdr.Response == true {
// Uh... answering to an response?? // Uh... answering to an response??
@ -167,7 +124,6 @@ func (s *servtsig) ResponderTCP(c *net.TCPConn, in []byte) {
} }
func TestResponderTsig(t *testing.T) { func TestResponderTsig(t *testing.T) {
/* udp servertje */
su := new(Server) su := new(Server)
su.Address = "127.0.0.1" su.Address = "127.0.0.1"
su.Port = "8053" su.Port = "8053"
@ -175,7 +131,6 @@ func TestResponderTsig(t *testing.T) {
uch := make(chan os.Error) uch := make(chan os.Error)
go su.NewResponder(us, uch) go su.NewResponder(us, uch)
/* tcp servertje */
st := new(Server) st := new(Server)
st.Address = "127.0.0.1" st.Address = "127.0.0.1"
st.Port = "8053" st.Port = "8053"
@ -187,3 +142,4 @@ func TestResponderTsig(t *testing.T) {
uch <- nil uch <- nil
tch <- nil tch <- nil
} }
*/