From 383d2928f75c88c558bae8f17bfcc4443ca70064 Mon Sep 17 00:00:00 2001 From: Shreyas Zare Date: Sat, 13 Oct 2018 11:51:59 +0530 Subject: [PATCH] DnsWebService: fixed issue with SetDnsSettings(). --- DnsServerCore/DnsWebService.cs | 59 ++++++++++++++++++++++++---------- 1 file changed, 42 insertions(+), 17 deletions(-) diff --git a/DnsServerCore/DnsWebService.cs b/DnsServerCore/DnsWebService.cs index f2022cab..fb561288 100644 --- a/DnsServerCore/DnsWebService.cs +++ b/DnsServerCore/DnsWebService.cs @@ -892,6 +892,8 @@ namespace DnsServerCore string strServerDomain = request.QueryString["serverDomain"]; if (!string.IsNullOrEmpty(strServerDomain)) { + strServerDomain = strServerDomain.ToLower(); + if (_serverDomain != strServerDomain) { //authoritative zone @@ -900,10 +902,11 @@ namespace DnsServerCore foreach (Zone.ZoneInfo zone in zones) { - DnsResourceRecord[] dnsResourceRecords = _dnsServer.AuthoritativeZoneRoot.GetAllRecords(zone.ZoneName, DnsResourceRecordType.SOA, false, true); - if (dnsResourceRecords.Length > 0) + DnsResourceRecord[] soaResourceRecords = _dnsServer.AuthoritativeZoneRoot.GetAllRecords(zone.ZoneName, DnsResourceRecordType.SOA, false, true); + if (soaResourceRecords.Length > 0) { - DnsResourceRecord soaRecord = dnsResourceRecords[0]; + //update SOA record + DnsResourceRecord soaRecord = soaResourceRecords[0]; DnsSOARecord soaRecordData = soaRecord.RDATA as DnsSOARecord; string responsiblePerson = soaRecordData.ResponsiblePerson; @@ -911,31 +914,57 @@ namespace DnsServerCore responsiblePerson = responsiblePerson.Replace(_serverDomain, strServerDomain); _dnsServer.AuthoritativeZoneRoot.SetRecords(soaRecord.Name, soaRecord.Type, soaRecord.TTLValue, new DnsResourceRecordData[] { new DnsSOARecord(strServerDomain, responsiblePerson, soaRecordData.Serial, soaRecordData.Refresh, soaRecordData.Retry, soaRecordData.Expire, soaRecordData.Minimum) }); - SaveZoneFile(soaRecord.Name); + + //update NS records + DnsResourceRecord[] nsResourceRecords = _dnsServer.AuthoritativeZoneRoot.GetAllRecords(zone.ZoneName, DnsResourceRecordType.NS, false, true); + + foreach (DnsResourceRecord nsResourceRecord in nsResourceRecords) + { + if ((nsResourceRecord.RDATA as DnsNSRecord).NSDomainName.Equals(_serverDomain, StringComparison.CurrentCultureIgnoreCase)) + _dnsServer.AuthoritativeZoneRoot.UpdateRecord(nsResourceRecord, new DnsResourceRecord(nsResourceRecord.Name, nsResourceRecord.Type, nsResourceRecord.Class, nsResourceRecord.TTLValue, new DnsNSRecord(strServerDomain))); + } + + SaveZoneFile(zone.ZoneName); } } } + //allowed zone + { + Zone.ZoneInfo[] zones = _dnsServer.AllowedZoneRoot.ListAuthoritativeZones(); + + foreach (Zone.ZoneInfo zone in zones) + { + DnsResourceRecord[] soaResourceRecords = _dnsServer.AllowedZoneRoot.GetAllRecords(zone.ZoneName, DnsResourceRecordType.SOA, false, true); + if (soaResourceRecords.Length > 0) + { + DnsResourceRecord soaRecord = soaResourceRecords[0]; + DnsSOARecord soaRecordData = soaRecord.RDATA as DnsSOARecord; + + _dnsServer.AllowedZoneRoot.SetRecords(soaRecord.Name, soaRecord.Type, soaRecord.TTLValue, new DnsResourceRecordData[] { new DnsSOARecord(strServerDomain, "hostmaster." + strServerDomain, soaRecordData.Serial, soaRecordData.Refresh, soaRecordData.Retry, soaRecordData.Expire, soaRecordData.Minimum) }); + } + } + + SaveAllowedZoneFile(); + } + //blocked zone { Zone.ZoneInfo[] zones = _dnsServer.BlockedZoneRoot.ListAuthoritativeZones(); foreach (Zone.ZoneInfo zone in zones) { - DnsResourceRecord[] dnsResourceRecords = _dnsServer.BlockedZoneRoot.GetAllRecords(zone.ZoneName, DnsResourceRecordType.SOA, false, true); - if (dnsResourceRecords.Length > 0) + DnsResourceRecord[] soaResourceRecords = _dnsServer.BlockedZoneRoot.GetAllRecords(zone.ZoneName, DnsResourceRecordType.SOA, false, true); + if (soaResourceRecords.Length > 0) { - DnsResourceRecord soaRecord = dnsResourceRecords[0]; + DnsResourceRecord soaRecord = soaResourceRecords[0]; DnsSOARecord soaRecordData = soaRecord.RDATA as DnsSOARecord; - string responsiblePerson = soaRecordData.ResponsiblePerson; - if (responsiblePerson.EndsWith(_serverDomain)) - responsiblePerson = responsiblePerson.Replace(_serverDomain, strServerDomain); - - _dnsServer.BlockedZoneRoot.SetRecords(soaRecord.Name, soaRecord.Type, soaRecord.TTLValue, new DnsResourceRecordData[] { new DnsSOARecord(strServerDomain, responsiblePerson, soaRecordData.Serial, soaRecordData.Refresh, soaRecordData.Retry, soaRecordData.Expire, soaRecordData.Minimum) }); - SaveZoneFile(soaRecord.Name); + _dnsServer.BlockedZoneRoot.SetRecords(soaRecord.Name, soaRecord.Type, soaRecord.TTLValue, new DnsResourceRecordData[] { new DnsSOARecord(strServerDomain, "hostmaster." + strServerDomain, soaRecordData.Serial, soaRecordData.Refresh, soaRecordData.Retry, soaRecordData.Expire, soaRecordData.Minimum) }); } } + + SaveBlockedZoneFile(); } _serverDomain = strServerDomain; @@ -2669,7 +2698,6 @@ namespace DnsServerCore { wC.Proxy = _dnsServer.Proxy; wC.Timeout = 60000; - wC.IfModifiedSince = _blockListLastUpdatedOn; wC.DownloadFile(blockListUrl, blockListDownloadFilePath); } @@ -2777,9 +2805,6 @@ namespace DnsServerCore //save last updated on time _blockListLastUpdatedOn = DateTime.UtcNow; SaveConfigFile(); - - //force GC - GC.Collect(); } }