diff --git a/Apps/Dns64App/App.cs b/Apps/Dns64App/App.cs index 39c9f682..f76d3ce3 100644 --- a/Apps/Dns64App/App.cs +++ b/Apps/Dns64App/App.cs @@ -18,12 +18,13 @@ along with this program. If not, see . */ using DnsServerCore.ApplicationCommon; -using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; +using System.Text.Json; using System.Threading.Tasks; +using TechnitiumLibrary; using TechnitiumLibrary.Net; using TechnitiumLibrary.Net.Dns; using TechnitiumLibrary.Net.Dns.ResourceRecords; @@ -60,41 +61,27 @@ namespace Dns64 { _dnsServer = dnsServer; - dynamic jsonConfig = JsonConvert.DeserializeObject(config); + using JsonDocument jsonDocument = JsonDocument.Parse(config); + JsonElement jsonConfig = jsonDocument.RootElement; - _enableDns64 = jsonConfig.enableDns64.Value; + _enableDns64 = jsonConfig.GetProperty("enableDns64").GetBoolean(); + _networkGroupMap = jsonConfig.ReadObjectAsMap("networkGroupMap", delegate (string network, JsonElement group) { - Dictionary networkGroupMap = new Dictionary(); + if (!NetworkAddress.TryParse(network, out NetworkAddress networkAddress)) + throw new InvalidOperationException("Network group map contains an invalid network address: " + network); - foreach (dynamic jsonProperty in jsonConfig.networkGroupMap) - { - string network = jsonProperty.Name; - string group = jsonProperty.Value; + if (networkAddress.Address.AddressFamily == AddressFamily.InterNetwork) + throw new InvalidOperationException("Network group map can only have IPv6 network addresses: " + network); - if (!NetworkAddress.TryParse(network, out NetworkAddress networkAddress)) - throw new InvalidOperationException("Network group map contains an invalid network address: " + network); - - if (networkAddress.Address.AddressFamily == AddressFamily.InterNetwork) - throw new InvalidOperationException("Network group map can only have IPv6 network addresses: " + network); - - networkGroupMap.Add(networkAddress, group); - } - - _networkGroupMap = networkGroupMap; - } + return new Tuple(networkAddress, group.GetString()); + }); + _groups = jsonConfig.ReadArrayAsMap("groups", delegate (JsonElement jsonGroup) { - Dictionary groups = new Dictionary(); - - foreach (dynamic jsonGroup in jsonConfig.groups) - { - Group group = new Group(jsonGroup); - groups.Add(group.Name, group); - } - - _groups = groups; - } + Group group = new Group(jsonGroup); + return new Tuple(group.Name, group); + }); return Task.CompletedTask; } @@ -275,61 +262,48 @@ namespace Dns64 #region constructor - public Group(dynamic jsonGroup) + public Group(JsonElement jsonGroup) { - _name = jsonGroup.name.Value; - _enableDns64 = jsonGroup.enableDns64.Value; + _name = jsonGroup.GetProperty("name").GetString(); + _enableDns64 = jsonGroup.GetProperty("enableDns64").GetBoolean(); + _dns64PrefixMap = jsonGroup.ReadObjectAsMap("dns64PrefixMap", delegate (string strNetwork, JsonElement jsonDns64Prefix) { - Dictionary dns64PrefixMap = new Dictionary(); + string strDns64Prefix = jsonDns64Prefix.GetString(); - foreach (dynamic jsonProperty in jsonGroup.dns64PrefixMap) + NetworkAddress network = NetworkAddress.Parse(strNetwork); + NetworkAddress dns64Prefix = null; + + if (strDns64Prefix is not null) { - string strNetwork = jsonProperty.Name; - string strDns64Prefix = jsonProperty.Value; + dns64Prefix = NetworkAddress.Parse(strDns64Prefix); - NetworkAddress network = NetworkAddress.Parse(strNetwork); - NetworkAddress dns64Prefix = null; - - if (strDns64Prefix is not null) + switch (dns64Prefix.PrefixLength) { - dns64Prefix = NetworkAddress.Parse(strDns64Prefix); + case 32: + case 40: + case 48: + case 56: + case 64: + case 96: + break; - switch (dns64Prefix.PrefixLength) - { - case 32: - case 40: - case 48: - case 56: - case 64: - case 96: - break; - - default: - throw new NotSupportedException("DNS64 prefix can have only the following prefixes: 32, 40, 48, 56, 64, or 96."); - } + default: + throw new NotSupportedException("DNS64 prefix can have only the following prefixes: 32, 40, 48, 56, 64, or 96."); } - - dns64PrefixMap.Add(network, dns64Prefix); } - _dns64PrefixMap = dns64PrefixMap; - } + return new Tuple(network, dns64Prefix); + }); + _excludedIpv6 = jsonGroup.ReadArray("excludedIpv6", delegate (string strNetworkAddress) { - List excludedIpv6 = new List(); + NetworkAddress networkAddress = NetworkAddress.Parse(strNetworkAddress); + if (networkAddress.Address.AddressFamily != AddressFamily.InterNetworkV6) + throw new InvalidOperationException("An IPv6 network address is expected for 'excludedIpv6' array."); - foreach (dynamic jsonItem in jsonGroup.excludedIpv6) - { - NetworkAddress networkAddress = NetworkAddress.Parse(jsonItem.Value); - if (networkAddress.Address.AddressFamily != AddressFamily.InterNetworkV6) - throw new InvalidOperationException("An IPv6 network address is expected for 'excludedIpv6' array."); - - excludedIpv6.Add(networkAddress); - } - - _excludedIpv6 = excludedIpv6; - } + return networkAddress; + }); } #endregion