diff --git a/DnsServerCore/Dns/Zones/AuthZone.cs b/DnsServerCore/Dns/Zones/AuthZone.cs
index 0aadb295..b2265c4f 100644
--- a/DnsServerCore/Dns/Zones/AuthZone.cs
+++ b/DnsServerCore/Dns/Zones/AuthZone.cs
@@ -20,8 +20,10 @@ along with this program. If not, see .
using DnsServerCore.Dns.ResourceRecords;
using System;
using System.Collections.Generic;
+using System.Net;
using TechnitiumLibrary.IO;
using TechnitiumLibrary.Net.Dns;
+using TechnitiumLibrary.Net.Dns.ResourceRecords;
namespace DnsServerCore.Dns.Zones
{
@@ -92,6 +94,108 @@ namespace DnsServerCore.Dns.Zones
return newRecords;
}
+ private IReadOnlyList GetNameServerAddresses(DnsServer dnsServer, DnsResourceRecord record)
+ {
+ string nsDomain;
+
+ switch (record.Type)
+ {
+ case DnsResourceRecordType.NS:
+ nsDomain = (record.RDATA as DnsNSRecord).NameServer;
+ break;
+
+ case DnsResourceRecordType.SOA:
+ nsDomain = (record.RDATA as DnsSOARecord).PrimaryNameServer;
+ break;
+
+ default:
+ throw new InvalidOperationException();
+ }
+
+ List nameServers = new List(2);
+
+ IReadOnlyList glueRecords = record.GetGlueRecords();
+ if (glueRecords.Count > 0)
+ {
+ foreach (DnsResourceRecord glueRecord in glueRecords)
+ {
+ switch (glueRecord.Type)
+ {
+ case DnsResourceRecordType.A:
+ nameServers.Add(new NameServerAddress(nsDomain, (glueRecord.RDATA as DnsARecord).Address));
+ break;
+
+ case DnsResourceRecordType.AAAA:
+ if (dnsServer.PreferIPv6)
+ nameServers.Add(new NameServerAddress(nsDomain, (glueRecord.RDATA as DnsAAAARecord).Address));
+
+ break;
+ }
+ }
+ }
+ else
+ {
+ //resolve addresses
+ DnsDatagram response = dnsServer.DirectQuery(new DnsQuestionRecord(nsDomain, DnsResourceRecordType.A, DnsClass.IN));
+ if (response != null)
+ {
+ IReadOnlyList addresses = DnsClient.ParseResponseA(response);
+ foreach (IPAddress address in addresses)
+ nameServers.Add(new NameServerAddress(nsDomain, address));
+ }
+
+ if (dnsServer.PreferIPv6)
+ {
+ response = dnsServer.DirectQuery(new DnsQuestionRecord(nsDomain, DnsResourceRecordType.AAAA, DnsClass.IN));
+ if (response != null)
+ {
+ IReadOnlyList addresses = DnsClient.ParseResponseAAAA(response);
+ foreach (IPAddress address in addresses)
+ nameServers.Add(new NameServerAddress(nsDomain, address));
+ }
+ }
+ }
+
+ return nameServers;
+ }
+
+ #endregion
+
+ #region protected
+
+ protected IReadOnlyList GetPrimaryNameServerAddresses(DnsServer dnsServer)
+ {
+ DnsResourceRecord soaRecord = _entries[DnsResourceRecordType.SOA][0];
+
+ return GetNameServerAddresses(dnsServer, soaRecord);
+ }
+
+ protected IReadOnlyList GetAllNameServerAddresses(DnsServer dnsServer, bool skipPrimaryNameServer)
+ {
+ List nameServers = new List();
+
+ DnsSOARecord soa = null;
+ IReadOnlyList nsRecords = QueryRecords(DnsResourceRecordType.NS);
+
+ foreach (DnsResourceRecord nsRecord in nsRecords)
+ {
+ if (skipPrimaryNameServer)
+ {
+ string nsDomain = (nsRecord.RDATA as DnsNSRecord).NameServer;
+
+ if (soa == null)
+ soa = _entries[DnsResourceRecordType.SOA][0].RDATA as DnsSOARecord;
+
+ if (soa.PrimaryNameServer.Equals(nsDomain, StringComparison.OrdinalIgnoreCase))
+ continue; //skip primary name server
+ }
+
+ nameServers.AddRange(GetNameServerAddresses(dnsServer, nsRecord));
+ }
+
+ return nameServers;
+ }
+
#endregion
#region public