|
|
@@ -80,6 +80,8 @@ func runTestMakeResolveParameters() error {
|
|
|
"DNSResolverProtocolTransformProbability": 1.0,
|
|
|
"DNSResolverProtocolTransformSpecs": transforms.Specs{transformName: exampleTransform},
|
|
|
"DNSResolverProtocolTransformScopedSpecNames": transforms.ScopedSpecNames{preferredAlternateDNSServer: []string{transformName}},
|
|
|
+ "DNSResolverQNameRandomizeCasingProbability": 1.0,
|
|
|
+ "DNSResolverQNameMustMatchProbability": 1.0,
|
|
|
"DNSResolverIncludeEDNS0Probability": 1.0,
|
|
|
}
|
|
|
|
|
|
@@ -132,7 +134,7 @@ func runTestMakeResolveParameters() error {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // Test: Preferred/Transform/EDNS(0)
|
|
|
+ // Test: Preferred/Transform/RandomQNameCasing/QNameMustMatch/EDNS(0)
|
|
|
|
|
|
paramValues["DNSResolverPreresolvedIPAddressProbability"] = 0.0
|
|
|
|
|
|
@@ -157,6 +159,8 @@ func runTestMakeResolveParameters() error {
|
|
|
resolverParams.PreferAlternateDNSServer != true ||
|
|
|
resolverParams.ProtocolTransformName != transformName ||
|
|
|
resolverParams.ProtocolTransformSpec == nil ||
|
|
|
+ resolverParams.RandomQNameCasingSeed == nil ||
|
|
|
+ resolverParams.ResponseQNameMustMatch != true ||
|
|
|
resolverParams.IncludeEDNS0 != true {
|
|
|
return errors.Tracef("unexpected resolver parameters: %+v", resolverParams)
|
|
|
}
|
|
|
@@ -165,6 +169,8 @@ func runTestMakeResolveParameters() error {
|
|
|
|
|
|
paramValues["DNSResolverPreferAlternateServerProbability"] = 0.0
|
|
|
paramValues["DNSResolverProtocolTransformProbability"] = 0.0
|
|
|
+ paramValues["DNSResolverQNameRandomizeCasingProbability"] = 0.0
|
|
|
+ paramValues["DNSResolverQNameMustMatchProbability"] = 0.0
|
|
|
paramValues["DNSResolverIncludeEDNS0Probability"] = 0.0
|
|
|
|
|
|
_, err = params.Set("", 0, paramValues)
|
|
|
@@ -188,6 +194,8 @@ func runTestMakeResolveParameters() error {
|
|
|
resolverParams.PreferAlternateDNSServer != false ||
|
|
|
resolverParams.ProtocolTransformName != "" ||
|
|
|
resolverParams.ProtocolTransformSpec != nil ||
|
|
|
+ resolverParams.RandomQNameCasingSeed != nil ||
|
|
|
+ resolverParams.ResponseQNameMustMatch != false ||
|
|
|
resolverParams.IncludeEDNS0 != false {
|
|
|
return errors.Tracef("unexpected resolver parameters: %+v", resolverParams)
|
|
|
}
|
|
|
@@ -198,14 +206,14 @@ func runTestMakeResolveParameters() error {
|
|
|
func runTestResolver() error {
|
|
|
|
|
|
// noResponseServer will not respond to requests
|
|
|
- noResponseServer, err := newTestDNSServer(false, false, false)
|
|
|
+ noResponseServer, err := newTestDNSServer(false, false, false, false)
|
|
|
if err != nil {
|
|
|
return errors.Trace(err)
|
|
|
}
|
|
|
defer noResponseServer.stop()
|
|
|
|
|
|
// invalidIPServer will respond with an invalid IP
|
|
|
- invalidIPServer, err := newTestDNSServer(true, false, false)
|
|
|
+ invalidIPServer, err := newTestDNSServer(true, false, false, false)
|
|
|
if err != nil {
|
|
|
return errors.Trace(err)
|
|
|
}
|
|
|
@@ -213,7 +221,7 @@ func runTestResolver() error {
|
|
|
|
|
|
// okServer will respond to correct requests (expected domain) with the
|
|
|
// correct response (expected IPv4 or IPv6 address)
|
|
|
- okServer, err := newTestDNSServer(true, true, false)
|
|
|
+ okServer, err := newTestDNSServer(true, true, false, false)
|
|
|
if err != nil {
|
|
|
return errors.Trace(err)
|
|
|
}
|
|
|
@@ -221,7 +229,7 @@ func runTestResolver() error {
|
|
|
|
|
|
// alternateOkServer behaves like okServer; getRequestCount is used to
|
|
|
// confirm that the alternate server was indeed used
|
|
|
- alternateOkServer, err := newTestDNSServer(true, true, false)
|
|
|
+ alternateOkServer, err := newTestDNSServer(true, true, false, false)
|
|
|
if err != nil {
|
|
|
return errors.Trace(err)
|
|
|
}
|
|
|
@@ -230,12 +238,18 @@ func runTestResolver() error {
|
|
|
// transformOkServer behaves like okServer but only responds if the
|
|
|
// transform was applied; other servers do not respond if the transform
|
|
|
// is applied
|
|
|
- transformOkServer, err := newTestDNSServer(true, true, true)
|
|
|
+ transformOkServer, err := newTestDNSServer(true, true, true, false)
|
|
|
if err != nil {
|
|
|
return errors.Trace(err)
|
|
|
}
|
|
|
defer transformOkServer.stop()
|
|
|
|
|
|
+ randomQNameCasingOkServer, err := newTestDNSServer(true, true, false, true)
|
|
|
+ if err != nil {
|
|
|
+ return errors.Trace(err)
|
|
|
+ }
|
|
|
+ defer randomQNameCasingOkServer.stop()
|
|
|
+
|
|
|
servers := []string{noResponseServer.getAddr(), invalidIPServer.getAddr(), okServer.getAddr()}
|
|
|
|
|
|
networkConfig := &NetworkConfig{
|
|
|
@@ -529,6 +543,7 @@ func runTestResolver() error {
|
|
|
|
|
|
resolver.cache.Flush()
|
|
|
|
|
|
+ params.AttemptsPerServer = 0
|
|
|
params.AlternateDNSServer = transformOkServer.getAddr()
|
|
|
params.PreferAlternateDNSServer = true
|
|
|
|
|
|
@@ -555,12 +570,52 @@ func runTestResolver() error {
|
|
|
return errors.TraceNew("unexpected transform server request count")
|
|
|
}
|
|
|
|
|
|
+ params.AttemptsPerServer = 1
|
|
|
params.AlternateDNSServer = ""
|
|
|
params.PreferAlternateDNSServer = false
|
|
|
params.ProtocolTransformName = ""
|
|
|
params.ProtocolTransformSpec = nil
|
|
|
params.ProtocolTransformSeed = nil
|
|
|
|
|
|
+ // Test: random QName casing
|
|
|
+
|
|
|
+ if randomQNameCasingOkServer.getRequestCount() != 0 {
|
|
|
+ return errors.TraceNew("unexpected random QName casing server request count")
|
|
|
+ }
|
|
|
+
|
|
|
+ resolver.cache.Flush()
|
|
|
+
|
|
|
+ params.AttemptsPerServer = 0
|
|
|
+ params.AlternateDNSServer = randomQNameCasingOkServer.getAddr()
|
|
|
+ params.PreferAlternateDNSServer = true
|
|
|
+ params.RandomQNameCasingSeed = seed
|
|
|
+
|
|
|
+ params.ResponseQNameMustMatch = true
|
|
|
+ _, err = resolver.ResolveIP(ctx, networkID, params, exampleDomain)
|
|
|
+ if err == nil {
|
|
|
+ errors.TraceNew("unexpected success")
|
|
|
+ }
|
|
|
+
|
|
|
+ params.ResponseQNameMustMatch = false
|
|
|
+ IPs, err = resolver.ResolveIP(ctx, networkID, params, exampleDomain)
|
|
|
+ if err == nil {
|
|
|
+ errors.TraceNew("unexpected success")
|
|
|
+ }
|
|
|
+
|
|
|
+ err = checkResult(IPs)
|
|
|
+ if err != nil {
|
|
|
+ return errors.Trace(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ if randomQNameCasingOkServer.getRequestCount() < 1 {
|
|
|
+ return errors.TraceNew("unexpected random QName casing server request count")
|
|
|
+ }
|
|
|
+
|
|
|
+ params.AttemptsPerServer = 1
|
|
|
+ params.AlternateDNSServer = ""
|
|
|
+ params.PreferAlternateDNSServer = false
|
|
|
+ params.RandomQNameCasingSeed = nil
|
|
|
+
|
|
|
// Test: EDNS(0)
|
|
|
|
|
|
resolver.cache.Flush()
|
|
|
@@ -741,15 +796,16 @@ const (
|
|
|
var exampleTransform = transforms.Spec{[2]string{"^([a-f0-9]{4})0100", "\\$\\{1\\}0140"}}
|
|
|
|
|
|
type testDNSServer struct {
|
|
|
- respond bool
|
|
|
- validResponse bool
|
|
|
- expectTransform bool
|
|
|
- addr string
|
|
|
- requestCount int32
|
|
|
- server *dns.Server
|
|
|
+ respond bool
|
|
|
+ validResponse bool
|
|
|
+ expectTransform bool
|
|
|
+ expectRandomQNameCasing bool
|
|
|
+ addr string
|
|
|
+ requestCount int32
|
|
|
+ server *dns.Server
|
|
|
}
|
|
|
|
|
|
-func newTestDNSServer(respond, validResponse, expectTransform bool) (*testDNSServer, error) {
|
|
|
+func newTestDNSServer(respond, validResponse, expectTransform, expectRandomQNameCasing bool) (*testDNSServer, error) {
|
|
|
|
|
|
udpAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:0")
|
|
|
if err != nil {
|
|
|
@@ -762,10 +818,11 @@ func newTestDNSServer(respond, validResponse, expectTransform bool) (*testDNSSer
|
|
|
}
|
|
|
|
|
|
s := &testDNSServer{
|
|
|
- respond: respond,
|
|
|
- validResponse: validResponse,
|
|
|
- expectTransform: expectTransform,
|
|
|
- addr: udpConn.LocalAddr().String(),
|
|
|
+ respond: respond,
|
|
|
+ validResponse: validResponse,
|
|
|
+ expectTransform: expectTransform,
|
|
|
+ expectRandomQNameCasing: expectRandomQNameCasing,
|
|
|
+ addr: udpConn.LocalAddr().String(),
|
|
|
}
|
|
|
|
|
|
server := &dns.Server{
|
|
|
@@ -792,7 +849,9 @@ func (s *testDNSServer) ServeDNS(w dns.ResponseWriter, r *dns.Msg) {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- if len(r.Question) != 1 || r.Question[0].Name != dns.Fqdn(exampleDomain) {
|
|
|
+ if len(r.Question) != 1 ||
|
|
|
+ (!s.expectRandomQNameCasing &&
|
|
|
+ r.Question[0].Name != dns.Fqdn(exampleDomain)) {
|
|
|
return
|
|
|
}
|
|
|
|