Doesnt work yet
This commit is contained in:
parent
ea180d5051
commit
fd12b8a946
20
TODO
20
TODO
|
@ -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
|
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
102
server_test.go
102
server_test.go
|
@ -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"
|
|
||||||
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)
|
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
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
Loading…
Reference in New Issue