mirror of
https://github.com/fergalmoran/DnsServer.git
synced 2026-05-27 13:36:06 +00:00
GeoCountry: removed netwonsoft.
This commit is contained in:
@@ -19,10 +19,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
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<DnsDatagram>(null);
|
||||
}
|
||||
|
||||
List<DnsResourceRecord> answers = new List<DnsResourceRecord>();
|
||||
|
||||
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<DnsDatagram>(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<DnsDatagram>(null);
|
||||
|
||||
List<DnsResourceRecord> answers = new List<DnsResourceRecord>();
|
||||
|
||||
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<DnsDatagram>(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<DnsDatagram>(null);
|
||||
}
|
||||
|
||||
@@ -19,10 +19,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
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<DnsDatagram> 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<DnsDatagram>(null);
|
||||
}
|
||||
|
||||
if (jsonCountry is null)
|
||||
return Task.FromResult<DnsDatagram>(null);
|
||||
|
||||
string cname = jsonCountry.Value;
|
||||
string cname = jsonCountry.GetString();
|
||||
if (string.IsNullOrEmpty(cname))
|
||||
return Task.FromResult<DnsDatagram>(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));
|
||||
|
||||
Reference in New Issue
Block a user