diff --git a/DnsServerCore/Dns/ZoneManagers/AuthZoneManager.cs b/DnsServerCore/Dns/ZoneManagers/AuthZoneManager.cs index 3e3237a5..e3046631 100644 --- a/DnsServerCore/Dns/ZoneManagers/AuthZoneManager.cs +++ b/DnsServerCore/Dns/ZoneManagers/AuthZoneManager.cs @@ -241,39 +241,58 @@ namespace DnsServerCore.Dns.ZoneManagers }); } - private IReadOnlyList GetAdditionalRecords(IReadOnlyList nsRecords) + private IReadOnlyList GetAdditionalRecords(IReadOnlyList refRecords) { - IReadOnlyList glueRecords = nsRecords.GetGlueRecords(); - if (glueRecords.Count > 0) - return glueRecords; - List additionalRecords = new List(); - foreach (DnsResourceRecord nsRecord in nsRecords) + foreach (DnsResourceRecord refRecord in refRecords) { - if (nsRecord.Type != DnsResourceRecordType.NS) - continue; - - AuthZone authZone = _root.FindZone((nsRecord.RDATA as DnsNSRecord).NameServer, out _, out _, out _); - if ((authZone != null) && authZone.IsActive) + switch (refRecord.Type) { - { - IReadOnlyList records = authZone.QueryRecords(DnsResourceRecordType.A); - if ((records.Count > 0) && (records[0].RDATA is DnsARecord)) - additionalRecords.AddRange(records); - } + case DnsResourceRecordType.NS: + IReadOnlyList glueRecords = refRecord.GetGlueRecords(); + if (glueRecords.Count > 0) + { + additionalRecords.AddRange(glueRecords); + } + else + { + ResolveAdditionalRecords((refRecord.RDATA as DnsNSRecord).NameServer, additionalRecords); + } + break; - { - IReadOnlyList records = authZone.QueryRecords(DnsResourceRecordType.AAAA); - if ((records.Count > 0) && (records[0].RDATA is DnsAAAARecord)) - additionalRecords.AddRange(records); - } + case DnsResourceRecordType.MX: + ResolveAdditionalRecords((refRecord.RDATA as DnsMXRecord).Exchange, additionalRecords); + break; + + case DnsResourceRecordType.SRV: + ResolveAdditionalRecords((refRecord.RDATA as DnsSRVRecord).Target, additionalRecords); + break; } } return additionalRecords; } + private void ResolveAdditionalRecords(string domain, List additionalRecords) + { + AuthZone authZone = _root.FindZone(domain, out _, out _, out _); + if ((authZone != null) && authZone.IsActive) + { + { + IReadOnlyList records = authZone.QueryRecords(DnsResourceRecordType.A); + if ((records.Count > 0) && (records[0].RDATA is DnsARecord)) + additionalRecords.AddRange(records); + } + + { + IReadOnlyList records = authZone.QueryRecords(DnsResourceRecordType.AAAA); + if ((records.Count > 0) && (records[0].RDATA is DnsAAAARecord)) + additionalRecords.AddRange(records); + } + } + } + private DnsDatagram GetReferralResponse(DnsDatagram request, AuthZone delegationZone) { IReadOnlyList authority; @@ -898,6 +917,8 @@ namespace DnsServerCore.Dns.ZoneManagers switch (request.Question[0].Type) { case DnsResourceRecordType.NS: + case DnsResourceRecordType.MX: + case DnsResourceRecordType.SRV: authority = null; additional = GetAdditionalRecords(answers); break;