diff --git a/Apps/GeoCountryApp/Address.cs b/Apps/GeoCountryApp/Address.cs index ade2a668..6c5d9c3a 100644 --- a/Apps/GeoCountryApp/Address.cs +++ b/Apps/GeoCountryApp/Address.cs @@ -19,10 +19,10 @@ along with this program. If not, see . using DnsServerCore.ApplicationCommon; using MaxMind.GeoIP2.Responses; -using Newtonsoft.Json; using System.Collections.Generic; using System.Net; using System.Net.Sockets; +using System.Text.Json; using System.Threading.Tasks; using TechnitiumLibrary; using TechnitiumLibrary.Net.Dns; @@ -82,86 +82,87 @@ namespace GeoCountry { case DnsResourceRecordType.A: case DnsResourceRecordType.AAAA: - dynamic jsonAppRecordData = JsonConvert.DeserializeObject(appRecordData); - dynamic jsonCountry = null; - - bool ecsUsed = false; - EDnsClientSubnetOptionData requestECS = request.GetEDnsClientSubnetOption(); - if (requestECS is not null) + using (JsonDocument jsonDocument = JsonDocument.Parse(appRecordData)) { - if (_maxMind.DatabaseReader.TryCountry(requestECS.Address, out CountryResponse csResponse)) + JsonElement jsonAppRecordData = jsonDocument.RootElement; + JsonElement jsonCountry = default; + + bool ecsUsed = false; + EDnsClientSubnetOptionData requestECS = request.GetEDnsClientSubnetOption(); + if (requestECS is not null) { - ecsUsed = true; - jsonCountry = jsonAppRecordData[csResponse.Country.IsoCode]; - if (jsonCountry is null) - jsonCountry = jsonAppRecordData["default"]; + if (_maxMind.DatabaseReader.TryCountry(requestECS.Address, out CountryResponse csResponse)) + { + ecsUsed = true; + if (!jsonAppRecordData.TryGetProperty(csResponse.Country.IsoCode, out jsonCountry)) + jsonAppRecordData.TryGetProperty("default", out jsonCountry); + } } - } - if (jsonCountry is null) - { - if (_maxMind.DatabaseReader.TryCountry(remoteEP.Address, out CountryResponse response)) + if (jsonCountry.ValueKind == JsonValueKind.Undefined) { - jsonCountry = jsonAppRecordData[response.Country.IsoCode]; - if (jsonCountry is null) - jsonCountry = jsonAppRecordData["default"]; + if (_maxMind.DatabaseReader.TryCountry(remoteEP.Address, out CountryResponse response)) + { + if (!jsonAppRecordData.TryGetProperty(response.Country.IsoCode, out jsonCountry)) + jsonAppRecordData.TryGetProperty("default", out jsonCountry); + } + else + { + jsonAppRecordData.TryGetProperty("default", out jsonCountry); + } + + if (jsonCountry.ValueKind == JsonValueKind.Undefined) + return Task.FromResult(null); + } + + List answers = new List(); + + switch (question.Type) + { + case DnsResourceRecordType.A: + foreach (JsonElement jsonAddress in jsonCountry.EnumerateArray()) + { + IPAddress address = IPAddress.Parse(jsonAddress.GetString()); + + if (address.AddressFamily == AddressFamily.InterNetwork) + answers.Add(new DnsResourceRecord(question.Name, DnsResourceRecordType.A, DnsClass.IN, appRecordTtl, new DnsARecordData(address))); + } + break; + + case DnsResourceRecordType.AAAA: + foreach (JsonElement jsonAddress in jsonCountry.EnumerateArray()) + { + IPAddress address = IPAddress.Parse(jsonAddress.GetString()); + + if (address.AddressFamily == AddressFamily.InterNetworkV6) + answers.Add(new DnsResourceRecord(question.Name, DnsResourceRecordType.AAAA, DnsClass.IN, appRecordTtl, new DnsAAAARecordData(address))); + } + break; + } + + if (answers.Count == 0) + return Task.FromResult(null); + + if (answers.Count > 1) + answers.Shuffle(); + + EDnsOption[] options; + + if (requestECS is null) + { + options = null; } else { - jsonCountry = jsonAppRecordData["default"]; + if (ecsUsed) + options = EDnsClientSubnetOptionData.GetEDnsClientSubnetOption(requestECS.SourcePrefixLength, requestECS.SourcePrefixLength, requestECS.Address); + else + options = EDnsClientSubnetOptionData.GetEDnsClientSubnetOption(requestECS.SourcePrefixLength, 0, requestECS.Address); } + + return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, isRecursionAllowed, false, false, DnsResponseCode.NoError, request.Question, answers, null, null, _dnsServer.UdpPayloadSize, EDnsHeaderFlags.None, options)); } - if (jsonCountry is null) - return Task.FromResult(null); - - List answers = new List(); - - switch (question.Type) - { - case DnsResourceRecordType.A: - foreach (dynamic jsonAddress in jsonCountry) - { - IPAddress address = IPAddress.Parse(jsonAddress.Value); - - if (address.AddressFamily == AddressFamily.InterNetwork) - answers.Add(new DnsResourceRecord(question.Name, DnsResourceRecordType.A, DnsClass.IN, appRecordTtl, new DnsARecordData(address))); - } - break; - - case DnsResourceRecordType.AAAA: - foreach (dynamic jsonAddress in jsonCountry) - { - IPAddress address = IPAddress.Parse(jsonAddress.Value); - - if (address.AddressFamily == AddressFamily.InterNetworkV6) - answers.Add(new DnsResourceRecord(question.Name, DnsResourceRecordType.AAAA, DnsClass.IN, appRecordTtl, new DnsAAAARecordData(address))); - } - break; - } - - if (answers.Count == 0) - return Task.FromResult(null); - - if (answers.Count > 1) - answers.Shuffle(); - - EDnsOption[] options; - - if (requestECS is null) - { - options = null; - } - else - { - if (ecsUsed) - options = EDnsClientSubnetOptionData.GetEDnsClientSubnetOption(requestECS.SourcePrefixLength, requestECS.SourcePrefixLength, requestECS.AddressValue); - else - options = EDnsClientSubnetOptionData.GetEDnsClientSubnetOption(requestECS.SourcePrefixLength, 0, requestECS.AddressValue); - } - - return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, isRecursionAllowed, false, false, DnsResponseCode.NoError, request.Question, answers, null, null, _dnsServer.UdpPayloadSize, EDnsHeaderFlags.None, options)); - default: return Task.FromResult(null); } diff --git a/Apps/GeoCountryApp/CNAME.cs b/Apps/GeoCountryApp/CNAME.cs index 237b06e3..46440915 100644 --- a/Apps/GeoCountryApp/CNAME.cs +++ b/Apps/GeoCountryApp/CNAME.cs @@ -19,10 +19,10 @@ along with this program. If not, see . using DnsServerCore.ApplicationCommon; using MaxMind.GeoIP2.Responses; -using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Net; +using System.Text.Json; using System.Threading.Tasks; using TechnitiumLibrary.Net.Dns; using TechnitiumLibrary.Net.Dns.EDnsOptions; @@ -76,8 +76,9 @@ namespace GeoCountry public Task ProcessRequestAsync(DnsDatagram request, IPEndPoint remoteEP, DnsTransportProtocol protocol, bool isRecursionAllowed, string zoneName, string appRecordName, uint appRecordTtl, string appRecordData) { - dynamic jsonAppRecordData = JsonConvert.DeserializeObject(appRecordData); - dynamic jsonCountry = null; + using JsonDocument jsonDocument = JsonDocument.Parse(appRecordData); + JsonElement jsonAppRecordData = jsonDocument.RootElement; + JsonElement jsonCountry = default; bool ecsUsed = false; EDnsClientSubnetOptionData requestECS = request.GetEDnsClientSubnetOption(); @@ -86,30 +87,28 @@ namespace GeoCountry if (_maxMind.DatabaseReader.TryCountry(requestECS.Address, out CountryResponse csResponse)) { ecsUsed = true; - jsonCountry = jsonAppRecordData[csResponse.Country.IsoCode]; - if (jsonCountry is null) - jsonCountry = jsonAppRecordData["default"]; + if (!jsonAppRecordData.TryGetProperty(csResponse.Country.IsoCode, out jsonCountry)) + jsonAppRecordData.TryGetProperty("default", out jsonCountry); } } - if (jsonCountry is null) + if (jsonCountry.ValueKind == JsonValueKind.Undefined) { if (_maxMind.DatabaseReader.TryCountry(remoteEP.Address, out CountryResponse response)) { - jsonCountry = jsonAppRecordData[response.Country.IsoCode]; - if (jsonCountry is null) - jsonCountry = jsonAppRecordData["default"]; + if (!jsonAppRecordData.TryGetProperty(response.Country.IsoCode, out jsonCountry)) + jsonAppRecordData.TryGetProperty("default", out jsonCountry); } else { - jsonCountry = jsonAppRecordData["default"]; + jsonAppRecordData.TryGetProperty("default", out jsonCountry); } + + if (jsonCountry.ValueKind == JsonValueKind.Undefined) + return Task.FromResult(null); } - if (jsonCountry is null) - return Task.FromResult(null); - - string cname = jsonCountry.Value; + string cname = jsonCountry.GetString(); if (string.IsNullOrEmpty(cname)) return Task.FromResult(null); @@ -129,9 +128,9 @@ namespace GeoCountry else { if (ecsUsed) - options = EDnsClientSubnetOptionData.GetEDnsClientSubnetOption(requestECS.SourcePrefixLength, requestECS.SourcePrefixLength, requestECS.AddressValue); + options = EDnsClientSubnetOptionData.GetEDnsClientSubnetOption(requestECS.SourcePrefixLength, requestECS.SourcePrefixLength, requestECS.Address); else - options = EDnsClientSubnetOptionData.GetEDnsClientSubnetOption(requestECS.SourcePrefixLength, 0, requestECS.AddressValue); + options = EDnsClientSubnetOptionData.GetEDnsClientSubnetOption(requestECS.SourcePrefixLength, 0, requestECS.Address); } return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, isRecursionAllowed, false, false, DnsResponseCode.NoError, request.Question, answers, null, null, _dnsServer.UdpPayloadSize, EDnsHeaderFlags.None, options));