From 89e346cead354c155ad98084934844e92ae14148 Mon Sep 17 00:00:00 2001 From: Mathieu Girard Date: Wed, 5 Jun 2024 14:00:43 +0000 Subject: [PATCH] Fix not following RFC6763 section 6.3: Each key/value pair is encoded as its own constitent string (each len + strings is a key/value pair). --- .../ResourceRecords/TextResourceRecord.cs | 33 ++++++++++--------- .../ResourceRecords/TextResourceRecordTest.cs | 5 +-- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/DNS/Protocol/ResourceRecords/TextResourceRecord.cs b/DNS/Protocol/ResourceRecords/TextResourceRecord.cs index 2b797d1..72489ba 100644 --- a/DNS/Protocol/ResourceRecords/TextResourceRecord.cs +++ b/DNS/Protocol/ResourceRecords/TextResourceRecord.cs @@ -56,20 +56,22 @@ public TextResourceRecord(Domain domain, string attributeName, string attributeV public IList TextData { get; } - public KeyValuePair Attribute { - get { - string text = ToStringTextData(); - Match match = PATTERN_TXT_RECORD.Match(text); - - if (match.Success) { - string attributeName = (match.Groups[1].Length > 0) ? - Unescape(Trim(match.Groups[1].ToString())) : null; - string attributeValue = Unescape(match.Groups[2].ToString()); - return new KeyValuePair(attributeName, attributeValue); - } else { - return new KeyValuePair(null, Unescape(text)); - } - } + public IEnumerable> Attributes { + get => + this.TextData.Select(chrStr => + { + var text = chrStr.ToString(); + Match match = PATTERN_TXT_RECORD.Match(text); + + if (match.Success) { + string attributeName = (match.Groups[1].Length > 0) ? + Unescape(Trim(match.Groups[1].ToString())) : null; + string attributeValue = Unescape(match.Groups[2].ToString()); + return new KeyValuePair(attributeName, attributeValue); + } else { + return new KeyValuePair(null, Unescape(text)); + } + }); } public string ToStringTextData() { @@ -81,7 +83,8 @@ public string ToStringTextData(Encoding encoding) { } public override string ToString() { - return Stringify().Add("TextData", (object) ToStringTextData()).ToString(); + var list = String.Join(" ", TextData.Select(c => c.ToString())); + return Stringify().Add("TextData", (object) list).ToString(); } } } diff --git a/Tests/Protocol/ResourceRecords/TextResourceRecordTest.cs b/Tests/Protocol/ResourceRecords/TextResourceRecordTest.cs index a4e80d9..a3725b1 100644 --- a/Tests/Protocol/ResourceRecords/TextResourceRecordTest.cs +++ b/Tests/Protocol/ResourceRecords/TextResourceRecordTest.cs @@ -4,6 +4,7 @@ using Xunit; using DNS.Protocol.ResourceRecords; using DNS.Protocol; +using System.Linq; namespace DNS.Tests.Protocol.ResourceRecords { @@ -21,7 +22,7 @@ public class TextResourceRecordTest { [InlineData("abc` =123 ", "abc ", "123 ")] public void Rfc1464Examples(string internalForm, string expAttributeName, string expAttributeValue) { TextResourceRecord record = new TextResourceRecord(new ArrayTextResourceRecord(internalForm)); - KeyValuePair attribute = record.Attribute; + KeyValuePair attribute = record.Attributes.First(); Assert.Equal(expAttributeName, attribute.Key); Assert.Equal(expAttributeValue, attribute.Value); } @@ -32,7 +33,7 @@ public void Rfc1464Examples(string internalForm, string expAttributeName, string [InlineData("", "", null, "")] public void NegativeExamples(string input, string expTxtData, string expAttributeName, string expAttributeValue) { TextResourceRecord record = new TextResourceRecord(new ArrayTextResourceRecord(input)); - KeyValuePair attribute = record.Attribute; + KeyValuePair attribute = record.Attributes.First(); Assert.Equal(expTxtData, record.ToStringTextData()); Assert.Equal(expAttributeName, attribute.Key);