From af7221e01977fe92532650f327142a4c60ddcc69 Mon Sep 17 00:00:00 2001 From: Shreyas Zare Date: Sat, 10 Jul 2021 13:14:23 +0530 Subject: [PATCH] DnsResourceRecordInfo: added deleted on and primary name server properties. --- .../ResourceRecords/DnsResourceRecordInfo.cs | 102 ++++++++++++++++-- 1 file changed, 94 insertions(+), 8 deletions(-) diff --git a/DnsServerCore/Dns/ResourceRecords/DnsResourceRecordInfo.cs b/DnsServerCore/Dns/ResourceRecords/DnsResourceRecordInfo.cs index ebdcd468..ae2b4d5b 100644 --- a/DnsServerCore/Dns/ResourceRecords/DnsResourceRecordInfo.cs +++ b/DnsServerCore/Dns/ResourceRecords/DnsResourceRecordInfo.cs @@ -20,8 +20,10 @@ along with this program. If not, see . using System; using System.Collections.Generic; using System.IO; +using System.Net; using TechnitiumLibrary.IO; using TechnitiumLibrary.Net.Dns; +using TechnitiumLibrary.Net.Dns.ResourceRecords; namespace DnsServerCore.Dns.ResourceRecords { @@ -32,6 +34,8 @@ namespace DnsServerCore.Dns.ResourceRecords bool _disabled; IReadOnlyList _glueRecords; string _comments; + DateTime _deletedOn; + IReadOnlyList _primaryNameServers; #endregion @@ -40,7 +44,7 @@ namespace DnsServerCore.Dns.ResourceRecords public DnsResourceRecordInfo() { } - public DnsResourceRecordInfo(BinaryReader bR) + public DnsResourceRecordInfo(BinaryReader bR, bool isSoa) { byte version = bR.ReadByte(); switch (version) @@ -51,22 +55,78 @@ namespace DnsServerCore.Dns.ResourceRecords case 2: case 3: + case 4: + case 5: _disabled = bR.ReadBoolean(); - int count = bR.ReadByte(); - if (count > 0) + if ((version < 5) && isSoa) { - DnsResourceRecord[] glueRecords = new DnsResourceRecord[count]; + //read old glue records as NameServerAddress in case of SOA record + int count = bR.ReadByte(); + if (count > 0) + { + NameServerAddress[] primaryNameServers = new NameServerAddress[count]; - for (int i = 0; i < glueRecords.Length; i++) - glueRecords[i] = new DnsResourceRecord(bR.BaseStream); + for (int i = 0; i < primaryNameServers.Length; i++) + { + DnsResourceRecord glueRecord = new DnsResourceRecord(bR.BaseStream); - _glueRecords = glueRecords; + IPAddress address; + + switch (glueRecord.Type) + { + case DnsResourceRecordType.A: + address = (glueRecord.RDATA as DnsARecord).Address; + break; + + case DnsResourceRecordType.AAAA: + address = (glueRecord.RDATA as DnsAAAARecord).Address; + break; + + default: + continue; + } + + primaryNameServers[i] = new NameServerAddress(address); + } + + _primaryNameServers = primaryNameServers; + } + } + else + { + int count = bR.ReadByte(); + if (count > 0) + { + DnsResourceRecord[] glueRecords = new DnsResourceRecord[count]; + + for (int i = 0; i < glueRecords.Length; i++) + glueRecords[i] = new DnsResourceRecord(bR.BaseStream); + + _glueRecords = glueRecords; + } } if (version >= 3) _comments = bR.ReadShortString(); + if (version >= 4) + _deletedOn = bR.ReadDateTime(); + + if (version >= 5) + { + int count = bR.ReadByte(); + if (count > 0) + { + NameServerAddress[] primaryNameServers = new NameServerAddress[count]; + + for (int i = 0; i < primaryNameServers.Length; i++) + primaryNameServers[i] = new NameServerAddress(bR); + + _primaryNameServers = primaryNameServers; + } + } + break; default: @@ -80,7 +140,7 @@ namespace DnsServerCore.Dns.ResourceRecords public void WriteTo(BinaryWriter bW) { - bW.Write((byte)3); //version + bW.Write((byte)5); //version bW.Write(_disabled); if (_glueRecords is null) @@ -99,6 +159,20 @@ namespace DnsServerCore.Dns.ResourceRecords bW.Write((byte)0); else bW.WriteShortString(_comments); + + bW.Write(_deletedOn); + + if (_primaryNameServers is null) + { + bW.Write((byte)0); + } + else + { + bW.Write(Convert.ToByte(_primaryNameServers.Count)); + + foreach (NameServerAddress nameServer in _primaryNameServers) + nameServer.WriteTo(bW); + } } #endregion @@ -123,6 +197,18 @@ namespace DnsServerCore.Dns.ResourceRecords set { _comments = value; } } + public DateTime DeletedOn + { + get { return _deletedOn; } + set { _deletedOn = value; } + } + + public IReadOnlyList PrimaryNameServers + { + get { return _primaryNameServers; } + set { _primaryNameServers = value; } + } + #endregion } }