diff --git a/README.md b/README.md index 34c594e1..1de72e41 100644 --- a/README.md +++ b/README.md @@ -70,8 +70,8 @@ let com_ns: NameServer; // for `com.` zone let nameservers_ns: NameServer; // for `nameservers.com.` zone nameservers_ns - .add(Record::a(root_ns.fqdn().clone(), root_ns.ipv4_addr())) - .add(Record::a(com_ns.fqdn().clone(), com_ns.ipv4_addr())); + .add(root_ns.a()) + .add(com_ns.a()); // each `NameServer` will start out with an A record of its FQDN to its own IPv4 address in its // zone file so NO need to add that one in the preceding statement diff --git a/packages/conformance-tests/src/resolver/dnssec/rfc4035/section_3/section_3_2.rs b/packages/conformance-tests/src/resolver/dnssec/rfc4035/section_3/section_3_2.rs index 7d2bd623..8d947214 100644 --- a/packages/conformance-tests/src/resolver/dnssec/rfc4035/section_3/section_3_2.rs +++ b/packages/conformance-tests/src/resolver/dnssec/rfc4035/section_3/section_3_2.rs @@ -5,7 +5,6 @@ use dns_test::{ name_server::NameServer, record::{Record, RecordType}, tshark::{Capture, Direction}, - zone_file::Root, Network, Resolver, Result, FQDN, }; @@ -16,8 +15,7 @@ fn do_bit_not_set_in_request() -> Result<()> { let ns = NameServer::new(&dns_test::PEER, FQDN::ROOT, network)? .sign()? .start()?; - let resolver = Resolver::new(network, Root::new(ns.fqdn().clone(), ns.ipv4_addr())) - .start(&dns_test::SUBJECT)?; + let resolver = Resolver::new(network, ns.root_hint()).start(&dns_test::SUBJECT)?; let mut tshark = resolver.eavesdrop()?; @@ -61,8 +59,7 @@ fn if_do_bit_not_set_in_request_then_requested_dnssec_record_is_not_stripped() - let ns = NameServer::new(&dns_test::PEER, FQDN::ROOT, network)? .sign()? .start()?; - let resolver = Resolver::new(network, Root::new(ns.fqdn().clone(), ns.ipv4_addr())) - .start(&dns_test::SUBJECT)?; + let resolver = Resolver::new(network, ns.root_hint()).start(&dns_test::SUBJECT)?; let client = Client::new(network)?; let settings = *DigSettings::default().recurse(); @@ -88,8 +85,7 @@ fn do_bit_set_in_request() -> Result<()> { let ns = NameServer::new(&dns_test::PEER, FQDN::ROOT, network)? .sign()? .start()?; - let resolver = Resolver::new(network, Root::new(ns.fqdn().clone(), ns.ipv4_addr())) - .start(&dns_test::SUBJECT)?; + let resolver = Resolver::new(network, ns.root_hint()).start(&dns_test::SUBJECT)?; let mut tshark = resolver.eavesdrop()?; diff --git a/packages/conformance-tests/src/resolver/dnssec/rfc4035/section_3/section_3_2/section_3_2_2.rs b/packages/conformance-tests/src/resolver/dnssec/rfc4035/section_3/section_3_2/section_3_2_2.rs index ce9b6ab5..13e13fa0 100644 --- a/packages/conformance-tests/src/resolver/dnssec/rfc4035/section_3/section_3_2/section_3_2_2.rs +++ b/packages/conformance-tests/src/resolver/dnssec/rfc4035/section_3/section_3_2/section_3_2_2.rs @@ -4,7 +4,6 @@ use dns_test::{ client::{Client, DigSettings}, name_server::NameServer, record::RecordType, - zone_file::Root, Network, Resolver, Result, FQDN, }; @@ -14,8 +13,7 @@ use crate::resolver::dnssec::fixtures; fn copies_cd_bit_from_query_to_response() -> Result<()> { let network = &Network::new()?; let ns = NameServer::new(&dns_test::PEER, FQDN::ROOT, network)?.start()?; - let resolver = Resolver::new(network, Root::new(ns.fqdn().clone(), ns.ipv4_addr())) - .start(&dns_test::SUBJECT)?; + let resolver = Resolver::new(network, ns.root_hint()).start(&dns_test::SUBJECT)?; let client = Client::new(network)?; let settings = *DigSettings::default().checking_disabled().recurse(); diff --git a/packages/conformance-tests/src/resolver/dnssec/rfc4035/section_4/section_4_1.rs b/packages/conformance-tests/src/resolver/dnssec/rfc4035/section_4/section_4_1.rs index 61244953..56c4d8da 100644 --- a/packages/conformance-tests/src/resolver/dnssec/rfc4035/section_4/section_4_1.rs +++ b/packages/conformance-tests/src/resolver/dnssec/rfc4035/section_4/section_4_1.rs @@ -2,7 +2,6 @@ use dns_test::client::{Client, DigSettings}; use dns_test::name_server::NameServer; use dns_test::record::RecordType; use dns_test::tshark::{Capture, Direction}; -use dns_test::zone_file::Root; use dns_test::{Network, Resolver, Result, FQDN}; #[test] @@ -10,8 +9,7 @@ use dns_test::{Network, Resolver, Result, FQDN}; fn edns_support() -> Result<()> { let network = &Network::new()?; let ns = NameServer::new(&dns_test::PEER, FQDN::ROOT, network)?.start()?; - let resolver = Resolver::new(network, Root::new(ns.fqdn().clone(), ns.ipv4_addr())) - .start(&dns_test::SUBJECT)?; + let resolver = Resolver::new(network, ns.root_hint()).start(&dns_test::SUBJECT)?; let mut tshark = resolver.eavesdrop()?; diff --git a/packages/conformance-tests/src/resolver/dnssec/scenarios/secure.rs b/packages/conformance-tests/src/resolver/dnssec/scenarios/secure.rs index 4f2d5579..7778d53e 100644 --- a/packages/conformance-tests/src/resolver/dnssec/scenarios/secure.rs +++ b/packages/conformance-tests/src/resolver/dnssec/scenarios/secure.rs @@ -2,8 +2,7 @@ use std::net::Ipv4Addr; use dns_test::client::{Client, DigSettings}; use dns_test::name_server::NameServer; -use dns_test::record::{Record, RecordType}; -use dns_test::zone_file::Root; +use dns_test::record::RecordType; use dns_test::{Network, Resolver, Result, TrustAnchor, FQDN}; use crate::resolver::dnssec::fixtures; @@ -14,7 +13,7 @@ use crate::resolver::dnssec::fixtures; fn can_validate_without_delegation() -> Result<()> { let network = Network::new()?; let mut ns = NameServer::new(&dns_test::PEER, FQDN::ROOT, &network)?; - ns.add(Record::a(ns.fqdn().clone(), ns.ipv4_addr())); + ns.add(ns.a()); let ns = ns.sign()?; let root_ksk = ns.key_signing_key().clone(); @@ -27,7 +26,7 @@ fn can_validate_without_delegation() -> Result<()> { eprintln!("root.zone:\n{}", ns.zone_file()); let trust_anchor = &TrustAnchor::from_iter([root_ksk.clone(), root_zsk.clone()]); - let resolver = Resolver::new(&network, Root::new(ns.fqdn().clone(), ns.ipv4_addr())) + let resolver = Resolver::new(&network, ns.root_hint()) .trust_anchor(trust_anchor) .start(&dns_test::SUBJECT)?; let resolver_addr = resolver.ipv4_addr(); diff --git a/packages/dns-test/examples/explore.rs b/packages/dns-test/examples/explore.rs index bc13d63a..f92dd4fc 100644 --- a/packages/dns-test/examples/explore.rs +++ b/packages/dns-test/examples/explore.rs @@ -4,8 +4,7 @@ use std::sync::mpsc; use dns_test::client::Client; use dns_test::name_server::NameServer; -use dns_test::record::{Record, RecordType}; -use dns_test::zone_file::Root; +use dns_test::record::RecordType; use dns_test::{Network, Resolver, Result, TrustAnchor, FQDN}; fn main() -> Result<()> { @@ -22,9 +21,7 @@ fn main() -> Result<()> { let mut com_ns = NameServer::new(peer, FQDN::COM, &network)?; let mut nameservers_ns = NameServer::new(peer, FQDN("nameservers.com.")?, &network)?; - nameservers_ns - .add(Record::a(root_ns.fqdn().clone(), root_ns.ipv4_addr())) - .add(Record::a(com_ns.fqdn().clone(), com_ns.ipv4_addr())); + nameservers_ns.add(root_ns.a()).add(com_ns.a()); let nameservers_ns = if args.dnssec { let nameservers_ns = nameservers_ns.sign()?; @@ -34,11 +31,7 @@ fn main() -> Result<()> { nameservers_ns.start()? }; - com_ns.referral( - nameservers_ns.zone().clone(), - nameservers_ns.fqdn().clone(), - nameservers_ns.ipv4_addr(), - ); + com_ns.referral_nameserver(&nameservers_ns); let com_ns = if args.dnssec { let com_ns = com_ns.sign()?; @@ -48,7 +41,7 @@ fn main() -> Result<()> { com_ns.start()? }; - root_ns.referral(FQDN::COM, com_ns.fqdn().clone(), com_ns.ipv4_addr()); + root_ns.referral_nameserver(&com_ns); let mut trust_anchor = TrustAnchor::empty(); let root_ns = if args.dnssec { @@ -80,12 +73,9 @@ fn main() -> Result<()> { } println!("building docker image..."); - let resolver = Resolver::new( - &network, - Root::new(root_ns.fqdn().clone(), root_ns.ipv4_addr()), - ) - .trust_anchor(&trust_anchor) - .start(&dns_test::SUBJECT)?; + let resolver = Resolver::new(&network, root_ns.root_hint()) + .trust_anchor(&trust_anchor) + .start(&dns_test::SUBJECT)?; println!("DONE\n\n"); let (tx, rx) = mpsc::channel(); diff --git a/packages/dns-test/src/name_server.rs b/packages/dns-test/src/name_server.rs index 32488f40..9ac28dc5 100644 --- a/packages/dns-test/src/name_server.rs +++ b/packages/dns-test/src/name_server.rs @@ -55,7 +55,7 @@ impl Graph { leaf.container.network(), )?; - leaf.add(Record::a(nameserver.fqdn().clone(), nameserver.ipv4_addr())); + leaf.add(nameserver.a()); nameservers.push(nameserver); zone = parent; @@ -71,11 +71,7 @@ impl Graph { unreachable!() }; - parent.referral( - child.zone().clone(), - child.fqdn().clone(), - child.ipv4_addr(), - ); + parent.referral_nameserver(child); } let root = nameservers.last().unwrap(); @@ -188,6 +184,15 @@ impl NameServer { self } + /// Adds a NS + A record pair to the zone file from another NameServer + pub fn referral_nameserver(&mut self, nameserver: &NameServer) -> &mut Self { + self.referral( + nameserver.zone().clone(), + nameserver.fqdn().clone(), + nameserver.ipv4_addr(), + ) + } + /// Adds a record to the name server's zone file pub fn add(&mut self, record: impl Into) -> &mut Self { self.zone_file.add(record); @@ -409,6 +414,16 @@ impl NameServer { pub fn fqdn(&self) -> &FQDN { &self.zone_file.soa.nameserver } + + /// Returns the [`Record::A`] record for this server. + pub fn a(&self) -> Record { + Record::a(self.fqdn().clone(), self.ipv4_addr()) + } + + /// Returns the [`Root`] hint for this server. + pub fn root_hint(&self) -> Root { + Root::new(self.fqdn().clone(), self.ipv4_addr()) + } } pub struct Stopped; diff --git a/packages/dns-test/src/resolver.rs b/packages/dns-test/src/resolver.rs index 4abf28f8..40352159 100644 --- a/packages/dns-test/src/resolver.rs +++ b/packages/dns-test/src/resolver.rs @@ -183,8 +183,7 @@ mod tests { fn terminate_unbound_works() -> Result<()> { let network = Network::new()?; let ns = NameServer::new(&Implementation::Unbound, FQDN::ROOT, &network)?.start()?; - let resolver = Resolver::new(&network, Root::new(ns.fqdn().clone(), ns.ipv4_addr())) - .start(&Implementation::Unbound)?; + let resolver = Resolver::new(&network, ns.root_hint()).start(&Implementation::Unbound)?; let logs = resolver.terminate()?; eprintln!("{logs}"); @@ -197,8 +196,7 @@ mod tests { fn terminate_bind_works() -> Result<()> { let network = Network::new()?; let ns = NameServer::new(&Implementation::Unbound, FQDN::ROOT, &network)?.start()?; - let resolver = Resolver::new(&network, Root::new(ns.fqdn().clone(), ns.ipv4_addr())) - .start(&Implementation::Bind)?; + let resolver = Resolver::new(&network, ns.root_hint()).start(&Implementation::Bind)?; let logs = resolver.terminate()?; eprintln!("{logs}"); @@ -211,10 +209,9 @@ mod tests { fn terminate_hickory_works() -> Result<()> { let network = Network::new()?; let ns = NameServer::new(&Implementation::Unbound, FQDN::ROOT, &network)?.start()?; - let resolver = Resolver::new(&network, Root::new(ns.fqdn().clone(), ns.ipv4_addr())) - .start(&Implementation::Hickory(Repository( - "https://github.com/hickory-dns/hickory-dns", - )))?; + let resolver = Resolver::new(&network, ns.root_hint()).start(&Implementation::Hickory( + Repository("https://github.com/hickory-dns/hickory-dns"), + ))?; let logs = resolver.terminate()?; // Hickory-DNS start sequence log has been consumed in `ResolverSettings.start`. diff --git a/packages/dns-test/src/tshark.rs b/packages/dns-test/src/tshark.rs index 1307f4f7..ba40a6cb 100644 --- a/packages/dns-test/src/tshark.rs +++ b/packages/dns-test/src/tshark.rs @@ -264,8 +264,7 @@ struct Ip { mod tests { use crate::client::{Client, DigSettings}; use crate::name_server::NameServer; - use crate::record::{Record, RecordType}; - use crate::zone_file::Root; + use crate::record::RecordType; use crate::{Implementation, Network, Resolver, FQDN}; use super::*; @@ -313,26 +312,17 @@ mod tests { let mut nameservers_ns = NameServer::new(&Implementation::Unbound, FQDN("nameservers.com.")?, network)?; - nameservers_ns - .add(Record::a(root_ns.fqdn().clone(), root_ns.ipv4_addr())) - .add(Record::a(com_ns.fqdn().clone(), com_ns.ipv4_addr())); + nameservers_ns.add(root_ns.a()).add(com_ns.a()); let nameservers_ns = nameservers_ns.start()?; - com_ns.referral( - nameservers_ns.zone().clone(), - nameservers_ns.fqdn().clone(), - nameservers_ns.ipv4_addr(), - ); + com_ns.referral_nameserver(&nameservers_ns); let com_ns = com_ns.start()?; - root_ns.referral(FQDN::COM, com_ns.fqdn().clone(), com_ns.ipv4_addr()); + root_ns.referral_nameserver(&com_ns); let root_ns = root_ns.start()?; - let resolver = Resolver::new( - network, - Root::new(root_ns.fqdn().clone(), root_ns.ipv4_addr()), - ) - .start(&Implementation::Unbound)?; + let resolver = + Resolver::new(network, root_ns.root_hint()).start(&Implementation::Unbound)?; let mut tshark = resolver.eavesdrop()?; let resolver_addr = resolver.ipv4_addr();