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:
* 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

View File

@ -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 {

View File

@ -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
}
*/