Skip to content

Commit

Permalink
add tests for ipv4 fall through
Browse files Browse the repository at this point in the history
  • Loading branch information
bluejekyll committed May 17, 2018
1 parent 8df6acf commit d027b0c
Show file tree
Hide file tree
Showing 3 changed files with 180 additions and 21 deletions.
37 changes: 20 additions & 17 deletions integration-tests/src/authority.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use std::collections::BTreeMap;
use std::str::FromStr;

use trust_dns::rr::*;

Expand Down Expand Up @@ -97,14 +98,7 @@ pub fn create_example() -> Authority {
.set_rr_type(RecordType::AAAA)
.set_dns_class(DNSClass::IN)
.set_rdata(RData::AAAA(Ipv6Addr::new(
0x2606,
0x2800,
0x220,
0x1,
0x248,
0x1893,
0x25c8,
0x1946,
0x2606, 0x2800, 0x220, 0x1, 0x248, 0x1893, 0x25c8, 0x1946,
)))
.clone(),
0,
Expand Down Expand Up @@ -159,14 +153,7 @@ pub fn create_example() -> Authority {
.set_rr_type(RecordType::AAAA)
.set_dns_class(DNSClass::IN)
.set_rdata(RData::AAAA(Ipv6Addr::new(
0x2606,
0x2800,
0x220,
0x1,
0x248,
0x1893,
0x25c8,
0x1946,
0x2606, 0x2800, 0x220, 0x1, 0x248, 0x1893, 0x25c8, 0x1946,
)))
.clone(),
0,
Expand All @@ -178,6 +165,17 @@ pub fn create_example() -> Authority {
// www.example.com. 86400 IN RRSIG AAAA 8 3 86400 20150914082216 20150824191224 54108 example.com. kje4FKE+7d/j4OzWQelcKkePq6DxCRY/5btAiUcZNf+zVNlHK+o57h1r Y76ZviWChQB8Np2TjA1DrXGi/kHr2KKE60H5822mFZ2b9O+sgW4q6o3G kO2E1CQxbYe+nI1Z8lVfjdCNm81zfvYqDjo2/tGqagehxG1V9MBZO6br 4KKdoa4=
// www.example.com. 86400 IN RRSIG A 8 3 86400 20150915023456 20150824191224 54108 example.com. cWtw0nMvcXcYNnxejB3Le3KBfoPPQZLmbaJ8ybdmzBDefQOm1ZjZZMOP wHEIxzdjRhG9mLt1mpyo1H7OezKTGX+mDtskcECTl/+jB/YSZyvbwRxj e88Lrg4D+D2MiajQn3XSWf+6LQVe1J67gdbKTXezvux0tRxBNHHqWXRk pxCILes=

records.upsert(
Record::new()
.set_name(Name::from_str("1.2.3.4.example.com.").unwrap())
.set_ttl(86400)
.set_rr_type(RecordType::A)
.set_dns_class(DNSClass::IN)
.set_rdata(RData::A(Ipv4Addr::new(198, 51, 100, 35)))
.clone(),
0,
);

return records;
}

Expand All @@ -191,7 +189,12 @@ pub fn create_secure_example() -> Authority {
let rsa = Rsa::generate(2048).unwrap();
let key = KeyPair::from_rsa(rsa).unwrap();
let dnskey = key.to_dnskey(Algorithm::RSASHA256).unwrap();
let signer = Signer::dnssec(dnskey, key, authority.origin().clone().into(), Duration::weeks(1));
let signer = Signer::dnssec(
dnskey,
key,
authority.origin().clone().into(),
Duration::weeks(1),
);

authority.add_secure_key(signer);
authority.secure_zone();
Expand Down
68 changes: 68 additions & 0 deletions integration-tests/tests/lookup_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,74 @@ fn test_lookup_hosts() {
assert_eq!(lookup.iter().next().unwrap(), Ipv4Addr::new(10, 0, 1, 104));
}

#[test]
fn test_lookup_ipv4_like() {
let authority = create_example();
let mut catalog = Catalog::new();
catalog.upsert(authority.origin().clone().into(), authority);

let mut io_loop = Runtime::new().unwrap();
let (stream, sender) = TestClientStream::new(Arc::new(Mutex::new(catalog)));
let client = future::lazy(|| {
future::ok(DnsFuture::new(
stream,
Box::new(sender),
NoopMessageFinalizer::new(),
))
});

let lookup = client.and_then(|client| {
LookupIpFuture::lookup(
vec![Name::from_str("1.2.3.4.example.com.").unwrap()],
LookupIpStrategy::default(),
CachingClient::new(0, client),
Default::default(),
Some(Arc::new(Hosts::default())),
Some(RData::A(Ipv4Addr::new(1, 2, 3, 4))),
)
});
let lookup = io_loop.block_on(lookup).unwrap();

assert_eq!(
lookup.iter().next().unwrap(),
Ipv4Addr::new(198, 51, 100, 35)
);
}

#[test]
fn test_lookup_ipv4_like_fall_through() {
let authority = create_example();
let mut catalog = Catalog::new();
catalog.upsert(authority.origin().clone().into(), authority);

let mut io_loop = Runtime::new().unwrap();
let (stream, sender) = TestClientStream::new(Arc::new(Mutex::new(catalog)));
let client = future::lazy(|| {
future::ok(DnsFuture::new(
stream,
Box::new(sender),
NoopMessageFinalizer::new(),
))
});

let lookup = client.and_then(|client| {
LookupIpFuture::lookup(
vec![Name::from_str("198.51.100.35.example.com.").unwrap()],
LookupIpStrategy::default(),
CachingClient::new(0, client),
Default::default(),
Some(Arc::new(Hosts::default())),
Some(RData::A(Ipv4Addr::new(198, 51, 100, 35))),
)
});
let lookup = io_loop.block_on(lookup).unwrap();

assert_eq!(
lookup.iter().next().unwrap(),
Ipv4Addr::new(198, 51, 100, 35)
);
}

#[test]
fn test_mock_lookup() {
let resp_query = Query::query(Name::from_str("www.example.com.").unwrap(), RecordType::A);
Expand Down
96 changes: 92 additions & 4 deletions resolver/src/resolver_future.rs
Original file line number Diff line number Diff line change
Expand Up @@ -265,8 +265,10 @@ impl ResolverFuture {
// if host is a ip address, return directly.
if let Some(ip_addr) = host.try_parse_ip() {
// if ndots are greater than 4, then we can't assume the name is an IpAddr
// this accepts IPv6 as well, b/c IPv6 can take the form: 2001:db8::198.51.100.35
// but `:` is not a valid DNS character, so techinically this will fail parsing.
// TODO: should we always do search before returning this?
if self.options.ndots > 4 && ip_addr.to_ip_addr().map_or(false, |ip| ip.is_ipv4()) {
if self.options.ndots > 4 {
finally_ip_addr = Some(ip_addr);
} else {
return LookupIpFuture::ok(
Expand All @@ -276,9 +278,16 @@ impl ResolverFuture {
}
}

let name = match host.into_name() {
Ok(name) => name,
Err(err) => {
let name = match (host.into_name(), finally_ip_addr.as_ref()) {
(Ok(name), _) => name,
(Err(_), Some(ip_addr)) => {
// it was a valid IP, return that...
return LookupIpFuture::ok(
self.client_cache.clone(),
Lookup::new_with_max_ttl(Arc::new(vec![ip_addr.clone()])),
);
}
(Err(err), None) => {
return LookupIpFuture::error(self.client_cache.clone(), err);
}
};
Expand All @@ -289,6 +298,7 @@ impl ResolverFuture {
} else {
None
};

LookupIpFuture::lookup(
names,
self.options.ip_strategy,
Expand Down Expand Up @@ -791,4 +801,82 @@ mod tests {
IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1,))
);
}

#[test]
fn test_search_ipv4_large_ndots() {
let mut io_loop = Runtime::new().unwrap();
let mut config = ResolverConfig::default();
config.add_search(Name::from_str("example.com").unwrap());

let resolver = ResolverFuture::new(
config,
ResolverOpts {
ip_strategy: LookupIpStrategy::Ipv4Only,
ndots: 5,
..ResolverOpts::default()
},
);

let response = io_loop
.block_on(resolver.and_then(|resolver| resolver.lookup_ip("198.51.100.35")))
.expect("failed to run lookup");

let mut iter = response.iter();
assert_eq!(
iter.next().expect("no rdatas"),
IpAddr::V4(Ipv4Addr::new(198, 51, 100, 35))
);
}

#[test]
fn test_search_ipv6_large_ndots() {
let mut io_loop = Runtime::new().unwrap();
let mut config = ResolverConfig::default();
config.add_search(Name::from_str("example.com").unwrap());

let resolver = ResolverFuture::new(
config,
ResolverOpts {
ip_strategy: LookupIpStrategy::Ipv4Only,
ndots: 5,
..ResolverOpts::default()
},
);

let response = io_loop
.block_on(resolver.and_then(|resolver| resolver.lookup_ip("2001:db8::c633:6423")))
.expect("failed to run lookup");

let mut iter = response.iter();
assert_eq!(
iter.next().expect("no rdatas"),
IpAddr::V6(Ipv6Addr::new(0x2001, 0xdb8, 0, 0, 0, 0, 0xc633, 0x6423))
);
}

#[test]
fn test_search_ipv6_name_parse_fails() {
let mut io_loop = Runtime::new().unwrap();
let mut config = ResolverConfig::default();
config.add_search(Name::from_str("example.com").unwrap());

let resolver = ResolverFuture::new(
config,
ResolverOpts {
ip_strategy: LookupIpStrategy::Ipv4Only,
ndots: 5,
..ResolverOpts::default()
},
);

let response = io_loop
.block_on(resolver.and_then(|resolver| resolver.lookup_ip("2001:db8::198.51.100.35")))
.expect("failed to run lookup");

let mut iter = response.iter();
assert_eq!(
iter.next().expect("no rdatas"),
IpAddr::V6(Ipv6Addr::new(0x2001, 0xdb8, 0, 0, 0, 0, 0xc633, 0x6423))
);
}
}

0 comments on commit d027b0c

Please sign in to comment.