Ejemplo n.º 1
0
        public void ParseTest()
        {
            const string str  = @"
; zone fragment example.com
; mail servers in the same zone
; will support incoming email with addresses of the format 
; [email protected]
$TTL 2d ; zone default = 2 days or 172800 seconds
$ORIGIN example.com.
sil.example.com. IN SSHFP 2 1 450c7d19d5da9a3a5b7c18992d1fbde15d8dad34";
            var          zone = DnsZoneFile.Parse(str);

            Assert.AreEqual(1, zone.Records.Count);

            Assert.IsAssignableFrom <SSHFPResourceRecord>(zone.Records.First());

            var record = (SSHFPResourceRecord)zone.Records.First();

            Assert.AreEqual("sil.example.com", record.Name);
            Assert.AreEqual("IN", record.Class);
            Assert.AreEqual(ResourceRecordType.SSHFP, record.Type);
            Assert.AreEqual(2, record.AlgorithmNumber);
            Assert.AreEqual(1, record.FingerprintType);
            Assert.AreEqual("450c7d19d5da9a3a5b7c18992d1fbde15d8dad34", record.Fingerprint);
        }
Ejemplo n.º 2
0
        public void MxRecordParseTest()
        {
            const string str  = @"
; zone fragment example.com
; mail servers in the same zone
; will support incoming email with addresses of the format 
; [email protected]
$TTL 2d ; zone default = 2 days or 172800 seconds
$ORIGIN example.com.
@               IN     MX     10  mail.foo.com.
@               IN     MX     20  mail2.foo.com.";
            var          zone = DnsZoneFile.Parse(str);

            Assert.AreEqual(2, zone.Records.Count);

            Assert.IsAssignableFrom <MxResourceRecord>(zone.Records.First());

            var record = (MxResourceRecord)zone.Records.First();

            Assert.AreEqual("example.com", record.Name);
            Assert.AreEqual("IN", record.Class);
            Assert.AreEqual(ResourceRecordType.MX, record.Type);
            Assert.AreEqual(10, record.Preference);
            Assert.AreEqual("mail.foo.com", record.Exchange);
        }
Ejemplo n.º 3
0
        public void ParseTest()
        {
            const string str  = @"
; zone fragment example.com
; mail servers in the same zone
; will support incoming email with addresses of the format 
; [email protected]
$TTL 2d ; zone default = 2 days or 172800 seconds
$ORIGIN example.com.
example.com. IN	CAA 0	iodef		""mailto: [email protected]""
    IN  CAA 0   issue       ""letsencrypt.org""";
            var          zone = DnsZoneFile.Parse(str);

            Assert.AreEqual(2, zone.Records.Count);

            Assert.IsAssignableFrom <CAAResourceRecord>(zone.Records.First());

            var record = (CAAResourceRecord)zone.Records.First();

            Assert.AreEqual("example.com", record.Name);
            Assert.AreEqual("IN", record.Class);
            Assert.AreEqual(ResourceRecordType.CAA, record.Type);
            Assert.AreEqual(0, record.Flag);
            Assert.AreEqual("iodef", record.Tag);
            Assert.AreEqual("mailto: [email protected]", record.Value);
        }
Ejemplo n.º 4
0
        public void SoaRecordParseTest()
        {
            const string str  = @"
$TTL 1h                  ; default expiration time of all resource records without their own TTL value
example.com.    IN    SOA   ns.example.com. hostmaster.example.com. (
                              2003080800 ; sn = serial number
                              172800     ; ref = refresh = 2d
                              900        ; ret = update retry = 15m
                              1209600    ; ex = expiry = 2w
                              3600       ; nx = nxdomain ttl = 1h
                              )";
            var          zone = DnsZoneFile.Parse(str);

            Assert.AreEqual(1, zone.Records.Count);

            Assert.IsAssignableFrom <SoaResourceRecord>(zone.Records.First());

            var record = (SoaResourceRecord)zone.Records.First();

            Assert.AreEqual("example.com", record.Name);
            Assert.AreEqual("IN", record.Class);
            Assert.AreEqual(ResourceRecordType.SOA, record.Type);
            Assert.AreEqual("ns.example.com", record.NameServer);
            Assert.AreEqual("2003080800", record.SerialNumber);
            Assert.AreEqual(TimeSpan.FromDays(2), record.Refresh);
            Assert.AreEqual(TimeSpan.FromMinutes(15), record.Retry);
            Assert.AreEqual(TimeSpan.FromDays(14), record.Expiry);
            Assert.AreEqual(TimeSpan.FromHours(1), record.Minimum);
        }
Ejemplo n.º 5
0
        public void EmptyLabelParseTest()
        {
            const string str  = @"
$TTL 2h
@	IN	SOA	ns.host.com.	ns2.host.com.	(
			2018042701	; serial
			2h		; refresh
			15m		; update retry
			2w		; expiry
			2h		; minimum
		)
		NS	ns.host.com.
		NS	ns2.host.com.
		MX	20	mail.host.com.
;		IN	TXT	""v = spf1 + mx + include:host.com? all""

        A   10.0.0.1";
            var          zone = DnsZoneFile.Parse(str, "example.com");

            foreach (ResourceRecord rr in zone.Records)
            {
                if (rr.Name.Substring(0, 1) == ".")
                {
                    throw new Exception("Empty label");
                }
            }
        }
Ejemplo n.º 6
0
        public void ParseTest()
        {
            const string str = @"
$ORIGIN example.com.     ; designates the start of this zone file in the namespace
$TTL 1h                  ; default expiration time of all resource records without their own TTL value
example.com.  IN  SOA   ns.example.com. username.example.com. ( 2007120710 1d 2h 4w 1h )
example.com.  IN  NS    ns                    ; ns.example.com is a nameserver for example.com
example.com.  IN  NS    ns.somewhere.example. ; ns.somewhere.example is a backup nameserver for example.com
example.com.  IN  MX    10 mail.example.com.  ; mail.example.com is the mailserver for example.com
@             IN  MX    20 mail2.example.com. ; equivalent to above line, ""@"" represents zone origin
@             IN  MX    50 mail3              ; equivalent to above line, but using a relative host name
example.com.  IN  A     192.0.2.1             ; IPv4 address for example.com
              IN  AAAA  2001:db8:10::1        ; IPv6 address for example.com
ns            IN  A     192.0.2.2             ; IPv4 address for ns.example.com
              IN  AAAA  2001:db8:10::2        ; IPv6 address for ns.example.com
www           IN  CNAME example.com.          ; www.example.com is an alias for example.com
wwwtest       IN  CNAME www                   ; wwwtest.example.com is another alias for www.example.com
mail          IN  A     192.0.2.3             ; IPv4 address for mail.example.com
mail2         IN  A     192.0.2.4             ; IPv4 address for mail2.example.com
mail3         IN  A     192.0.2.5             ; IPv4 address for mail3.example.com";

            try {
                var zone = DnsZoneFile.Parse(str);
                Assert.AreEqual(1, zone.Records.OfType <SoaResourceRecord>().Count());
                Assert.AreEqual(2, zone.Records.OfType <NsResourceRecord>().Count());
                Assert.AreEqual(3, zone.Records.OfType <MxResourceRecord>().Count());
                Assert.AreEqual(5, zone.Records.OfType <AResourceRecord>().Count());
                Assert.AreEqual(2, zone.Records.OfType <CNameResourceRecord>().Count());
            } catch (TokenException exc) {
                Console.WriteLine(exc.Token.Position.GetLine());
                throw;
            }
        }
Ejemplo n.º 7
0
        public void ParseTest()
        {
            const string str  = @"
; zone fragment example.com
; mail servers in the same zone
; will support incoming email with addresses of the format 
; [email protected]
$TTL 2d ; zone default = 2 days or 172800 seconds
$ORIGIN example.com.
_443._tcp.keyserver.example.com. IN TLSA 3 1 1 e677073271638e936eb3846c7aacfd3d387b831aa953b7486dc8f6227798f70b";
            var          zone = DnsZoneFile.Parse(str);

            Assert.AreEqual(1, zone.Records.Count);

            Assert.IsAssignableFrom <TLSAResourceRecord>(zone.Records.First());

            var record = (TLSAResourceRecord)zone.Records.First();

            Assert.AreEqual("_443._tcp.keyserver.example.com", record.Name);
            Assert.AreEqual("IN", record.Class);
            Assert.AreEqual(ResourceRecordType.TLSA, record.Type);
            Assert.AreEqual(3, record.CertificateUsage);
            Assert.AreEqual(1, record.Selector);
            Assert.AreEqual(1, record.MatchingType);
            Assert.AreEqual("e677073271638e936eb3846c7aacfd3d387b831aa953b7486dc8f6227798f70b", record.CertificateAssociationData);
        }
Ejemplo n.º 8
0
        public void AaaaRecordParseTest()
        {
            const string str  = @"
; zone fragment for example.com
$TTL 2d ; zone default = 2 days or 172800 seconds
$ORIGIN example.com.
joe        IN      AAAA      2001:db8::3  ; joe & www = same ip
www        IN      AAAA      2001:db8::3
; functionally the same as the record above
www.example.com.   AAAA      2001:db8::3
fred  3600 IN      AAAA      2001:db8::4  ; ttl =3600 overrides $TTL default
ftp        IN      AAAA      2001:db8::5 ; round robin with next
           IN      AAAA      2001:db8::6
mail       IN      AAAA      2001:db8::7  ; mail = round robin
mail       IN      AAAA      2001:db8::32
mail       IN      AAAA      2001:db8::33
squat      IN      AAAA      2001:db8:0:0:1::13  ; address in another subnet";
            var          zone = DnsZoneFile.Parse(str);

            Assert.AreEqual(10, zone.Records.Count);

            Assert.IsAssignableFrom <AaaaResourceRecord>(zone.Records.First());

            var record = (AaaaResourceRecord)zone.Records.First();

            Assert.AreEqual("joe.example.com", record.Name);
            Assert.AreEqual("IN", record.Class);
            Assert.AreEqual(ResourceRecordType.AAAA, record.Type);
            Assert.AreEqual(IPAddress.Parse("2001:db8::3"), record.Address);
        }
Ejemplo n.º 9
0
        public void TxtRecordParseTest()
        {
            const string str  = @"
$ORIGIN example.com.
; multiple quotes strings on a single line
; generates a single text string of 
; Located in a black hole somewhere
$TTL 1h                  ; default expiration time of all resource records without their own TTL value
joe        IN      TXT    ""Located in a black hole"" "" somewhere""
; multiple quoted strings on multiple lines
joe IN      TXT (""Located in a black hole""
                    "" somewhere over the rainbow"")
; generates a single text string of
; Located in a black hole somewhere over the rainbow";
            var          zone = DnsZoneFile.Parse(str);

            Assert.AreEqual(2, zone.Records.Count);

            Assert.IsAssignableFrom <TxtResourceRecord>(zone.Records.First());

            var record = (TxtResourceRecord)zone.Records.First();

            Assert.AreEqual("joe.example.com", record.Name);
            Assert.AreEqual("IN", record.Class);
            Assert.AreEqual(ResourceRecordType.TXT, record.Type);
            Assert.AreEqual("Located in a black hole somewhere", record.Content);
        }
Ejemplo n.º 10
0
        public void SrvRecordParseTest()
        {
            const string str  = @"
$ORIGIN example.com.
$TTL 2d ; 172800 secs
; foobar - use old-slow-box or new-fast-box if either is
; available, make three quarters of the logins go to
; new-fast-box.
_foobar._tcp    SRV 0 1 9 old-slow-box.example.com.
                SRV 0 3 9 new-fast-box.example.com.
; if neither old-slow-box or new-fast-box is up, switch to
; using the sysdmin's box and the server
                SRV 1 0 9 sysadmins-box.example.com.
                SRV 1 0 9 server.example.com.
*._tcp          SRV  0 0 0 .
*._udp          SRV  0 0 0 .";
            var          zone = DnsZoneFile.Parse(str);

            Assert.AreEqual(6, zone.Records.Count);

            Assert.IsAssignableFrom <SrvResourceRecord>(zone.Records.First());

            var record = (SrvResourceRecord)zone.Records.First();

            Assert.AreEqual("_foobar._tcp.example.com", record.Name);
            Assert.AreEqual(null, record.Class);
            Assert.AreEqual(ResourceRecordType.SRV, record.Type);
            Assert.AreEqual(0, record.Priority);
        }
Ejemplo n.º 11
0
        public void MissingOriginTest()
        {
            const string str = @"
; A Records
@	600	IN	A	184.168.221.14
sub	600	IN	A	184.168.221.15
";

            Assert.Throws <TokenException>(() => DnsZoneFile.Parse(str));
        }
Ejemplo n.º 12
0
        public void IncludeTest()
        {
            var embedded = new EmbeddedDnsSource(GetType().Assembly, GetType().Namespace + ".Samples", "root_com.zone");
            var zone     = DnsZoneFile.Parse(embedded);

            Assert.AreEqual(2, zone.Records.Count);

            var rootA = zone.Single <AResourceRecord>("root.com");

            Assert.AreEqual(IPAddress.Parse("192.168.0.1"), rootA.Address);

            var wwwA = zone.Single <AResourceRecord>("www.root.com");

            Assert.AreEqual(IPAddress.Parse("192.168.0.2"), wwwA.Address);
        }
Ejemplo n.º 13
0
        public void EmptyTest()
        {
            const string str = @"
;just single comment
    ;white space and comments

";

            try {
                var zone = DnsZoneFile.Parse(str);
                Assert.AreEqual(0, zone.Records.Count);
            } catch (TokenException exc) {
                Console.WriteLine(exc.Token.Position.GetLine());
                throw;
            }
        }
Ejemplo n.º 14
0
        public void ExplicitOriginTest()
        {
            const string str  = @"
; A Records
@	600	IN	A	184.168.221.14
sub	600	IN	A	184.168.221.15
";
            var          zone = DnsZoneFile.Parse(str, "test.com");

            Assert.AreEqual(2, zone.Records.Count);

            Assert.IsAssignableFrom <AResourceRecord>(zone.Records.First());

            var rootRecord = (AResourceRecord)zone.Records.First();

            Assert.AreEqual("test.com", rootRecord.Name);
            var subRecord = (AResourceRecord)zone.Records.Last();

            Assert.AreEqual("sub.test.com", subRecord.Name);
        }
Ejemplo n.º 15
0
        public void CNameRecordParseTest()
        {
            const string str  = @"
; zone fragment for example.com
$TTL 2d ; zone default = 2 days or 172800 seconds
$ORIGIN example.com.
www        IN      CNAME  server1
ftp        IN      CNAME  server1";
            var          zone = DnsZoneFile.Parse(str);

            Assert.AreEqual(2, zone.Records.Count);

            Assert.IsAssignableFrom <CNameResourceRecord>(zone.Records.First());

            var record = (CNameResourceRecord)zone.Records.First();

            Assert.AreEqual("www.example.com", record.Name);
            Assert.AreEqual("IN", record.Class);
            Assert.AreEqual(ResourceRecordType.CNAME, record.Type);
            Assert.AreEqual("server1.example.com", record.CanonicalName);
        }
Ejemplo n.º 16
0
        public void ARecordParseTest()
        {
            const string str  = @"
; zone file snippet
$ORIGIN example.com.
$TTL 2d ; 172800 secs
alice  IN  A   192.168.2.1 ; real host name
ns1    IN   A  192.168.2.1 ; service name
alice  IN   A  192.168.2.1 ; host name (same IPv4)";
            var          zone = DnsZoneFile.Parse(str);

            Assert.AreEqual(3, zone.Records.Count);

            Assert.IsAssignableFrom <AResourceRecord>(zone.Records.First());

            var record = (AResourceRecord)zone.Records.First();

            Assert.AreEqual("alice.example.com", record.Name);
            Assert.AreEqual("IN", record.Class);
            Assert.AreEqual(ResourceRecordType.A, record.Type);
            Assert.AreEqual(IPAddress.Parse("192.168.2.1"), record.Address);
        }
Ejemplo n.º 17
0
        public void PtrRecordParseTest()
        {
            const string str  = @"
$TTL 2d ; 172800 secs
$ORIGIN 23.168.192.IN-ADDR.ARPA.
2             IN      PTR     joe.example.com. ; FDQN
15            IN      PTR     www.example.com.
17            IN      PTR     bill.example.com.
74            IN      PTR     fred.example.com.";
            var          zone = DnsZoneFile.Parse(str);

            Assert.AreEqual(4, zone.Records.Count);

            Assert.IsAssignableFrom <PtrResourceRecord>(zone.Records.First());

            var record = (PtrResourceRecord)zone.Records.First();

            Assert.AreEqual("2.23.168.192.IN-ADDR.ARPA", record.Name);
            Assert.AreEqual("IN", record.Class);
            Assert.AreEqual(ResourceRecordType.PTR, record.Type);
            Assert.AreEqual("joe.example.com", record.HostName);
        }
Ejemplo n.º 18
0
        public void NsRecordParseTest()
        {
            const string str  = @"
; zone fragment example.com
; mail servers in the same zone
; will support incoming email with addresses of the format 
; [email protected]
$TTL 2d ; zone default = 2 days or 172800 seconds
$ORIGIN example.com.
@               IN      NS     ns1.example.net.
@               IN      NS     ns1.example.org.";
            var          zone = DnsZoneFile.Parse(str);

            Assert.AreEqual(2, zone.Records.Count);

            Assert.IsAssignableFrom <NsResourceRecord>(zone.Records.First());

            var record = (NsResourceRecord)zone.Records.First();

            Assert.AreEqual("example.com", record.Name);
            Assert.AreEqual("IN", record.Class);
            Assert.AreEqual(ResourceRecordType.NS, record.Type);
            Assert.AreEqual("ns1.example.net", record.NameServer);
        }