diff --git a/DnsServerCore/Dns/Zones/AuthZone.cs b/DnsServerCore/Dns/Zones/AuthZone.cs index de58731a..1ca37eff 100644 --- a/DnsServerCore/Dns/Zones/AuthZone.cs +++ b/DnsServerCore/Dns/Zones/AuthZone.cs @@ -281,6 +281,60 @@ namespace DnsServerCore.Dns.Zones deletedRRSigRecords = deleted; } + internal void AddRecord(DnsResourceRecord record, out IReadOnlyList addedRecords, out IReadOnlyList deletedRecords) + { + switch (record.Type) + { + case DnsResourceRecordType.CNAME: + case DnsResourceRecordType.DNAME: + case DnsResourceRecordType.SOA: + throw new InvalidOperationException("Cannot add record: use SetRecords() for " + record.Type.ToString() + " record"); + } + + List added = new List(); + List deleted = new List(); + + addedRecords = added; + deletedRecords = deleted; + + added.Add(record); + + _entries.AddOrUpdate(record.Type, delegate (DnsResourceRecordType key) + { + return new DnsResourceRecord[] { record }; + }, + delegate (DnsResourceRecordType key, IReadOnlyList existingRecords) + { + foreach (DnsResourceRecord existingRecord in existingRecords) + { + if (record.RDATA.Equals(existingRecord.RDATA)) + return existingRecords; + } + + List updatedRecords = new List(existingRecords.Count + 1); + + foreach (DnsResourceRecord existingRecord in existingRecords) + { + if (existingRecord.OriginalTtlValue == record.OriginalTtlValue) + { + updatedRecords.Add(existingRecord); + } + else + { + DnsResourceRecord updatedExistingRecord = new DnsResourceRecord(existingRecord.Name, existingRecord.Type, existingRecord.Class, record.OriginalTtlValue, existingRecord.RDATA); + updatedRecords.Add(updatedExistingRecord); + + added.Add(updatedExistingRecord); + deleted.Add(existingRecord); + } + } + + updatedRecords.Add(record); + + return updatedRecords; + }); + } + #endregion #region DNSSEC @@ -710,40 +764,7 @@ namespace DnsServerCore.Dns.Zones public virtual void AddRecord(DnsResourceRecord record) { - switch (record.Type) - { - case DnsResourceRecordType.CNAME: - case DnsResourceRecordType.DNAME: - case DnsResourceRecordType.SOA: - throw new InvalidOperationException("Cannot add record: use SetRecords() for " + record.Type.ToString() + " record"); - } - - _entries.AddOrUpdate(record.Type, delegate (DnsResourceRecordType key) - { - return new DnsResourceRecord[] { record }; - }, - delegate (DnsResourceRecordType key, IReadOnlyList existingRecords) - { - foreach (DnsResourceRecord existingRecord in existingRecords) - { - if (record.RDATA.Equals(existingRecord.RDATA)) - return existingRecords; - } - - List updatedRecords = new List(existingRecords.Count + 1); - - foreach (DnsResourceRecord existingRecord in existingRecords) - { - if (existingRecord.OriginalTtlValue == record.OriginalTtlValue) - updatedRecords.Add(existingRecord); - else - updatedRecords.Add(new DnsResourceRecord(existingRecord.Name, existingRecord.Type, existingRecord.Class, record.OriginalTtlValue, existingRecord.RDATA)); - } - - updatedRecords.Add(record); - - return updatedRecords; - }); + AddRecord(record, out _, out _); } public virtual bool DeleteRecords(DnsResourceRecordType type)