|
@@ -34,9 +34,34 @@ func serve(w dns.ResponseWriter, req *dns.Msg, z *Zone) {
|
|
|
|
|
|
label := getQuestionName(z, req)
|
|
label := getQuestionName(z, req)
|
|
|
|
|
|
|
|
+ var ip string
|
|
|
|
+ var edns *dns.EDNS0_SUBNET
|
|
|
|
+ var opt_rr *dns.RR_OPT
|
|
|
|
+
|
|
|
|
+ for _, extra := range req.Extra {
|
|
|
|
+ log.Println("Extra", extra)
|
|
|
|
+ for _, o := range extra.(*dns.RR_OPT).Option {
|
|
|
|
+ opt_rr = extra.(*dns.RR_OPT)
|
|
|
|
+ switch e := o.(type) {
|
|
|
|
+ case *dns.EDNS0_NSID:
|
|
|
|
+ // do stuff with e.Nsid
|
|
|
|
+ case *dns.EDNS0_SUBNET:
|
|
|
|
+ log.Println("========== XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")
|
|
|
|
+ log.Println("Got edns", e.Address, e.Family, e.SourceNetmask, e.SourceScope)
|
|
|
|
+ if e.Address != nil {
|
|
|
|
+ log.Println("Setting edns to", e)
|
|
|
|
+ edns = e
|
|
|
|
+ ip = e.Address.String()
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
var country string
|
|
var country string
|
|
if geoIP != nil {
|
|
if geoIP != nil {
|
|
- ip, _, _ := net.SplitHostPort(w.RemoteAddr().String())
|
|
|
|
|
|
+ if len(ip) == 0 { // no edns subnet
|
|
|
|
+ ip, _, _ = net.SplitHostPort(w.RemoteAddr().String())
|
|
|
|
+ }
|
|
country = strings.ToLower(geoIP.GetCountry(ip))
|
|
country = strings.ToLower(geoIP.GetCountry(ip))
|
|
logPrintln("Country:", ip, country)
|
|
logPrintln("Country:", ip, country)
|
|
}
|
|
}
|
|
@@ -48,6 +73,14 @@ func serve(w dns.ResponseWriter, req *dns.Msg, z *Zone) {
|
|
}
|
|
}
|
|
m.Authoritative = true
|
|
m.Authoritative = true
|
|
|
|
|
|
|
|
+ // TODO: set scope to 0 if there are no alternate responses
|
|
|
|
+ log.Println("family", edns.Family)
|
|
|
|
+ if edns.Family != 0 {
|
|
|
|
+ log.Println("edns response!")
|
|
|
|
+ edns.SourceScope = 16
|
|
|
|
+ m.Extra = append(m.Extra, opt_rr)
|
|
|
|
+ }
|
|
|
|
+
|
|
// TODO(ask) Fix the findLabels API to make this work better
|
|
// TODO(ask) Fix the findLabels API to make this work better
|
|
if alias := z.findLabels(label, "", dns.TypeMF); alias != nil &&
|
|
if alias := z.findLabels(label, "", dns.TypeMF); alias != nil &&
|
|
alias.Records[dns.TypeMF] != nil {
|
|
alias.Records[dns.TypeMF] != nil {
|
|
@@ -72,6 +105,7 @@ func serve(w dns.ResponseWriter, req *dns.Msg, z *Zone) {
|
|
m.Answer = []dns.RR{&dns.TXT{Hdr: h,
|
|
m.Answer = []dns.RR{&dns.TXT{Hdr: h,
|
|
Txt: []string{
|
|
Txt: []string{
|
|
w.RemoteAddr().String(),
|
|
w.RemoteAddr().String(),
|
|
|
|
+ ip,
|
|
string(country),
|
|
string(country),
|
|
string(countries.CountryContinent[country]),
|
|
string(countries.CountryContinent[country]),
|
|
},
|
|
},
|