preparing to use hijack
This commit is contained in:
parent
3da4bc6bf3
commit
9e318901a6
|
@ -76,6 +76,22 @@ func handleReflect(w dns.ResponseWriter, r *dns.Msg) {
|
||||||
t.Txt = []string{str}
|
t.Txt = []string{str}
|
||||||
|
|
||||||
switch r.Question[0].Qtype {
|
switch r.Question[0].Qtype {
|
||||||
|
case dns.TypeAXFR:
|
||||||
|
c := make(chan *dns.XfrToken)
|
||||||
|
var e *error
|
||||||
|
if err := dns.XfrSend(w, r, c, e); err != nil {
|
||||||
|
close(c)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
soa, _ := dns.NewRR(`miek.nl. IN SOA elektron.atoom.net. miekg.atoom.net. (
|
||||||
|
2009032802
|
||||||
|
21600
|
||||||
|
7200
|
||||||
|
604800
|
||||||
|
3600)`)
|
||||||
|
c <- &dns.XfrToken{RR: []dns.RR{soa, t, rr, soa}}
|
||||||
|
close(c)
|
||||||
|
return
|
||||||
case dns.TypeTXT:
|
case dns.TypeTXT:
|
||||||
m.Answer = append(m.Answer, t)
|
m.Answer = append(m.Answer, t)
|
||||||
m.Extra = append(m.Extra, rr)
|
m.Extra = append(m.Extra, rr)
|
||||||
|
|
33
server.go
33
server.go
|
@ -26,6 +26,8 @@ type ResponseWriter interface {
|
||||||
Write(*Msg) error
|
Write(*Msg) error
|
||||||
// WriteBuf writes a raw buffer back to the client.
|
// WriteBuf writes a raw buffer back to the client.
|
||||||
WriteBuf([]byte) error
|
WriteBuf([]byte) error
|
||||||
|
// Close closes the connection.
|
||||||
|
Close() error
|
||||||
// TsigStatus returns the status of the Tsig.
|
// TsigStatus returns the status of the Tsig.
|
||||||
TsigStatus() error
|
TsigStatus() error
|
||||||
// TsigTimersOnly sets the tsig timers only boolean.
|
// TsigTimersOnly sets the tsig timers only boolean.
|
||||||
|
@ -303,18 +305,6 @@ func newConn(t *net.TCPConn, u *net.UDPConn, a net.Addr, buf []byte, handler Han
|
||||||
return c, nil
|
return c, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close the connection.
|
|
||||||
func (c *conn) close() {
|
|
||||||
switch {
|
|
||||||
case c._UDP != nil:
|
|
||||||
c._UDP.Close()
|
|
||||||
c._UDP = nil
|
|
||||||
case c._TCP != nil:
|
|
||||||
c._TCP.Close()
|
|
||||||
c._TCP = nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Serve a new connection.
|
// Serve a new connection.
|
||||||
func (c *conn) serve() {
|
func (c *conn) serve() {
|
||||||
// for block to make it easy to break out to close the tcp connection
|
// for block to make it easy to break out to close the tcp connection
|
||||||
|
@ -349,7 +339,8 @@ func (c *conn) serve() {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if c._TCP != nil {
|
if c._TCP != nil {
|
||||||
c.close() // Listen and Serve is closed then
|
c._TCP.Close()
|
||||||
|
c._TCP = nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -425,3 +416,19 @@ func (w *response) TsigStatus() error { return w.tsigStatus }
|
||||||
|
|
||||||
// TsigTimersOnly implements the ResponseWriter.TsigTimersOnly method.
|
// TsigTimersOnly implements the ResponseWriter.TsigTimersOnly method.
|
||||||
func (w *response) TsigTimersOnly(b bool) { w.tsigTimersOnly = b }
|
func (w *response) TsigTimersOnly(b bool) { w.tsigTimersOnly = b }
|
||||||
|
|
||||||
|
// Close implements the ResponseWriter.Close method
|
||||||
|
func (w *response) Close() error {
|
||||||
|
if w.conn._UDP != nil {
|
||||||
|
e := w.conn._UDP.Close()
|
||||||
|
w.conn._UDP = nil
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
if w.conn._TCP != nil {
|
||||||
|
e := w.conn._TCP.Close()
|
||||||
|
w.conn._TCP = nil
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
// no-op
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
10
xfr.go
10
xfr.go
|
@ -145,7 +145,7 @@ func checkXfrSOA(in *Msg, first bool) bool {
|
||||||
|
|
||||||
// XfrSend performs an outgoing [AI]xfr depending on the request message. The
|
// XfrSend performs an outgoing [AI]xfr depending on the request message. The
|
||||||
// caller is responsible for sending the correct sequence of RR sets through
|
// caller is responsible for sending the correct sequence of RR sets through
|
||||||
// the channel c.
|
// the channel c. For reasons of symmetry XfrToken is re-used.
|
||||||
// Errors are signaled via the error pointer, when an error occurs the function
|
// Errors are signaled via the error pointer, when an error occurs the function
|
||||||
// sets the error and returns (it does not close the channel).
|
// sets the error and returns (it does not close the channel).
|
||||||
// TSIG and enveloping is handled by XfrSend.
|
// TSIG and enveloping is handled by XfrSend.
|
||||||
|
@ -157,7 +157,7 @@ func checkXfrSOA(in *Msg, first bool) bool {
|
||||||
// var e *error
|
// var e *error
|
||||||
// err := XfrSend(w, q, c, e)
|
// err := XfrSend(w, q, c, e)
|
||||||
// for _, rrset := range rrsets { // rrset is a []RR
|
// for _, rrset := range rrsets { // rrset is a []RR
|
||||||
// c <- rrset
|
// c <- &{XfrToken{RR: rrset}
|
||||||
// if e != nil {
|
// if e != nil {
|
||||||
// close(c)
|
// close(c)
|
||||||
// break
|
// break
|
||||||
|
@ -180,15 +180,17 @@ func axfrSend(w ResponseWriter, req *Msg, c chan *XfrToken, e *error) {
|
||||||
rep.SetReply(req)
|
rep.SetReply(req)
|
||||||
rep.MsgHdr.Authoritative = true
|
rep.MsgHdr.Authoritative = true
|
||||||
|
|
||||||
first := true
|
|
||||||
for x := range c {
|
for x := range c {
|
||||||
|
println("got some", len(x.RR))
|
||||||
// assume it fits
|
// assume it fits
|
||||||
rep.Answer = append(rep.Answer, x.RR...)
|
rep.Answer = append(rep.Answer, x.RR...)
|
||||||
|
println(rep.String())
|
||||||
if err := w.Write(rep); e != nil {
|
if err := w.Write(rep); e != nil {
|
||||||
*e = err
|
*e = err
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
w.TsigTimersOnly(first)
|
w.TsigTimersOnly(true)
|
||||||
rep.Answer = nil
|
rep.Answer = nil
|
||||||
}
|
}
|
||||||
|
w.Close() // Hijack
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue