private AuthZone GetOrAddSubDomainZone(string domain) { return(_root.GetOrAdd(domain, delegate(string key) { _ = _root.FindZone(domain, out _, out AuthZone authZone, out _); if (authZone == null) { throw new DnsServerException("Zone was not found for domain: " + domain); } if (authZone is PrimaryZone) { return new PrimarySubDomainZone(authZone as PrimaryZone, domain); } else if (authZone is SecondaryZone) { return new SecondarySubDomainZone(domain); } else if (authZone is ForwarderZone) { return new ForwarderSubDomainZone(domain); } throw new DnsServerException("Zone cannot have sub domains."); })); }
private List <DnsResourceRecord> GetAdditionalRecords(IReadOnlyCollection <DnsResourceRecord> nsRecords, bool serveStale) { List <DnsResourceRecord> additionalRecords = new List <DnsResourceRecord>(); foreach (DnsResourceRecord nsRecord in nsRecords) { if (nsRecord.Type != DnsResourceRecordType.NS) { continue; } CacheZone cacheZone = _root.FindZone((nsRecord.RDATA as DnsNSRecord).NameServer, out _, out _, out _); if (cacheZone != null) { { IReadOnlyList <DnsResourceRecord> records = cacheZone.QueryRecords(DnsResourceRecordType.A, serveStale); if ((records.Count > 0) && (records[0].RDATA is DnsARecord)) { additionalRecords.AddRange(records); } } { IReadOnlyList <DnsResourceRecord> records = cacheZone.QueryRecords(DnsResourceRecordType.AAAA, serveStale); if ((records.Count > 0) && (records[0].RDATA is DnsAAAARecord)) { additionalRecords.AddRange(records); } } } } return(additionalRecords); }
public DnsDatagram QueryClosestDelegation(DnsDatagram request) { _ = _root.FindZone(request.Question[0].Name, out CacheZone delegation, out _, out _); if (delegation is not null) { //return closest name servers in delegation IReadOnlyList <DnsResourceRecord> closestAuthority = delegation.QueryRecords(DnsResourceRecordType.NS, false, true); if ((closestAuthority.Count > 0) && (closestAuthority[0].Type == DnsResourceRecordType.NS) && (closestAuthority[0].Name.Length > 0)) //dont trust root name servers from cache! { IReadOnlyList <DnsResourceRecord> additional = GetAdditionalRecords(closestAuthority, false); return(new DnsDatagram(request.Identifier, true, DnsOpcode.StandardQuery, false, false, request.RecursionDesired, true, false, false, DnsResponseCode.NoError, request.Question, null, closestAuthority, additional)); } } //no cached delegation found return(null); }
private void ResolveAdditionalRecords(DnsResourceRecord refRecord, string domain, bool serveStale, List <DnsResourceRecord> additionalRecords) { IReadOnlyList <DnsResourceRecord> glueRecords = refRecord.GetGlueRecords(); if (glueRecords.Count > 0) { bool added = false; foreach (DnsResourceRecord glueRecord in glueRecords) { if (!glueRecord.IsStale) { added = true; additionalRecords.Add(glueRecord); } } if (added) { return; } } CacheZone cacheZone = _root.FindZone(domain, out _, out _, out _); if (cacheZone != null) { { IReadOnlyList <DnsResourceRecord> records = cacheZone.QueryRecords(DnsResourceRecordType.A, serveStale, true); if ((records.Count > 0) && (records[0].RDATA is DnsARecord)) { additionalRecords.AddRange(records); } } { IReadOnlyList <DnsResourceRecord> records = cacheZone.QueryRecords(DnsResourceRecordType.AAAA, serveStale, true); if ((records.Count > 0) && (records[0].RDATA is DnsAAAARecord)) { additionalRecords.AddRange(records); } } } }
private void ResolveAdditionalRecords(string domain, bool serveStale, List <DnsResourceRecord> additionalRecords) { CacheZone cacheZone = _root.FindZone(domain, out _, out _, out _); if (cacheZone != null) { { IReadOnlyList <DnsResourceRecord> records = cacheZone.QueryRecords(DnsResourceRecordType.A, serveStale); if ((records.Count > 0) && (records[0].RDATA is DnsARecord)) { additionalRecords.AddRange(records); } } { IReadOnlyList <DnsResourceRecord> records = cacheZone.QueryRecords(DnsResourceRecordType.AAAA, serveStale); if ((records.Count > 0) && (records[0].RDATA is DnsAAAARecord)) { additionalRecords.AddRange(records); } } } }