private void ResolveCNAME(DnsQuestionRecord question, DnsResourceRecord lastCNAME, bool serveStale, List <DnsResourceRecord> answerRecords)
        {
            int queryCount = 0;

            do
            {
                if (!_root.TryGet((lastCNAME.RDATA as DnsCNAMERecord).Domain, out CacheZone cacheZone))
                {
                    break;
                }

                IReadOnlyList <DnsResourceRecord> records = cacheZone.QueryRecords(question.Type, serveStale, true);
                if (records.Count < 1)
                {
                    break;
                }

                answerRecords.AddRange(records);

                if (records[0].Type != DnsResourceRecordType.CNAME)
                {
                    break;
                }

                lastCNAME = records[0];
            }while (++queryCount < DnsServer.MAX_CNAME_HOPS);
        }
Exemple #2
0
        public IReadOnlyList <DnsResourceRecord> QueryRecords(string domain, DnsResourceRecordType type)
        {
            if (_root.TryGet(domain, out AuthZone zone))
            {
                return(zone.QueryRecords(type));
            }

            return(Array.Empty <DnsResourceRecord>());
        }
Exemple #3
0
        public List <DnsResourceRecord> ListAllRecords(string domain)
        {
            if (_root.TryGet(domain, out CacheZone zone))
            {
                return(zone.ListAllRecords());
            }

            return(new List <DnsResourceRecord>(0));
        }
        private AuthZone CreateEmptyZone(AuthZoneInfo zoneInfo)
        {
            AuthZone zone;

            switch (zoneInfo.Type)
            {
            case AuthZoneType.Primary:
                zone = new PrimaryZone(_dnsServer, zoneInfo);
                break;

            case AuthZoneType.Secondary:
                zone = new SecondaryZone(_dnsServer, zoneInfo);
                break;

            case AuthZoneType.Stub:
                zone = new StubZone(_dnsServer, zoneInfo);
                break;

            case AuthZoneType.Forwarder:
                zone = new ForwarderZone(zoneInfo);
                break;

            default:
                throw new InvalidDataException("DNS zone type not supported.");
            }

            if (_root.TryAdd(zone))
            {
                _totalZones++;
                return(zone);
            }

            if (_root.TryGet(zoneInfo.Name, out AuthZone existingZone) && (existingZone is SubDomainZone))
            {
                _root[zoneInfo.Name] = zone;
                _totalZones++;
                return(zone);
            }

            throw new DnsServerException("Zone already exists: " + zoneInfo.Name);
        }