public void TestMinimumConfigFile() { // The smallest file that you can get away with is an empty zone, which has just an SOA var config = ParseXML(@" <zone> <SOA name=""example.com"" class=""IN"" ttl=""7200"" primary-ns=""ns.example.com"" hostmaster=""admin.example.com"" serial=""0"" refresh=""3600"" retry=""60"" expire=""3600"" min-ttl=""60"" /> </zone> " ); var zone = DNSZone.Unserialize(config); Assert.That(zone.Relays, Is.Empty); Assert.That(zone.StartOfAuthority, Is.EqualTo( new DNSRecord( new Domain("example.com"), AddressClass.INTERNET, 7200, new SOAResource( new Domain("ns.example.com"), new Domain("admin.example.com"), 0, 3600, 60, 3600, 60)))); }
public void TestEmptyConfigFileFails() { // The empty configuration file is not valid, since it lacks a SOA var config = ParseXML("<zone></zone>"); Assert.Throws <InvalidDataException>(() => DNSZone.Unserialize(config)); }
public static void Main(string[] args) { if (args.Length != 3) { Console.WriteLine("Usage: dns-server <config-file> <ip-address> <port>"); Environment.Exit(1); } var config = new XmlDocument(); config.Load(args[0]); var zone = DNSZone.Unserialize(config); var clock = new StopwatchClock(); var cache = new ResolverCache(clock, 2048); var resolver = new StubResolver(cache, ResolverUtils.SendQuery); var query_exec = new QueryExecutor(zone, resolver, cache); var bind_addr = new IPEndPoint(IPAddress.Parse(args[1]), int.Parse(args[2])); var server = new UDPServer(bind_addr, query_exec); server.Start(); }
public void TestSOABadPrimaryNS() { var config = ParseXML(@" <zone> <SOA name=""example.com"" class=""IN"" ttl=""3600"" primary-ns=""....example.com"" hostmaster=""admin.example.com"" serial=""0"" refresh=""3600"" retry=""60"" expire=""3600"" min-ttl=""60"" /> </zone> " ); Assert.Throws <InvalidDataException>(() => DNSZone.Unserialize(config)); }
public void TestSOAMissingMinTTL() { var config = ParseXML(@" <zone> <SOA name=""example.com"" class=""IN"" ttl=""3600"" primary-ns=""ns.example.com"" hostmaster=""hostmaster.example.com"" refresh=""3600"" retry=""3600"" expire=""3600"" /> </zone> " ); Assert.Throws <InvalidDataException>(() => DNSZone.Unserialize(config)); }
public void TestHighTTLFails() { // TTLs are 32-bit numbers, so any TTL over 136 years doesn't work var config = ParseXML(@" <zone> <SOA name=""example.com"" class=""IN"" ttl=""9999999999"" primary-ns=""ns.example.com"" hostmaster=""admin.example.com"" serial=""0"" refresh=""3600"" retry=""60"" expire=""3600"" min-ttl=""60"" /> </zone> " ); Assert.Throws <InvalidDataException>(() => DNSZone.Unserialize(config)); }
public void TestMXGarbageMailserver() { var config = ParseXML(@" <zone> <SOA name=""example.com"" class=""IN"" ttl=""3600"" primary-ns=""ns.example.com"" hostmaster=""hostmaster.example.com"" refresh=""3600"" retry=""3600"" expire=""3600"" /> <MX name=""example.com"" class=""IN"" ttl=""3600"" priority=""1"" mailserver="".....example.com"" /> </zone> " ); Assert.Throws <InvalidDataException>(() => DNSZone.Unserialize(config)); }
public void TestRelayTooHighPort() { var config = ParseXML(@" <zone> <SOA name=""example.com"" class=""IN"" ttl=""7200"" primary-ns=""ns.example.com"" hostmaster=""admin.example.com"" serial=""0"" refresh=""3600"" retry=""60"" expire=""3600"" min-ttl=""60"" /> <relay address=""192.168.0.1"" port=""1000000"" /> </zone> " ); Assert.Throws <InvalidDataException>(() => DNSZone.Unserialize(config)); }
public void TestPTRMissingPointer() { var config = ParseXML(@" <zone> <SOA name=""example.com"" class=""IN"" ttl=""3600"" primary-ns=""ns.example.com"" hostmaster=""hostmaster.example.com"" refresh=""3600"" retry=""3600"" expire=""3600"" /> <PTR name=""1.0.168.192.in-addr.arpa"" class=""IN"" ttl=""3600"" /> </zone> " ); Assert.Throws <InvalidDataException>(() => DNSZone.Unserialize(config)); }
public void TestAIPv6Address() { var config = ParseXML(@" <zone> <SOA name=""example.com"" class=""IN"" ttl=""3600"" primary-ns=""ns.example.com"" hostmaster=""hostmaster.example.com"" refresh=""3600"" retry=""3600"" expire=""3600"" /> <A name=""example.com"" class=""IN"" ttl=""3600"" address=""2001:beef:cafe::1337"" /> </zone> " ); Assert.Throws <InvalidDataException>(() => DNSZone.Unserialize(config)); }
public void TestRelayGarbagePort() { // The smallest file that you can get away with is an empty zone, which has just an SOA var config = ParseXML(@" <zone> <SOA name=""example.com"" class=""IN"" ttl=""7200"" primary-ns=""ns.example.com"" hostmaster=""admin.example.com"" serial=""0"" refresh=""3600"" retry=""60"" expire=""3600"" min-ttl=""60"" /> <relay address=""192.168.0.1"" port=""blargh"" /> </zone> " ); Assert.Throws <InvalidDataException>(() => DNSZone.Unserialize(config)); }
public void TestMultipleSOAFails() { // Multiple SOA records are not allowed, since we currently don't support multiple zones var config = ParseXML(@" <zone> <SOA name=""example.com"" class=""IN"" ttl=""7200"" primary-ns=""ns.example.com"" hostmaster=""admin.example.com"" serial=""0"" refresh=""3600"" retry=""60"" expire=""3600"" min-ttl=""60"" /> <SOA name=""fabrikam.com"" class=""IN"" ttl=""7200"" primary-ns=""ns.example.com"" hostmaster=""admin.example.com"" serial=""0"" refresh=""3600"" retry=""60"" expire=""3600"" min-ttl=""60"" /> </zone> " ); Assert.Throws <InvalidDataException>(() => DNSZone.Unserialize(config)); }
public void TestConfigRelay() { var config = ParseXML(@" <zone> <SOA name=""example.com"" class=""IN"" ttl=""7200"" primary-ns=""ns.example.com"" hostmaster=""admin.example.com"" serial=""0"" refresh=""3600"" retry=""60"" expire=""3600"" min-ttl=""60"" /> <relay address=""192.168.0.1"" port=""53"" /> </zone> " ); var zone = DNSZone.Unserialize(config); var relays = new EndPoint[] { new IPEndPoint(IPAddress.Parse("192.168.0.1"), 53) }; Assert.That(zone.Relays, Is.EquivalentTo(relays)); }
public void TestConfigAAAARecord() { var config = ParseXML(@" <zone> <SOA name=""example.com"" class=""IN"" ttl=""7200"" primary-ns=""ns.example.com"" hostmaster=""admin.example.com"" serial=""0"" refresh=""3600"" retry=""60"" expire=""3600"" min-ttl=""60"" /> <AAAA name=""www.example.com"" class=""IN"" ttl=""3600"" address=""2001:0DB8:AC10:FE01:0000:0000:0000:0000"" /> </zone> " ); var zone = DNSZone.Unserialize(config); var records = new List <DNSRecord>(); records.Add(new DNSRecord( new Domain("www.example.com"), AddressClass.INTERNET, 3600, new AAAAResource(IPv6Address.Parse("2001:0DB8:AC10:FE01:0000:0000:0000:0000")))); Assert.That(zone.Records, Is.EquivalentTo(records)); }
public void TestConfigMXRecord() { var config = ParseXML(@" <zone> <SOA name=""example.com"" class=""IN"" ttl=""7200"" primary-ns=""ns.example.com"" hostmaster=""admin.example.com"" serial=""0"" refresh=""3600"" retry=""60"" expire=""3600"" min-ttl=""60"" /> <MX name=""example.com"" class=""IN"" ttl=""3600"" priority=""42"" mailserver=""smtp.example.com"" /> </zone> " ); var zone = DNSZone.Unserialize(config); var records = new List <DNSRecord>(); records.Add(new DNSRecord( new Domain("example.com"), AddressClass.INTERNET, 3600, new MXResource(42, new Domain("smtp.example.com")))); Assert.That(zone.Records, Is.EquivalentTo(records)); }
public void TestConfigPTRRecordV6() { var config = ParseXML(@" <zone> <SOA name=""example.com"" class=""IN"" ttl=""7200"" primary-ns=""ns.example.com"" hostmaster=""admin.example.com"" serial=""0"" refresh=""3600"" retry=""60"" expire=""3600"" min-ttl=""60"" /> <PTR name=""b.a.9.8.7.6.5.0.4.0.0.0.3.0.0.0.2.0.0.0.1.0.0.0.0.0.0.0.1.2.3.4.ip6.arpa"" class=""IN"" ttl=""3600"" pointer=""www.example.com"" /> </zone> " ); var zone = DNSZone.Unserialize(config); var records = new List <DNSRecord>(); records.Add(new DNSRecord( new Domain("b.a.9.8.7.6.5.0.4.0.0.0.3.0.0.0.2.0.0.0.1.0.0.0.0.0.0.0.1.2.3.4.ip6.arpa"), AddressClass.INTERNET, 3600, new PTRResource(new Domain("www.example.com")))); Assert.That(zone.Records, Is.EquivalentTo(records)); }
public void TestSOAMinTTLIsEnforced() { var config = ParseXML(@" <zone> <SOA name=""example.com"" class=""IN"" ttl=""7200"" primary-ns=""ns.example.com"" hostmaster=""admin.example.com"" serial=""0"" refresh=""3600"" retry=""60"" expire=""3600"" min-ttl=""60"" /> <A name=""www.example.com"" class=""IN"" ttl=""5"" address=""192.168.0.1"" /> </zone> " ); var zone = DNSZone.Unserialize(config); var records = new List <DNSRecord>(); records.Add(new DNSRecord( new Domain("www.example.com"), AddressClass.INTERNET, 60, new AResource(IPv4Address.Parse("192.168.0.1")))); Assert.That(zone.Records, Is.EquivalentTo(records)); }