Пример #1
0
        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))));
        }
Пример #2
0
        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));
        }
Пример #3
0
        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();
        }
Пример #4
0
        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));
        }
Пример #5
0
        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));
        }
Пример #6
0
        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));
        }
Пример #7
0
        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));
        }
Пример #8
0
        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));
        }
Пример #9
0
        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));
        }
Пример #10
0
        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));
        }
Пример #11
0
        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));
        }
Пример #12
0
        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));
        }
Пример #13
0
        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));
        }
Пример #14
0
        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));
        }
Пример #15
0
        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));
        }
Пример #16
0
        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));
        }
Пример #17
0
        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));
        }