diff --git a/DnsServerCore/WebServiceZonesApi.cs b/DnsServerCore/WebServiceZonesApi.cs index 279b9800..f25be4df 100644 --- a/DnsServerCore/WebServiceZonesApi.cs +++ b/DnsServerCore/WebServiceZonesApi.cs @@ -1,6 +1,6 @@ /* Technitium DNS Server -Copyright (C) 2022 Shreyas Zare (shreyas@technitium.com) +Copyright (C) 2023 Shreyas Zare (shreyas@technitium.com) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -22,12 +22,14 @@ using DnsServerCore.Dns; using DnsServerCore.Dns.Dnssec; using DnsServerCore.Dns.ResourceRecords; using DnsServerCore.Dns.Zones; +using Microsoft.AspNetCore.Http; using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Text.Json; using System.Threading.Tasks; +using TechnitiumLibrary; using TechnitiumLibrary.Net; using TechnitiumLibrary.Net.Dns; using TechnitiumLibrary.Net.Dns.ResourceRecords; @@ -679,12 +681,17 @@ namespace DnsServerCore #region public - public void ListZones(HttpListenerRequest request, Utf8JsonWriter jsonWriter) + public void ListZones(HttpContext context) { + UserSession session = context.GetCurrentSession(); + + if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.View)) + throw new DnsWebServiceException("Access was denied."); + List zones = _dnsWebService._dnsServer.AuthZoneManager.ListZones(); zones.Sort(); - UserSession session = _dnsWebService.GetSession(request); + Utf8JsonWriter jsonWriter = context.GetCurrentJsonWriter(); jsonWriter.WritePropertyName("zones"); jsonWriter.WriteStartArray(); @@ -700,15 +707,16 @@ namespace DnsServerCore jsonWriter.WriteEndArray(); } - public async Task CreateZoneAsync(HttpListenerRequest request, Utf8JsonWriter jsonWriter) + public async Task CreateZoneAsync(HttpContext context) { - string zoneName = request.QueryString["zone"]; - if (string.IsNullOrEmpty(zoneName)) - zoneName = request.QueryString["domain"]; + UserSession session = context.GetCurrentSession(); - if (string.IsNullOrEmpty(zoneName)) - throw new DnsWebServiceException("Parameter 'zone' missing."); + if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify)) + throw new DnsWebServiceException("Access was denied."); + HttpRequest request = context.Request; + + string zoneName = request.GetQueryAlt("zone", "domain"); if (zoneName.Contains('*')) throw new DnsWebServiceException("Domain name for a zone cannot contain wildcard character."); @@ -727,11 +735,7 @@ namespace DnsServerCore zoneName = zoneName.Substring(0, zoneName.Length - 1); } - AuthZoneType type = AuthZoneType.Primary; - string strType = request.QueryString["type"]; - if (!string.IsNullOrEmpty(strType)) - type = Enum.Parse(strType, true); - + AuthZoneType type = request.GetQuery("type", AuthZoneType.Primary); AuthZoneInfo zoneInfo; switch (type) @@ -742,97 +746,63 @@ namespace DnsServerCore if (zoneInfo is null) throw new DnsWebServiceException("Zone already exists: " + zoneName); - UserSession session = _dnsWebService.GetSession(request); - //set permissions _dnsWebService._authManager.SetPermission(PermissionSection.Zones, zoneInfo.Name, session.User, PermissionFlag.ViewModifyDelete); _dnsWebService._authManager.SetPermission(PermissionSection.Zones, zoneInfo.Name, _dnsWebService._authManager.GetGroup(Group.ADMINISTRATORS), PermissionFlag.ViewModifyDelete); _dnsWebService._authManager.SetPermission(PermissionSection.Zones, zoneInfo.Name, _dnsWebService._authManager.GetGroup(Group.DNS_ADMINISTRATORS), PermissionFlag.ViewModifyDelete); _dnsWebService._authManager.SaveConfigFile(); - _dnsWebService._log.Write(DnsWebService.GetRequestRemoteEndPoint(request), "[" + session.User.Username + "] Authoritative primary zone was created: " + zoneName); + _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] Authoritative primary zone was created: " + zoneName); _dnsWebService._dnsServer.AuthZoneManager.SaveZoneFile(zoneInfo.Name); } break; case AuthZoneType.Secondary: { - string primaryNameServerAddresses = request.QueryString["primaryNameServerAddresses"]; - if (string.IsNullOrEmpty(primaryNameServerAddresses)) - primaryNameServerAddresses = null; - - DnsTransportProtocol zoneTransferProtocol; - - string strZoneTransferProtocol = request.QueryString["zoneTransferProtocol"]; - if (string.IsNullOrEmpty(strZoneTransferProtocol)) - zoneTransferProtocol = DnsTransportProtocol.Tcp; - else - zoneTransferProtocol = Enum.Parse(strZoneTransferProtocol, true); - - string tsigKeyName = request.QueryString["tsigKeyName"]; - if (string.IsNullOrEmpty(tsigKeyName)) - tsigKeyName = null; + string primaryNameServerAddresses = request.GetQuery("primaryNameServerAddresses", null); + DnsTransportProtocol zoneTransferProtocol = request.GetQuery("zoneTransferProtocol", DnsTransportProtocol.Tcp); + string tsigKeyName = request.GetQuery("tsigKeyName", null); zoneInfo = await _dnsWebService._dnsServer.AuthZoneManager.CreateSecondaryZoneAsync(zoneName, primaryNameServerAddresses, zoneTransferProtocol, tsigKeyName); if (zoneInfo is null) throw new DnsWebServiceException("Zone already exists: " + zoneName); - UserSession session = _dnsWebService.GetSession(request); - //set permissions _dnsWebService._authManager.SetPermission(PermissionSection.Zones, zoneInfo.Name, session.User, PermissionFlag.ViewModifyDelete); _dnsWebService._authManager.SetPermission(PermissionSection.Zones, zoneInfo.Name, _dnsWebService._authManager.GetGroup(Group.ADMINISTRATORS), PermissionFlag.ViewModifyDelete); _dnsWebService._authManager.SetPermission(PermissionSection.Zones, zoneInfo.Name, _dnsWebService._authManager.GetGroup(Group.DNS_ADMINISTRATORS), PermissionFlag.ViewModifyDelete); _dnsWebService._authManager.SaveConfigFile(); - _dnsWebService._log.Write(DnsWebService.GetRequestRemoteEndPoint(request), "[" + session.User.Username + "] Authoritative secondary zone was created: " + zoneName); + _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] Authoritative secondary zone was created: " + zoneName); _dnsWebService._dnsServer.AuthZoneManager.SaveZoneFile(zoneInfo.Name); } break; case AuthZoneType.Stub: { - string strPrimaryNameServerAddresses = request.QueryString["primaryNameServerAddresses"]; - if (string.IsNullOrEmpty(strPrimaryNameServerAddresses)) - strPrimaryNameServerAddresses = null; + string primaryNameServerAddresses = request.GetQuery("primaryNameServerAddresses", null); - zoneInfo = await _dnsWebService._dnsServer.AuthZoneManager.CreateStubZoneAsync(zoneName, strPrimaryNameServerAddresses); + zoneInfo = await _dnsWebService._dnsServer.AuthZoneManager.CreateStubZoneAsync(zoneName, primaryNameServerAddresses); if (zoneInfo is null) throw new DnsWebServiceException("Zone already exists: " + zoneName); - UserSession session = _dnsWebService.GetSession(request); - //set permissions _dnsWebService._authManager.SetPermission(PermissionSection.Zones, zoneInfo.Name, session.User, PermissionFlag.ViewModifyDelete); _dnsWebService._authManager.SetPermission(PermissionSection.Zones, zoneInfo.Name, _dnsWebService._authManager.GetGroup(Group.ADMINISTRATORS), PermissionFlag.ViewModifyDelete); _dnsWebService._authManager.SetPermission(PermissionSection.Zones, zoneInfo.Name, _dnsWebService._authManager.GetGroup(Group.DNS_ADMINISTRATORS), PermissionFlag.ViewModifyDelete); _dnsWebService._authManager.SaveConfigFile(); - _dnsWebService._log.Write(DnsWebService.GetRequestRemoteEndPoint(request), "[" + session.User.Username + "] Stub zone was created: " + zoneName); + _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] Stub zone was created: " + zoneName); _dnsWebService._dnsServer.AuthZoneManager.SaveZoneFile(zoneInfo.Name); } break; case AuthZoneType.Forwarder: { - DnsTransportProtocol forwarderProtocol = DnsTransportProtocol.Udp; - string strForwarderProtocol = request.QueryString["protocol"]; - if (!string.IsNullOrEmpty(strForwarderProtocol)) - forwarderProtocol = Enum.Parse(strForwarderProtocol, true); - - string strForwarder = request.QueryString["forwarder"]; - if (string.IsNullOrEmpty(strForwarder)) - throw new DnsWebServiceException("Parameter 'forwarder' missing."); - - bool dnssecValidation = false; - string strDnssecValidation = request.QueryString["dnssecValidation"]; - if (!string.IsNullOrEmpty(strDnssecValidation)) - dnssecValidation = bool.Parse(strDnssecValidation); - - NetProxyType proxyType = NetProxyType.None; - string strProxyType = request.QueryString["proxyType"]; - if (!string.IsNullOrEmpty(strProxyType)) - proxyType = Enum.Parse(strProxyType, true); + DnsTransportProtocol forwarderProtocol = request.GetQuery("protocol", DnsTransportProtocol.Udp); + string forwarder = request.GetQuery("forwarder"); + bool dnssecValidation = request.GetQuery("dnssecValidation", bool.Parse, false); + NetProxyType proxyType = request.GetQuery("proxyType", NetProxyType.None); string proxyAddress = null; ushort proxyPort = 0; @@ -841,32 +811,23 @@ namespace DnsServerCore if (proxyType != NetProxyType.None) { - proxyAddress = request.QueryString["proxyAddress"]; - if (string.IsNullOrEmpty(proxyAddress)) - throw new DnsWebServiceException("Parameter 'proxyAddress' missing."); - - string strProxyPort = request.QueryString["proxyPort"]; - if (string.IsNullOrEmpty(strProxyPort)) - throw new DnsWebServiceException("Parameter 'proxyPort' missing."); - - proxyPort = ushort.Parse(strProxyPort); - proxyUsername = request.QueryString["proxyUsername"]; - proxyPassword = request.QueryString["proxyPassword"]; + proxyAddress = request.GetQuery("proxyAddress"); + proxyPort = request.GetQuery("proxyPort", ushort.Parse); + proxyUsername = request.Query["proxyUsername"]; + proxyPassword = request.Query["proxyPassword"]; } - zoneInfo = _dnsWebService._dnsServer.AuthZoneManager.CreateForwarderZone(zoneName, forwarderProtocol, strForwarder, dnssecValidation, proxyType, proxyAddress, proxyPort, proxyUsername, proxyPassword, null); + zoneInfo = _dnsWebService._dnsServer.AuthZoneManager.CreateForwarderZone(zoneName, forwarderProtocol, forwarder, dnssecValidation, proxyType, proxyAddress, proxyPort, proxyUsername, proxyPassword, null); if (zoneInfo is null) throw new DnsWebServiceException("Zone already exists: " + zoneName); - UserSession session = _dnsWebService.GetSession(request); - //set permissions _dnsWebService._authManager.SetPermission(PermissionSection.Zones, zoneInfo.Name, session.User, PermissionFlag.ViewModifyDelete); _dnsWebService._authManager.SetPermission(PermissionSection.Zones, zoneInfo.Name, _dnsWebService._authManager.GetGroup(Group.ADMINISTRATORS), PermissionFlag.ViewModifyDelete); _dnsWebService._authManager.SetPermission(PermissionSection.Zones, zoneInfo.Name, _dnsWebService._authManager.GetGroup(Group.DNS_ADMINISTRATORS), PermissionFlag.ViewModifyDelete); _dnsWebService._authManager.SaveConfigFile(); - _dnsWebService._log.Write(DnsWebService.GetRequestRemoteEndPoint(request), "[" + session.User.Username + "] Forwarder zone was created: " + zoneName); + _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] Forwarder zone was created: " + zoneName); _dnsWebService._dnsServer.AuthZoneManager.SaveZoneFile(zoneInfo.Name); } break; @@ -878,42 +839,30 @@ namespace DnsServerCore //delete cache for this zone to allow rebuilding cache data as needed by stub or forwarder zones _dnsWebService._dnsServer.CacheZoneManager.DeleteZone(zoneInfo.Name); + Utf8JsonWriter jsonWriter = context.GetCurrentJsonWriter(); jsonWriter.WriteString("domain", string.IsNullOrEmpty(zoneInfo.Name) ? "." : zoneInfo.Name); } - public void SignPrimaryZone(HttpListenerRequest request) + public void SignPrimaryZone(HttpContext context) { - string zoneName = request.QueryString["zone"]; - if (string.IsNullOrEmpty(zoneName)) - throw new DnsWebServiceException("Parameter 'zone' missing."); + UserSession session = context.GetCurrentSession(); - zoneName = zoneName.TrimEnd('.'); + if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify)) + throw new DnsWebServiceException("Access was denied."); - UserSession session = _dnsWebService.GetSession(request); + HttpRequest request = context.Request; + + string zoneName = request.GetQuery("zone").TrimEnd('.'); if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneName, session.User, PermissionFlag.Delete)) throw new DnsWebServiceException("Access was denied."); - string algorithm = request.QueryString["algorithm"]; - if (string.IsNullOrEmpty(algorithm)) - throw new DnsWebServiceException("Parameter 'algorithm' missing."); - - uint dnsKeyTtl; - string strDnsKeyTtl = request.QueryString["dnsKeyTtl"]; - if (string.IsNullOrEmpty(strDnsKeyTtl)) - dnsKeyTtl = 24 * 60 * 60; - else - dnsKeyTtl = uint.Parse(strDnsKeyTtl); - - ushort zskRolloverDays; - string strZskRolloverDays = request.QueryString["zskRolloverDays"]; - if (string.IsNullOrEmpty(strZskRolloverDays)) - zskRolloverDays = 90; - else - zskRolloverDays = ushort.Parse(strZskRolloverDays); + string algorithm = request.GetQuery("algorithm"); + uint dnsKeyTtl = request.GetQuery("dnsKeyTtl", uint.Parse, 24 * 60 * 60); + ushort zskRolloverDays = request.GetQuery("zskRolloverDays", ushort.Parse, 90); bool useNSEC3 = false; - string strNxProof = request.QueryString["nxProof"]; + string strNxProof = request.Query["nxProof"]; if (!string.IsNullOrEmpty(strNxProof)) { switch (strNxProof.ToUpper()) @@ -936,32 +885,16 @@ namespace DnsServerCore if (useNSEC3) { - string strIterations = request.QueryString["iterations"]; - if (!string.IsNullOrEmpty(strIterations)) - iterations = ushort.Parse(strIterations); - - string strSaltLength = request.QueryString["saltLength"]; - if (!string.IsNullOrEmpty(strSaltLength)) - saltLength = byte.Parse(strSaltLength); + iterations = request.GetQuery("iterations", ushort.Parse, 0); + saltLength = request.GetQuery("saltLength", byte.Parse, 0); } switch (algorithm.ToUpper()) { case "RSA": - string hashAlgorithm = request.QueryString["hashAlgorithm"]; - if (string.IsNullOrEmpty(hashAlgorithm)) - throw new DnsWebServiceException("Parameter 'hashAlgorithm' missing."); - - string strKSKKeySize = request.QueryString["kskKeySize"]; - if (string.IsNullOrEmpty(strKSKKeySize)) - throw new DnsWebServiceException("Parameter 'kskKeySize' missing."); - - string strZSKKeySize = request.QueryString["zskKeySize"]; - if (string.IsNullOrEmpty(strZSKKeySize)) - throw new DnsWebServiceException("Parameter 'zskKeySize' missing."); - - int kskKeySize = int.Parse(strKSKKeySize); - int zskKeySize = int.Parse(strZSKKeySize); + string hashAlgorithm = request.GetQuery("hashAlgorithm"); + int kskKeySize = request.GetQuery("kskKeySize", int.Parse); + int zskKeySize = request.GetQuery("zskKeySize", int.Parse); if (useNSEC3) _dnsWebService._dnsServer.AuthZoneManager.SignPrimaryZoneWithRsaNSEC3(zoneName, hashAlgorithm, kskKeySize, zskKeySize, iterations, saltLength, dnsKeyTtl, zskRolloverDays); @@ -971,9 +904,7 @@ namespace DnsServerCore break; case "ECDSA": - string curve = request.QueryString["curve"]; - if (string.IsNullOrEmpty(curve)) - throw new DnsWebServiceException("Parameter 'curve' missing."); + string curve = request.GetQuery("curve"); if (useNSEC3) _dnsWebService._dnsServer.AuthZoneManager.SignPrimaryZoneWithEcdsaNSEC3(zoneName, curve, iterations, saltLength, dnsKeyTtl, zskRolloverDays); @@ -986,38 +917,38 @@ namespace DnsServerCore throw new NotSupportedException("Algorithm is not supported: " + algorithm); } - _dnsWebService._log.Write(DnsWebService.GetRequestRemoteEndPoint(request), "[" + session.User.Username + "] Primary zone was signed successfully: " + zoneName); + _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] Primary zone was signed successfully: " + zoneName); _dnsWebService._dnsServer.AuthZoneManager.SaveZoneFile(zoneName); } - public void UnsignPrimaryZone(HttpListenerRequest request) + public void UnsignPrimaryZone(HttpContext context) { - string zoneName = request.QueryString["zone"]; - if (string.IsNullOrEmpty(zoneName)) - throw new DnsWebServiceException("Parameter 'zone' missing."); + UserSession session = context.GetCurrentSession(); - zoneName = zoneName.TrimEnd('.'); + if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify)) + throw new DnsWebServiceException("Access was denied."); - UserSession session = _dnsWebService.GetSession(request); + string zoneName = context.Request.GetQuery("zone").TrimEnd('.'); if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneName, session.User, PermissionFlag.Delete)) throw new DnsWebServiceException("Access was denied."); _dnsWebService._dnsServer.AuthZoneManager.UnsignPrimaryZone(zoneName); - _dnsWebService._log.Write(DnsWebService.GetRequestRemoteEndPoint(request), "[" + session.User.Username + "] Primary zone was unsigned successfully: " + zoneName); + _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] Primary zone was unsigned successfully: " + zoneName); _dnsWebService._dnsServer.AuthZoneManager.SaveZoneFile(zoneName); } - public void GetPrimaryZoneDnssecProperties(HttpListenerRequest request, Utf8JsonWriter jsonWriter) + public void GetPrimaryZoneDnssecProperties(HttpContext context) { - string zoneName = request.QueryString["zone"]; - if (string.IsNullOrEmpty(zoneName)) - throw new DnsWebServiceException("Parameter 'zone' missing."); + UserSession session = context.GetCurrentSession(); - zoneName = zoneName.TrimEnd('.'); + if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify)) + throw new DnsWebServiceException("Access was denied."); + + string zoneName = context.Request.GetQuery("zone").TrimEnd('.'); AuthZoneInfo zoneInfo = _dnsWebService._dnsServer.AuthZoneManager.GetAuthZoneInfo(zoneName); if (zoneInfo is null) @@ -1029,11 +960,11 @@ namespace DnsServerCore if (zoneInfo.Type != AuthZoneType.Primary) throw new DnsWebServiceException("The zone must be a primary zone."); - UserSession session = _dnsWebService.GetSession(request); - if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneInfo.Name, session.User, PermissionFlag.View)) throw new DnsWebServiceException("Access was denied."); + Utf8JsonWriter jsonWriter = context.GetCurrentJsonWriter(); + jsonWriter.WriteString("name", zoneInfo.Name); jsonWriter.WriteString("type", zoneInfo.Type.ToString()); jsonWriter.WriteBoolean("internal", zoneInfo.Internal); @@ -1106,162 +1037,125 @@ namespace DnsServerCore jsonWriter.WriteEndArray(); } - public void ConvertPrimaryZoneToNSEC(HttpListenerRequest request) + public void ConvertPrimaryZoneToNSEC(HttpContext context) { - string zoneName = request.QueryString["zone"]; - if (string.IsNullOrEmpty(zoneName)) - throw new DnsWebServiceException("Parameter 'zone' missing."); + UserSession session = context.GetCurrentSession(); - zoneName = zoneName.TrimEnd('.'); + if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify)) + throw new DnsWebServiceException("Access was denied."); - UserSession session = _dnsWebService.GetSession(request); + string zoneName = context.Request.GetQuery("zone").TrimEnd('.'); if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneName, session.User, PermissionFlag.Delete)) throw new DnsWebServiceException("Access was denied."); _dnsWebService._dnsServer.AuthZoneManager.ConvertPrimaryZoneToNSEC(zoneName); - _dnsWebService._log.Write(DnsWebService.GetRequestRemoteEndPoint(request), "[" + session.User.Username + "] Primary zone was converted to NSEC successfully: " + zoneName); + _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] Primary zone was converted to NSEC successfully: " + zoneName); _dnsWebService._dnsServer.AuthZoneManager.SaveZoneFile(zoneName); } - public void ConvertPrimaryZoneToNSEC3(HttpListenerRequest request) + public void ConvertPrimaryZoneToNSEC3(HttpContext context) { - string zoneName = request.QueryString["zone"]; - if (string.IsNullOrEmpty(zoneName)) - throw new DnsWebServiceException("Parameter 'zone' missing."); + UserSession session = context.GetCurrentSession(); - zoneName = zoneName.TrimEnd('.'); + if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify)) + throw new DnsWebServiceException("Access was denied."); - UserSession session = _dnsWebService.GetSession(request); + HttpRequest request = context.Request; + + string zoneName = request.GetQuery("zone").TrimEnd('.'); if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneName, session.User, PermissionFlag.Delete)) throw new DnsWebServiceException("Access was denied."); - ushort iterations = 0; - string strIterations = request.QueryString["iterations"]; - if (!string.IsNullOrEmpty(strIterations)) - iterations = ushort.Parse(strIterations); - - byte saltLength = 0; - string strSaltLength = request.QueryString["saltLength"]; - if (!string.IsNullOrEmpty(strSaltLength)) - saltLength = byte.Parse(strSaltLength); + ushort iterations = request.GetQuery("iterations", ushort.Parse, 0); + byte saltLength = request.GetQuery("saltLength", byte.Parse, 0); _dnsWebService._dnsServer.AuthZoneManager.ConvertPrimaryZoneToNSEC3(zoneName, iterations, saltLength); - _dnsWebService._log.Write(DnsWebService.GetRequestRemoteEndPoint(request), "[" + session.User.Username + "] Primary zone was converted to NSEC3 successfully: " + zoneName); + _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] Primary zone was converted to NSEC3 successfully: " + zoneName); _dnsWebService._dnsServer.AuthZoneManager.SaveZoneFile(zoneName); } - public void UpdatePrimaryZoneNSEC3Parameters(HttpListenerRequest request) + public void UpdatePrimaryZoneNSEC3Parameters(HttpContext context) { - string zoneName = request.QueryString["zone"]; - if (string.IsNullOrEmpty(zoneName)) - throw new DnsWebServiceException("Parameter 'zone' missing."); + UserSession session = context.GetCurrentSession(); - zoneName = zoneName.TrimEnd('.'); + if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify)) + throw new DnsWebServiceException("Access was denied."); - UserSession session = _dnsWebService.GetSession(request); + HttpRequest request = context.Request; + + string zoneName = request.GetQuery("zone").TrimEnd('.'); if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneName, session.User, PermissionFlag.Delete)) throw new DnsWebServiceException("Access was denied."); - ushort iterations = 0; - string strIterations = request.QueryString["iterations"]; - if (!string.IsNullOrEmpty(strIterations)) - iterations = ushort.Parse(strIterations); - - byte saltLength = 0; - string strSaltLength = request.QueryString["saltLength"]; - if (!string.IsNullOrEmpty(strSaltLength)) - saltLength = byte.Parse(strSaltLength); + ushort iterations = request.GetQuery("iterations", ushort.Parse, 0); + byte saltLength = request.GetQuery("saltLength", byte.Parse, 0); _dnsWebService._dnsServer.AuthZoneManager.UpdatePrimaryZoneNSEC3Parameters(zoneName, iterations, saltLength); - _dnsWebService._log.Write(DnsWebService.GetRequestRemoteEndPoint(request), "[" + session.User.Username + "] Primary zone NSEC3 parameters were updated successfully: " + zoneName); + _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] Primary zone NSEC3 parameters were updated successfully: " + zoneName); _dnsWebService._dnsServer.AuthZoneManager.SaveZoneFile(zoneName); } - public void UpdatePrimaryZoneDnssecDnsKeyTtl(HttpListenerRequest request) + public void UpdatePrimaryZoneDnssecDnsKeyTtl(HttpContext context) { - string zoneName = request.QueryString["zone"]; - if (string.IsNullOrEmpty(zoneName)) - throw new DnsWebServiceException("Parameter 'zone' missing."); + UserSession session = context.GetCurrentSession(); - zoneName = zoneName.TrimEnd('.'); + if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify)) + throw new DnsWebServiceException("Access was denied."); - UserSession session = _dnsWebService.GetSession(request); + HttpRequest request = context.Request; + + string zoneName = request.GetQuery("zone").TrimEnd('.'); if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneName, session.User, PermissionFlag.Delete)) throw new DnsWebServiceException("Access was denied."); - string strDnsKeyTtl = request.QueryString["ttl"]; - if (string.IsNullOrEmpty(strDnsKeyTtl)) - throw new DnsWebServiceException("Parameter 'ttl' missing."); - - uint dnsKeyTtl = uint.Parse(strDnsKeyTtl); + uint dnsKeyTtl = request.GetQuery("ttl", uint.Parse); _dnsWebService._dnsServer.AuthZoneManager.UpdatePrimaryZoneDnsKeyTtl(zoneName, dnsKeyTtl); - _dnsWebService._log.Write(DnsWebService.GetRequestRemoteEndPoint(request), "[" + session.User.Username + "] Primary zone DNSKEY TTL was updated successfully: " + zoneName); + _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] Primary zone DNSKEY TTL was updated successfully: " + zoneName); _dnsWebService._dnsServer.AuthZoneManager.SaveZoneFile(zoneName); } - public void GenerateAndAddPrimaryZoneDnssecPrivateKey(HttpListenerRequest request) + public void GenerateAndAddPrimaryZoneDnssecPrivateKey(HttpContext context) { - string zoneName = request.QueryString["zone"]; - if (string.IsNullOrEmpty(zoneName)) - throw new DnsWebServiceException("Parameter 'zone' missing."); + UserSession session = context.GetCurrentSession(); - zoneName = zoneName.TrimEnd('.'); + if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify)) + throw new DnsWebServiceException("Access was denied."); - UserSession session = _dnsWebService.GetSession(request); + HttpRequest request = context.Request; + + string zoneName = request.GetQuery("zone").TrimEnd('.'); if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneName, session.User, PermissionFlag.Delete)) throw new DnsWebServiceException("Access was denied."); - string strKeyType = request.QueryString["keyType"]; - if (string.IsNullOrEmpty(strKeyType)) - throw new DnsWebServiceException("Parameter 'keyType' missing."); - - DnssecPrivateKeyType keyType = Enum.Parse(strKeyType, true); - - ushort rolloverDays; - string strRolloverDays = request.QueryString["rolloverDays"]; - if (string.IsNullOrEmpty(strRolloverDays)) - rolloverDays = (ushort)(keyType == DnssecPrivateKeyType.ZoneSigningKey ? 90 : 0); - else - rolloverDays = ushort.Parse(strRolloverDays); - - string algorithm = request.QueryString["algorithm"]; - if (string.IsNullOrEmpty(algorithm)) - throw new DnsWebServiceException("Parameter 'algorithm' missing."); + DnssecPrivateKeyType keyType = request.GetQuery("keyType"); + ushort rolloverDays = request.GetQuery("rolloverDays", ushort.Parse, (ushort)(keyType == DnssecPrivateKeyType.ZoneSigningKey ? 90 : 0)); + string algorithm = request.GetQuery("algorithm"); switch (algorithm.ToUpper()) { case "RSA": - string hashAlgorithm = request.QueryString["hashAlgorithm"]; - if (string.IsNullOrEmpty(hashAlgorithm)) - throw new DnsWebServiceException("Parameter 'hashAlgorithm' missing."); - - string strKeySize = request.QueryString["keySize"]; - if (string.IsNullOrEmpty(strKeySize)) - throw new DnsWebServiceException("Parameter 'keySize' missing."); - - int keySize = int.Parse(strKeySize); + string hashAlgorithm = request.GetQuery("hashAlgorithm"); + int keySize = request.GetQuery("keySize", int.Parse); _dnsWebService._dnsServer.AuthZoneManager.GenerateAndAddPrimaryZoneDnssecRsaPrivateKey(zoneName, keyType, hashAlgorithm, keySize, rolloverDays); break; case "ECDSA": - string curve = request.QueryString["curve"]; - if (string.IsNullOrEmpty(curve)) - throw new DnsWebServiceException("Parameter 'curve' missing."); + string curve = request.GetQuery("curve"); _dnsWebService._dnsServer.AuthZoneManager.GenerateAndAddPrimaryZoneDnssecEcdsaPrivateKey(zoneName, keyType, curve, rolloverDays); break; @@ -1270,151 +1164,131 @@ namespace DnsServerCore throw new NotSupportedException("Algorithm is not supported: " + algorithm); } - _dnsWebService._log.Write(DnsWebService.GetRequestRemoteEndPoint(request), "[" + session.User.Username + "] DNSSEC private key was generated and added to the primary zone successfully: " + zoneName); + _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] DNSSEC private key was generated and added to the primary zone successfully: " + zoneName); _dnsWebService._dnsServer.AuthZoneManager.SaveZoneFile(zoneName); } - public void UpdatePrimaryZoneDnssecPrivateKey(HttpListenerRequest request) + public void UpdatePrimaryZoneDnssecPrivateKey(HttpContext context) { - string zoneName = request.QueryString["zone"]; - if (string.IsNullOrEmpty(zoneName)) - throw new DnsWebServiceException("Parameter 'zone' missing."); + UserSession session = context.GetCurrentSession(); - zoneName = zoneName.TrimEnd('.'); + if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify)) + throw new DnsWebServiceException("Access was denied."); - UserSession session = _dnsWebService.GetSession(request); + HttpRequest request = context.Request; + + string zoneName = request.GetQuery("zone").TrimEnd('.'); if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneName, session.User, PermissionFlag.Delete)) throw new DnsWebServiceException("Access was denied."); - string strKeyTag = request.QueryString["keyTag"]; - if (string.IsNullOrEmpty(strKeyTag)) - throw new DnsWebServiceException("Parameter 'keyTag' missing."); - - ushort keyTag = ushort.Parse(strKeyTag); - - string strRolloverDays = request.QueryString["rolloverDays"]; - if (string.IsNullOrEmpty(strRolloverDays)) - throw new DnsWebServiceException("Parameter 'rolloverDays' missing."); - - ushort rolloverDays = ushort.Parse(strRolloverDays); + ushort keyTag = request.GetQuery("keyTag", ushort.Parse); + ushort rolloverDays = request.GetQuery("rolloverDays", ushort.Parse); _dnsWebService._dnsServer.AuthZoneManager.UpdatePrimaryZoneDnssecPrivateKey(zoneName, keyTag, rolloverDays); - _dnsWebService._log.Write(DnsWebService.GetRequestRemoteEndPoint(request), "[" + session.User.Username + "] Primary zone DNSSEC private key config was updated successfully: " + zoneName); + _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] Primary zone DNSSEC private key config was updated successfully: " + zoneName); _dnsWebService._dnsServer.AuthZoneManager.SaveZoneFile(zoneName); } - public void DeletePrimaryZoneDnssecPrivateKey(HttpListenerRequest request) + public void DeletePrimaryZoneDnssecPrivateKey(HttpContext context) { - string zoneName = request.QueryString["zone"]; - if (string.IsNullOrEmpty(zoneName)) - throw new DnsWebServiceException("Parameter 'zone' missing."); + UserSession session = context.GetCurrentSession(); - zoneName = zoneName.TrimEnd('.'); + if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify)) + throw new DnsWebServiceException("Access was denied."); - UserSession session = _dnsWebService.GetSession(request); + HttpRequest request = context.Request; + + string zoneName = request.GetQuery("zone").TrimEnd('.'); if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneName, session.User, PermissionFlag.Delete)) throw new DnsWebServiceException("Access was denied."); - string strKeyTag = request.QueryString["keyTag"]; - if (string.IsNullOrEmpty(strKeyTag)) - throw new DnsWebServiceException("Parameter 'keyTag' missing."); - - ushort keyTag = ushort.Parse(strKeyTag); + ushort keyTag = request.GetQuery("keyTag", ushort.Parse); _dnsWebService._dnsServer.AuthZoneManager.DeletePrimaryZoneDnssecPrivateKey(zoneName, keyTag); - _dnsWebService._log.Write(DnsWebService.GetRequestRemoteEndPoint(request), "[" + session.User.Username + "] DNSSEC private key was deleted from primary zone successfully: " + zoneName); + _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] DNSSEC private key was deleted from primary zone successfully: " + zoneName); _dnsWebService._dnsServer.AuthZoneManager.SaveZoneFile(zoneName); } - public void PublishAllGeneratedPrimaryZoneDnssecPrivateKeys(HttpListenerRequest request) + public void PublishAllGeneratedPrimaryZoneDnssecPrivateKeys(HttpContext context) { - string zoneName = request.QueryString["zone"]; - if (string.IsNullOrEmpty(zoneName)) - throw new DnsWebServiceException("Parameter 'zone' missing."); + UserSession session = context.GetCurrentSession(); - zoneName = zoneName.TrimEnd('.'); + if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify)) + throw new DnsWebServiceException("Access was denied."); - UserSession session = _dnsWebService.GetSession(request); + string zoneName = context.Request.GetQuery("zone").TrimEnd('.'); if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneName, session.User, PermissionFlag.Delete)) throw new DnsWebServiceException("Access was denied."); _dnsWebService._dnsServer.AuthZoneManager.PublishAllGeneratedPrimaryZoneDnssecPrivateKeys(zoneName); - _dnsWebService._log.Write(DnsWebService.GetRequestRemoteEndPoint(request), "[" + session.User.Username + "] All DNSSEC private keys from the primary zone were published successfully: " + zoneName); + _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] All DNSSEC private keys from the primary zone were published successfully: " + zoneName); _dnsWebService._dnsServer.AuthZoneManager.SaveZoneFile(zoneName); } - public void RolloverPrimaryZoneDnsKey(HttpListenerRequest request) + public void RolloverPrimaryZoneDnsKey(HttpContext context) { - string zoneName = request.QueryString["zone"]; - if (string.IsNullOrEmpty(zoneName)) - throw new DnsWebServiceException("Parameter 'zone' missing."); + UserSession session = context.GetCurrentSession(); - zoneName = zoneName.TrimEnd('.'); + if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify)) + throw new DnsWebServiceException("Access was denied."); - UserSession session = _dnsWebService.GetSession(request); + HttpRequest request = context.Request; + + string zoneName = request.GetQuery("zone").TrimEnd('.'); if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneName, session.User, PermissionFlag.Delete)) throw new DnsWebServiceException("Access was denied."); - string strKeyTag = request.QueryString["keyTag"]; - if (string.IsNullOrEmpty(strKeyTag)) - throw new DnsWebServiceException("Parameter 'keyTag' missing."); - - ushort keyTag = ushort.Parse(strKeyTag); + ushort keyTag = request.GetQuery("keyTag", ushort.Parse); _dnsWebService._dnsServer.AuthZoneManager.RolloverPrimaryZoneDnsKey(zoneName, keyTag); - _dnsWebService._log.Write(DnsWebService.GetRequestRemoteEndPoint(request), "[" + session.User.Username + "] The DNSKEY (" + keyTag + ") from the primary zone was rolled over successfully: " + zoneName); + _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] The DNSKEY (" + keyTag + ") from the primary zone was rolled over successfully: " + zoneName); _dnsWebService._dnsServer.AuthZoneManager.SaveZoneFile(zoneName); } - public void RetirePrimaryZoneDnsKey(HttpListenerRequest request) + public void RetirePrimaryZoneDnsKey(HttpContext context) { - string zoneName = request.QueryString["zone"]; - if (string.IsNullOrEmpty(zoneName)) - throw new DnsWebServiceException("Parameter 'zone' missing."); + UserSession session = context.GetCurrentSession(); - zoneName = zoneName.TrimEnd('.'); + if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify)) + throw new DnsWebServiceException("Access was denied."); - UserSession session = _dnsWebService.GetSession(request); + HttpRequest request = context.Request; + + string zoneName = request.GetQuery("zone").TrimEnd('.'); if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneName, session.User, PermissionFlag.Delete)) throw new DnsWebServiceException("Access was denied."); - string strKeyTag = request.QueryString["keyTag"]; - if (string.IsNullOrEmpty(strKeyTag)) - throw new DnsWebServiceException("Parameter 'keyTag' missing."); - - ushort keyTag = ushort.Parse(strKeyTag); + ushort keyTag = request.GetQuery("keyTag", ushort.Parse); _dnsWebService._dnsServer.AuthZoneManager.RetirePrimaryZoneDnsKey(zoneName, keyTag); - _dnsWebService._log.Write(DnsWebService.GetRequestRemoteEndPoint(request), "[" + session.User.Username + "] The DNSKEY (" + keyTag + ") from the primary zone was retired successfully: " + zoneName); + _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] The DNSKEY (" + keyTag + ") from the primary zone was retired successfully: " + zoneName); _dnsWebService._dnsServer.AuthZoneManager.SaveZoneFile(zoneName); } - public void DeleteZone(HttpListenerRequest request) + public void DeleteZone(HttpContext context) { - string zoneName = request.QueryString["zone"]; - if (string.IsNullOrEmpty(zoneName)) - zoneName = request.QueryString["domain"]; + UserSession session = context.GetCurrentSession(); - if (string.IsNullOrEmpty(zoneName)) - throw new DnsWebServiceException("Parameter 'zone' missing."); + if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Delete)) + throw new DnsWebServiceException("Access was denied."); - zoneName = zoneName.TrimEnd('.'); + string zoneName = context.Request.GetQueryAlt("zone", "domain").TrimEnd('.'); AuthZoneInfo zoneInfo = _dnsWebService._dnsServer.AuthZoneManager.GetAuthZoneInfo(zoneName); if (zoneInfo is null) @@ -1423,8 +1297,6 @@ namespace DnsServerCore if (zoneInfo.Internal) throw new DnsWebServiceException("Access was denied to manage internal DNS Server zone."); - UserSession session = _dnsWebService.GetSession(request); - if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneInfo.Name, session.User, PermissionFlag.Delete)) throw new DnsWebServiceException("Access was denied."); @@ -1434,20 +1306,18 @@ namespace DnsServerCore _dnsWebService._authManager.RemoveAllPermissions(PermissionSection.Zones, zoneInfo.Name); _dnsWebService._authManager.SaveConfigFile(); - _dnsWebService._log.Write(DnsWebService.GetRequestRemoteEndPoint(request), "[" + session.User.Username + "] " + zoneInfo.Type.ToString() + " zone was deleted: " + zoneName); + _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] " + zoneInfo.Type.ToString() + " zone was deleted: " + zoneName); _dnsWebService._dnsServer.AuthZoneManager.DeleteZoneFile(zoneInfo.Name); } - public void EnableZone(HttpListenerRequest request) + public void EnableZone(HttpContext context) { - string zoneName = request.QueryString["zone"]; - if (string.IsNullOrEmpty(zoneName)) - zoneName = request.QueryString["domain"]; + UserSession session = context.GetCurrentSession(); - if (string.IsNullOrEmpty(zoneName)) - throw new DnsWebServiceException("Parameter 'zone' missing."); + if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify)) + throw new DnsWebServiceException("Access was denied."); - zoneName = zoneName.TrimEnd('.'); + string zoneName = context.Request.GetQueryAlt("zone", "domain").TrimEnd('.'); AuthZoneInfo zoneInfo = _dnsWebService._dnsServer.AuthZoneManager.GetAuthZoneInfo(zoneName); if (zoneInfo is null) @@ -1456,14 +1326,12 @@ namespace DnsServerCore if (zoneInfo.Internal) throw new DnsWebServiceException("Access was denied to manage internal DNS Server zone."); - UserSession session = _dnsWebService.GetSession(request); - if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneInfo.Name, session.User, PermissionFlag.Modify)) throw new DnsWebServiceException("Access was denied."); zoneInfo.Disabled = false; - _dnsWebService._log.Write(DnsWebService.GetRequestRemoteEndPoint(request), "[" + session.User.Username + "] " + zoneInfo.Type.ToString() + " zone was enabled: " + zoneInfo.Name); + _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] " + zoneInfo.Type.ToString() + " zone was enabled: " + zoneInfo.Name); _dnsWebService._dnsServer.AuthZoneManager.SaveZoneFile(zoneInfo.Name); @@ -1471,16 +1339,14 @@ namespace DnsServerCore _dnsWebService._dnsServer.CacheZoneManager.DeleteZone(zoneInfo.Name); } - public void DisableZone(HttpListenerRequest request) + public void DisableZone(HttpContext context) { - string zoneName = request.QueryString["zone"]; - if (string.IsNullOrEmpty(zoneName)) - zoneName = request.QueryString["domain"]; + UserSession session = context.GetCurrentSession(); - if (string.IsNullOrEmpty(zoneName)) - throw new DnsWebServiceException("Parameter 'zone' missing."); + if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify)) + throw new DnsWebServiceException("Access was denied."); - zoneName = zoneName.TrimEnd('.'); + string zoneName = context.Request.GetQueryAlt("zone", "domain").TrimEnd('.'); AuthZoneInfo zoneInfo = _dnsWebService._dnsServer.AuthZoneManager.GetAuthZoneInfo(zoneName); if (zoneInfo is null) @@ -1489,35 +1355,27 @@ namespace DnsServerCore if (zoneInfo.Internal) throw new DnsWebServiceException("Access was denied to manage internal DNS Server zone."); - UserSession session = _dnsWebService.GetSession(request); - if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneInfo.Name, session.User, PermissionFlag.Modify)) throw new DnsWebServiceException("Access was denied."); zoneInfo.Disabled = true; - _dnsWebService._log.Write(DnsWebService.GetRequestRemoteEndPoint(request), "[" + session.User.Username + "] " + zoneInfo.Type.ToString() + " zone was disabled: " + zoneInfo.Name); + _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] " + zoneInfo.Type.ToString() + " zone was disabled: " + zoneInfo.Name); _dnsWebService._dnsServer.AuthZoneManager.SaveZoneFile(zoneInfo.Name); } - public void GetZoneOptions(HttpListenerRequest request, Utf8JsonWriter jsonWriter) + public void GetZoneOptions(HttpContext context) { - string zoneName = request.QueryString["zone"]; - if (string.IsNullOrEmpty(zoneName)) - zoneName = request.QueryString["domain"]; + UserSession session = context.GetCurrentSession(); - if (string.IsNullOrEmpty(zoneName)) - throw new DnsWebServiceException("Parameter 'zone' missing."); + if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify)) + throw new DnsWebServiceException("Access was denied."); - zoneName = zoneName.TrimEnd('.'); + HttpRequest request = context.Request; - bool includeAvailableTsigKeyNames; - string strIncludeAvailableTsigKeyNames = request.QueryString["includeAvailableTsigKeyNames"]; - if (string.IsNullOrEmpty(strIncludeAvailableTsigKeyNames)) - includeAvailableTsigKeyNames = false; - else - includeAvailableTsigKeyNames = bool.Parse(strIncludeAvailableTsigKeyNames); + string zoneName = request.GetQueryAlt("zone", "domain").TrimEnd('.'); + bool includeAvailableTsigKeyNames = request.GetQuery("includeAvailableTsigKeyNames", bool.Parse, false); AuthZoneInfo zoneInfo = _dnsWebService._dnsServer.AuthZoneManager.GetAuthZoneInfo(zoneName); if (zoneInfo is null) @@ -1526,11 +1384,11 @@ namespace DnsServerCore if (zoneInfo.Internal) throw new DnsWebServiceException("Access was denied to manage internal DNS Server zone."); - UserSession session = _dnsWebService.GetSession(request); - if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneInfo.Name, session.User, PermissionFlag.View)) throw new DnsWebServiceException("Access was denied."); + Utf8JsonWriter jsonWriter = context.GetCurrentJsonWriter(); + jsonWriter.WriteString("name", zoneInfo.Name); jsonWriter.WriteString("type", zoneInfo.Type.ToString()); @@ -1666,16 +1524,16 @@ namespace DnsServerCore } } - public void SetZoneOptions(HttpListenerRequest request) + public void SetZoneOptions(HttpContext context) { - string zoneName = request.QueryString["zone"]; - if (string.IsNullOrEmpty(zoneName)) - zoneName = request.QueryString["domain"]; + UserSession session = context.GetCurrentSession(); - if (string.IsNullOrEmpty(zoneName)) - throw new DnsWebServiceException("Parameter 'zone' missing."); + if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify)) + throw new DnsWebServiceException("Access was denied."); - zoneName = zoneName.TrimEnd('.'); + HttpRequest request = context.Request; + + string zoneName = request.GetQueryAlt("zone", "domain").TrimEnd('.'); AuthZoneInfo zoneInfo = _dnsWebService._dnsServer.AuthZoneManager.GetAuthZoneInfo(zoneName); if (zoneInfo is null) @@ -1684,46 +1542,32 @@ namespace DnsServerCore if (zoneInfo.Internal) throw new DnsWebServiceException("Access was denied to manage internal DNS Server zone."); - UserSession session = _dnsWebService.GetSession(request); - if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneInfo.Name, session.User, PermissionFlag.Delete)) throw new DnsWebServiceException("Access was denied."); - string strDisabled = request.QueryString["disabled"]; - if (!string.IsNullOrEmpty(strDisabled)) - zoneInfo.Disabled = bool.Parse(strDisabled); + if (request.TryGetQuery("disabled", bool.Parse, out bool disabled)) + zoneInfo.Disabled = disabled; switch (zoneInfo.Type) { case AuthZoneType.Primary: case AuthZoneType.Secondary: - string strZoneTransfer = request.QueryString["zoneTransfer"]; - if (!string.IsNullOrEmpty(strZoneTransfer)) - zoneInfo.ZoneTransfer = Enum.Parse(strZoneTransfer, true); + if (request.TryGetQuery("zoneTransfer", out AuthZoneTransfer zoneTransfer)) + zoneInfo.ZoneTransfer = zoneTransfer; - string strZoneTransferNameServers = request.QueryString["zoneTransferNameServers"]; - if (!string.IsNullOrEmpty(strZoneTransferNameServers)) + string strZoneTransferNameServers = request.Query["zoneTransferNameServers"]; + if (strZoneTransferNameServers is not null) { - if (strZoneTransferNameServers == "false") - { + if ((strZoneTransferNameServers.Length == 0) || strZoneTransferNameServers.Equals("false", StringComparison.OrdinalIgnoreCase)) zoneInfo.ZoneTransferNameServers = null; - } else - { - string[] strNameServers = strZoneTransferNameServers.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); - IPAddress[] nameServers = new IPAddress[strNameServers.Length]; - - for (int i = 0; i < strNameServers.Length; i++) - nameServers[i] = IPAddress.Parse(strNameServers[i]); - - zoneInfo.ZoneTransferNameServers = nameServers; - } + zoneInfo.ZoneTransferNameServers = strZoneTransferNameServers.Split(IPAddress.Parse, ','); } - string strZoneTransferTsigKeyNames = request.QueryString["zoneTransferTsigKeyNames"]; - if (!string.IsNullOrEmpty(strZoneTransferTsigKeyNames)) + string strZoneTransferTsigKeyNames = request.Query["zoneTransferTsigKeyNames"]; + if (strZoneTransferTsigKeyNames is not null) { - if (strZoneTransferTsigKeyNames == "false") + if ((strZoneTransferTsigKeyNames.Length == 0) || strZoneTransferTsigKeyNames.Equals("false", StringComparison.OrdinalIgnoreCase)) { zoneInfo.ZoneTransferTsigKeyNames = null; } @@ -1739,27 +1583,16 @@ namespace DnsServerCore } } - string strNotify = request.QueryString["notify"]; - if (!string.IsNullOrEmpty(strNotify)) - zoneInfo.Notify = Enum.Parse(strNotify, true); + if (request.TryGetQuery("notify", out AuthZoneNotify notify)) + zoneInfo.Notify = notify; - string strNotifyNameServers = request.QueryString["notifyNameServers"]; - if (!string.IsNullOrEmpty(strNotifyNameServers)) + string strNotifyNameServers = request.Query["notifyNameServers"]; + if (strNotifyNameServers is not null) { - if (strNotifyNameServers == "false") - { + if ((strNotifyNameServers.Length == 0) || strNotifyNameServers.Equals("false", StringComparison.OrdinalIgnoreCase)) zoneInfo.NotifyNameServers = null; - } else - { - string[] strNameServers = strNotifyNameServers.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); - IPAddress[] nameServers = new IPAddress[strNameServers.Length]; - - for (int i = 0; i < strNameServers.Length; i++) - nameServers[i] = IPAddress.Parse(strNameServers[i]); - - zoneInfo.NotifyNameServers = nameServers; - } + zoneInfo.NotifyNameServers = strNotifyNameServers.Split(IPAddress.Parse, ','); } break; } @@ -1767,33 +1600,22 @@ namespace DnsServerCore switch (zoneInfo.Type) { case AuthZoneType.Primary: - string strUpdate = request.QueryString["update"]; - if (!string.IsNullOrEmpty(strUpdate)) - zoneInfo.Update = Enum.Parse(strUpdate, true); + if (request.TryGetQuery("update", out AuthZoneUpdate update)) + zoneInfo.Update = update; - string strUpdateIpAddresses = request.QueryString["updateIpAddresses"]; - if (!string.IsNullOrEmpty(strUpdateIpAddresses)) + string strUpdateIpAddresses = request.Query["updateIpAddresses"]; + if (strUpdateIpAddresses is not null) { - if (strUpdateIpAddresses == "false") - { + if ((strUpdateIpAddresses.Length == 0) || strUpdateIpAddresses.Equals("false", StringComparison.OrdinalIgnoreCase)) zoneInfo.UpdateIpAddresses = null; - } else - { - string[] strIpAddresses = strUpdateIpAddresses.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); - IPAddress[] ipAddresses = new IPAddress[strIpAddresses.Length]; - - for (int i = 0; i < strIpAddresses.Length; i++) - ipAddresses[i] = IPAddress.Parse(strIpAddresses[i]); - - zoneInfo.UpdateIpAddresses = ipAddresses; - } + zoneInfo.UpdateIpAddresses = strUpdateIpAddresses.Split(IPAddress.Parse, ','); } - string strUpdateSecurityPolicies = request.QueryString["updateSecurityPolicies"]; - if (!string.IsNullOrEmpty(strUpdateSecurityPolicies)) + string strUpdateSecurityPolicies = request.Query["updateSecurityPolicies"]; + if (strUpdateSecurityPolicies is not null) { - if (strUpdateSecurityPolicies == "false") + if ((strUpdateSecurityPolicies.Length == 0) || strUpdateSecurityPolicies.Equals("false", StringComparison.OrdinalIgnoreCase)) { zoneInfo.UpdateSecurityPolicies = null; } @@ -1833,21 +1655,19 @@ namespace DnsServerCore break; } - _dnsWebService._log.Write(DnsWebService.GetRequestRemoteEndPoint(request), "[" + session.User.Username + "] " + zoneInfo.Type.ToString() + " zone options were updated successfully: " + zoneInfo.Name); + _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] " + zoneInfo.Type.ToString() + " zone options were updated successfully: " + zoneInfo.Name); _dnsWebService._dnsServer.AuthZoneManager.SaveZoneFile(zoneInfo.Name); } - public void ResyncZone(HttpListenerRequest request) + public void ResyncZone(HttpContext context) { - string zoneName = request.QueryString["zone"]; - if (string.IsNullOrEmpty(zoneName)) - zoneName = request.QueryString["domain"]; + UserSession session = context.GetCurrentSession(); - if (string.IsNullOrEmpty(zoneName)) - throw new DnsWebServiceException("Parameter 'zone' missing."); + if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify)) + throw new DnsWebServiceException("Access was denied."); - zoneName = zoneName.TrimEnd('.'); + string zoneName = context.Request.GetQueryAlt("zone", "domain").TrimEnd('.'); AuthZoneInfo zoneInfo = _dnsWebService._dnsServer.AuthZoneManager.GetAuthZoneInfo(zoneName); if (zoneInfo is null) @@ -1856,8 +1676,6 @@ namespace DnsServerCore if (zoneInfo.Internal) throw new DnsWebServiceException("Access was denied to manage internal DNS Server zone."); - UserSession session = _dnsWebService.GetSession(request); - if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneInfo.Name, session.User, PermissionFlag.Modify)) throw new DnsWebServiceException("Access was denied."); @@ -1873,15 +1691,13 @@ namespace DnsServerCore } } - public void AddRecord(HttpListenerRequest request, Utf8JsonWriter jsonWriter) + public void AddRecord(HttpContext context) { - string domain = request.QueryString["domain"]; - if (string.IsNullOrEmpty(domain)) - throw new DnsWebServiceException("Parameter 'domain' missing."); + HttpRequest request = context.Request; - domain = domain.TrimEnd('.'); + string domain = request.GetQuery("domain").TrimEnd('.'); - string zoneName = request.QueryString["zone"]; + string zoneName = request.Query["zone"]; if (zoneName is not null) zoneName = zoneName.TrimEnd('.'); @@ -1892,32 +1708,15 @@ namespace DnsServerCore if (zoneInfo.Internal) throw new DnsWebServiceException("Access was denied to manage internal DNS Server zone."); - UserSession session = _dnsWebService.GetSession(request); + UserSession session = context.GetCurrentSession(); if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneInfo.Name, session.User, PermissionFlag.Modify)) throw new DnsWebServiceException("Access was denied."); - string strType = request.QueryString["type"]; - if (string.IsNullOrEmpty(strType)) - throw new DnsWebServiceException("Parameter 'type' missing."); - - DnsResourceRecordType type = Enum.Parse(strType, true); - - string value = request.QueryString["value"]; - - uint ttl; - string strTtl = request.QueryString["ttl"]; - if (string.IsNullOrEmpty(strTtl)) - ttl = _defaultRecordTtl; - else - ttl = uint.Parse(strTtl); - - bool overwrite = false; - string strOverwrite = request.QueryString["overwrite"]; - if (!string.IsNullOrEmpty(strOverwrite)) - overwrite = bool.Parse(strOverwrite); - - string comments = request.QueryString["comments"]; + DnsResourceRecordType type = request.GetQuery("type"); + uint ttl = request.GetQuery("ttl", uint.Parse, _defaultRecordTtl); + bool overwrite = request.GetQuery("overwrite", bool.Parse, false); + string comments = request.Query["comments"]; DnsResourceRecord newRecord; @@ -1926,27 +1725,15 @@ namespace DnsServerCore case DnsResourceRecordType.A: case DnsResourceRecordType.AAAA: { - string strIPAddress = request.QueryString["ipAddress"]; - if (string.IsNullOrEmpty(strIPAddress)) - { - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'ipAddress' missing."); - - strIPAddress = value; - } - + string strIPAddress = request.GetQueryAlt("ipAddress", "value"); IPAddress ipAddress; if (strIPAddress.Equals("request-ip-address")) - ipAddress = DnsWebService.GetRequestRemoteEndPoint(request).Address; + ipAddress = context.GetRemoteEndPoint().Address; else ipAddress = IPAddress.Parse(strIPAddress); - bool ptr = false; - string strPtr = request.QueryString["ptr"]; - if (!string.IsNullOrEmpty(strPtr)) - ptr = bool.Parse(strPtr); - + bool ptr = request.GetQuery("ptr", bool.Parse, false); if (ptr) { string ptrDomain = Zone.GetReverseZone(ipAddress, type == DnsResourceRecordType.A ? 32 : 128); @@ -1954,11 +1741,7 @@ namespace DnsServerCore AuthZoneInfo reverseZoneInfo = _dnsWebService._dnsServer.AuthZoneManager.FindAuthZoneInfo(ptrDomain); if (reverseZoneInfo is null) { - bool createPtrZone = false; - string strCreatePtrZone = request.QueryString["createPtrZone"]; - if (!string.IsNullOrEmpty(strCreatePtrZone)) - createPtrZone = bool.Parse(strCreatePtrZone); - + bool createPtrZone = request.GetQuery("createPtrZone", bool.Parse, false); if (!createPtrZone) throw new DnsServerException("No reverse zone available to add PTR record."); @@ -2002,20 +1785,10 @@ namespace DnsServerCore case DnsResourceRecordType.NS: { - string nameServer = request.QueryString["nameServer"]; - if (string.IsNullOrEmpty(nameServer)) - { - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'nameServer' missing."); + string nameServer = request.GetQueryAlt("nameServer", "value").TrimEnd('.'); + string glueAddresses = request.GetQuery("glue", null); - nameServer = value; - } - - string glueAddresses = request.QueryString["glue"]; - if (string.IsNullOrEmpty(glueAddresses)) - glueAddresses = null; - - newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsNSRecordData(nameServer.TrimEnd('.'))); + newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsNSRecordData(nameServer)); if (glueAddresses != null) newRecord.SetGlueRecords(glueAddresses); @@ -2039,16 +1812,9 @@ namespace DnsServerCore throw new DnsWebServiceException("Record already exists. Use overwrite option if you wish to overwrite existing records."); } - string cname = request.QueryString["cname"]; - if (string.IsNullOrEmpty(cname)) - { - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'cname' missing."); + string cname = request.GetQueryAlt("cname", "value").TrimEnd('.'); - cname = value; - } - - newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsCNAMERecordData(cname.TrimEnd('.'))); + newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsCNAMERecordData(cname)); if (!string.IsNullOrEmpty(comments)) newRecord.SetComments(comments); @@ -2059,16 +1825,9 @@ namespace DnsServerCore case DnsResourceRecordType.PTR: { - string ptrName = request.QueryString["ptrName"]; - if (string.IsNullOrEmpty(ptrName)) - { - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'ptrName' missing."); + string ptrName = request.GetQueryAlt("ptrName", "value").TrimEnd('.'); - ptrName = value; - } - - newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsPTRRecordData(ptrName.TrimEnd('.'))); + newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsPTRRecordData(ptrName)); if (!string.IsNullOrEmpty(comments)) newRecord.SetComments(comments); @@ -2082,20 +1841,10 @@ namespace DnsServerCore case DnsResourceRecordType.MX: { - string exchange = request.QueryString["exchange"]; - if (string.IsNullOrEmpty(exchange)) - { - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'exchange' missing."); + ushort preference = request.GetQuery("preference", ushort.Parse); + string exchange = request.GetQueryAlt("exchange", "value").TrimEnd('.'); - exchange = value; - } - - string preference = request.QueryString["preference"]; - if (string.IsNullOrEmpty(preference)) - throw new DnsWebServiceException("Parameter 'preference' missing."); - - newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsMXRecordData(ushort.Parse(preference), exchange.TrimEnd('.'))); + newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsMXRecordData(preference, exchange)); if (!string.IsNullOrEmpty(comments)) newRecord.SetComments(comments); @@ -2109,14 +1858,7 @@ namespace DnsServerCore case DnsResourceRecordType.TXT: { - string text = request.QueryString["text"]; - if (string.IsNullOrEmpty(text)) - { - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'text' missing."); - - text = value; - } + string text = request.GetQueryAlt("text", "value"); newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsTXTRecordData(text)); @@ -2132,28 +1874,12 @@ namespace DnsServerCore case DnsResourceRecordType.SRV: { - string priority = request.QueryString["priority"]; - if (string.IsNullOrEmpty(priority)) - throw new DnsWebServiceException("Parameter 'priority' missing."); + ushort priority = request.GetQuery("priority", ushort.Parse); + ushort weight = request.GetQuery("weight", ushort.Parse); + ushort port = request.GetQuery("port", ushort.Parse); + string target = request.GetQueryAlt("target", "value").TrimEnd('.'); - string weight = request.QueryString["weight"]; - if (string.IsNullOrEmpty(weight)) - throw new DnsWebServiceException("Parameter 'weight' missing."); - - string port = request.QueryString["port"]; - if (string.IsNullOrEmpty(port)) - throw new DnsWebServiceException("Parameter 'port' missing."); - - string target = request.QueryString["target"]; - if (string.IsNullOrEmpty(target)) - { - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'target' missing."); - - target = value; - } - - newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsSRVRecordData(ushort.Parse(priority), ushort.Parse(weight), ushort.Parse(port), target.TrimEnd('.'))); + newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsSRVRecordData(priority, weight, port, target)); if (!string.IsNullOrEmpty(comments)) newRecord.SetComments(comments); @@ -2174,16 +1900,9 @@ namespace DnsServerCore throw new DnsWebServiceException("Record already exists. Use overwrite option if you wish to overwrite existing records."); } - string dname = request.QueryString["dname"]; - if (string.IsNullOrEmpty(dname)) - { - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'dname' missing."); + string dname = request.GetQueryAlt("dname", "value").TrimEnd('.'); - dname = value; - } - - newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsDNAMERecordData(dname.TrimEnd('.'))); + newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsDNAMERecordData(dname)); if (!string.IsNullOrEmpty(comments)) newRecord.SetComments(comments); @@ -2194,28 +1913,12 @@ namespace DnsServerCore case DnsResourceRecordType.DS: { - string strKeyTag = request.QueryString["keyTag"]; - if (string.IsNullOrEmpty(strKeyTag)) - throw new DnsWebServiceException("Parameter 'keyTag' missing."); + ushort keyTag = request.GetQuery("keyTag", ushort.Parse); + DnssecAlgorithm algorithm = Enum.Parse(request.GetQuery("algorithm").Replace('-', '_'), true); + DnssecDigestType digestType = Enum.Parse(request.GetQuery("digestType").Replace('-', '_'), true); + byte[] digest = request.GetQueryAlt("digest", "value", Convert.FromHexString); - string strAlgorithm = request.QueryString["algorithm"]; - if (string.IsNullOrEmpty(strAlgorithm)) - throw new DnsWebServiceException("Parameter 'algorithm' missing."); - - string strDigestType = request.QueryString["digestType"]; - if (string.IsNullOrEmpty(strDigestType)) - throw new DnsWebServiceException("Parameter 'digestType' missing."); - - string digest = request.QueryString["digest"]; - if (string.IsNullOrEmpty(digest)) - { - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'digest' missing."); - - digest = value; - } - - newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsDSRecordData(ushort.Parse(strKeyTag), Enum.Parse(strAlgorithm.Replace('-', '_'), true), Enum.Parse(strDigestType.Replace('-', '_'), true), Convert.FromHexString(digest))); + newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsDSRecordData(keyTag, algorithm, digestType, digest)); if (!string.IsNullOrEmpty(comments)) newRecord.SetComments(comments); @@ -2229,19 +1932,11 @@ namespace DnsServerCore case DnsResourceRecordType.SSHFP: { - string strAlgorithm = request.QueryString["sshfpAlgorithm"]; - if (string.IsNullOrEmpty(strAlgorithm)) - throw new DnsWebServiceException("Parameter 'sshfpAlgorithm' missing."); + DnsSSHFPAlgorithm sshfpAlgorithm = request.GetQuery("sshfpAlgorithm"); + DnsSSHFPFingerprintType sshfpFingerprintType = request.GetQuery("sshfpFingerprintType"); + byte[] sshfpFingerprint = request.GetQuery("sshfpFingerprint", Convert.FromHexString); - string strFingerprintType = request.QueryString["sshfpFingerprintType"]; - if (string.IsNullOrEmpty(strFingerprintType)) - throw new DnsWebServiceException("Parameter 'sshfpFingerprintType' missing."); - - string strFingerprint = request.QueryString["sshfpFingerprint"]; - if (string.IsNullOrEmpty(strFingerprint)) - throw new DnsWebServiceException("Parameter 'sshfpFingerprint' missing."); - - newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsSSHFPRecordData(Enum.Parse(strAlgorithm, true), Enum.Parse(strFingerprintType, true), Convert.FromHexString(strFingerprint))); + newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsSSHFPRecordData(sshfpAlgorithm, sshfpFingerprintType, sshfpFingerprint)); if (!string.IsNullOrEmpty(comments)) newRecord.SetComments(comments); @@ -2255,23 +1950,12 @@ namespace DnsServerCore case DnsResourceRecordType.TLSA: { - string strCertificateUsage = request.QueryString["tlsaCertificateUsage"]; - if (string.IsNullOrEmpty(strCertificateUsage)) - throw new DnsWebServiceException("Parameter 'tlsaCertificateUsage' missing."); + DnsTLSACertificateUsage tlsaCertificateUsage = Enum.Parse(request.GetQuery("tlsaCertificateUsage").Replace('-', '_'), true); + DnsTLSASelector tlsaSelector = request.GetQuery("tlsaSelector"); + DnsTLSAMatchingType tlsaMatchingType = Enum.Parse(request.GetQuery("tlsaMatchingType").Replace('-', '_'), true); + string tlsaCertificateAssociationData = request.GetQuery("tlsaCertificateAssociationData"); - string strSelector = request.QueryString["tlsaSelector"]; - if (string.IsNullOrEmpty(strSelector)) - throw new DnsWebServiceException("Parameter 'tlsaSelector' missing."); - - string strMatchingType = request.QueryString["tlsaMatchingType"]; - if (string.IsNullOrEmpty(strMatchingType)) - throw new DnsWebServiceException("Parameter 'tlsaMatchingType' missing."); - - string strCertificateAssociationData = request.QueryString["tlsaCertificateAssociationData"]; - if (string.IsNullOrEmpty(strCertificateAssociationData)) - throw new DnsWebServiceException("Parameter 'tlsaCertificateAssociationData' missing."); - - newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsTLSARecordData(Enum.Parse(strCertificateUsage.Replace('-', '_'), true), Enum.Parse(strSelector, true), Enum.Parse(strMatchingType.Replace('-', '_'), true), strCertificateAssociationData)); + newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsTLSARecordData(tlsaCertificateUsage, tlsaSelector, tlsaMatchingType, tlsaCertificateAssociationData)); if (!string.IsNullOrEmpty(comments)) newRecord.SetComments(comments); @@ -2285,18 +1969,11 @@ namespace DnsServerCore case DnsResourceRecordType.CAA: { - string flags = request.QueryString["flags"]; - if (string.IsNullOrEmpty(flags)) - throw new DnsWebServiceException("Parameter 'flags' missing."); + byte flags = request.GetQuery("flags", byte.Parse); + string tag = request.GetQuery("tag"); + string value = request.GetQuery("value"); - string tag = request.QueryString["tag"]; - if (string.IsNullOrEmpty(tag)) - throw new DnsWebServiceException("Parameter 'tag' missing."); - - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'value' missing."); - - newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsCAARecordData(byte.Parse(flags), tag, value)); + newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsCAARecordData(flags, tag, value)); if (!string.IsNullOrEmpty(comments)) newRecord.SetComments(comments); @@ -2310,16 +1987,9 @@ namespace DnsServerCore case DnsResourceRecordType.ANAME: { - string aname = request.QueryString["aname"]; - if (string.IsNullOrEmpty(aname)) - { - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'aname' missing."); + string aname = request.GetQueryAlt("aname", "value").TrimEnd('.'); - aname = value; - } - - newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsANAMERecordData(aname.TrimEnd('.'))); + newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsANAMERecordData(aname)); if (!string.IsNullOrEmpty(comments)) newRecord.SetComments(comments); @@ -2333,24 +2003,9 @@ namespace DnsServerCore case DnsResourceRecordType.FWD: { - DnsTransportProtocol protocol = DnsTransportProtocol.Udp; - string strProtocol = request.QueryString["protocol"]; - if (!string.IsNullOrEmpty(strProtocol)) - protocol = Enum.Parse(strProtocol, true); - - string forwarder = request.QueryString["forwarder"]; - if (string.IsNullOrEmpty(forwarder)) - { - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'forwarder' missing."); - - forwarder = value; - } - - bool dnssecValidation = false; - string strDnssecValidation = request.QueryString["dnssecValidation"]; - if (!string.IsNullOrEmpty(strDnssecValidation)) - dnssecValidation = bool.Parse(strDnssecValidation); + DnsTransportProtocol protocol = request.GetQuery("protocol", DnsTransportProtocol.Udp); + string forwarder = request.GetQueryAlt("forwarder", "value"); + bool dnssecValidation = request.GetQuery("dnssecValidation", bool.Parse, false); NetProxyType proxyType = NetProxyType.None; string proxyAddress = null; @@ -2360,23 +2015,13 @@ namespace DnsServerCore if (!forwarder.Equals("this-server")) { - string strProxyType = request.QueryString["proxyType"]; - if (!string.IsNullOrEmpty(strProxyType)) - proxyType = Enum.Parse(strProxyType, true); - + proxyType = request.GetQuery("proxyType", NetProxyType.None); if (proxyType != NetProxyType.None) { - proxyAddress = request.QueryString["proxyAddress"]; - if (string.IsNullOrEmpty(proxyAddress)) - throw new DnsWebServiceException("Parameter 'proxyAddress' missing."); - - string strProxyPort = request.QueryString["proxyPort"]; - if (string.IsNullOrEmpty(strProxyPort)) - throw new DnsWebServiceException("Parameter 'proxyPort' missing."); - - proxyPort = ushort.Parse(strProxyPort); - proxyUsername = request.QueryString["proxyUsername"]; - proxyPassword = request.QueryString["proxyPassword"]; + proxyAddress = request.GetQuery("proxyAddress"); + proxyPort = request.GetQuery("proxyPort", ushort.Parse); + proxyUsername = request.Query["proxyUsername"]; + proxyPassword = request.Query["proxyPassword"]; } } @@ -2394,22 +2039,9 @@ namespace DnsServerCore case DnsResourceRecordType.APP: { - string appName = request.QueryString["appName"]; - if (string.IsNullOrEmpty(appName)) - { - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'appName' missing."); - - appName = value; - } - - string classPath = request.QueryString["classPath"]; - if (string.IsNullOrEmpty(classPath)) - throw new DnsWebServiceException("Parameter 'classPath' missing."); - - string recordData = request.QueryString["recordData"]; - if (string.IsNullOrEmpty(recordData)) - recordData = ""; + string appName = request.GetQueryAlt("appName", "value"); + string classPath = request.GetQuery("classPath"); + string recordData = request.GetQuery("recordData", ""); if (!overwrite) { @@ -2431,10 +2063,12 @@ namespace DnsServerCore throw new DnsWebServiceException("Type not supported for AddRecords()."); } - _dnsWebService._log.Write(DnsWebService.GetRequestRemoteEndPoint(request), "[" + session.User.Username + "] New record was added to authoritative zone {domain: " + domain + "; type: " + type + "; value: " + value + "; ttl: " + ttl + ";}"); + _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] New record was added to authoritative zone {record: " + newRecord.ToString() + "}"); _dnsWebService._dnsServer.AuthZoneManager.SaveZoneFile(zoneInfo.Name); + Utf8JsonWriter jsonWriter = context.GetCurrentJsonWriter(); + jsonWriter.WritePropertyName("zone"); WriteZoneInfoAsJson(zoneInfo, jsonWriter); @@ -2442,23 +2076,21 @@ namespace DnsServerCore WriteRecordAsJson(newRecord, jsonWriter, true, null); } - public void GetRecords(HttpListenerRequest request, Utf8JsonWriter jsonWriter) + public void GetRecords(HttpContext context) { - string domain = request.QueryString["domain"]; - if (string.IsNullOrEmpty(domain)) - throw new DnsWebServiceException("Parameter 'domain' missing."); - - domain = domain.TrimEnd('.'); + string domain = context.Request.GetQuery("domain").TrimEnd('.'); AuthZoneInfo zoneInfo = _dnsWebService._dnsServer.AuthZoneManager.FindAuthZoneInfo(domain); if (zoneInfo is null) throw new DnsWebServiceException("No authoritative zone was not found for domain: " + domain); - UserSession session = _dnsWebService.GetSession(request); + UserSession session = context.GetCurrentSession(); if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneInfo.Name, session.User, PermissionFlag.View)) throw new DnsWebServiceException("Access was denied."); + Utf8JsonWriter jsonWriter = context.GetCurrentJsonWriter(); + jsonWriter.WritePropertyName("zone"); WriteZoneInfoAsJson(zoneInfo, jsonWriter); @@ -2468,15 +2100,13 @@ namespace DnsServerCore WriteRecordsAsJson(records, jsonWriter, true, zoneInfo); } - public void DeleteRecord(HttpListenerRequest request) + public void DeleteRecord(HttpContext context) { - string domain = request.QueryString["domain"]; - if (string.IsNullOrEmpty(domain)) - throw new DnsWebServiceException("Parameter 'domain' missing."); + HttpRequest request = context.Request; - domain = domain.TrimEnd('.'); + string domain = request.GetQuery("domain").TrimEnd('.'); - string zoneName = request.QueryString["zone"]; + string zoneName = request.Query["zone"]; if (zoneName is not null) zoneName = zoneName.TrimEnd('.'); @@ -2487,34 +2117,18 @@ namespace DnsServerCore if (zoneInfo.Internal) throw new DnsWebServiceException("Access was denied to manage internal DNS Server zone."); - UserSession session = _dnsWebService.GetSession(request); + UserSession session = context.GetCurrentSession(); if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneInfo.Name, session.User, PermissionFlag.Delete)) throw new DnsWebServiceException("Access was denied."); - string strType = request.QueryString["type"]; - if (string.IsNullOrEmpty(strType)) - throw new DnsWebServiceException("Parameter 'type' missing."); - - DnsResourceRecordType type = Enum.Parse(strType, true); - - string value = request.QueryString["value"]; - + DnsResourceRecordType type = request.GetQuery("type"); switch (type) { case DnsResourceRecordType.A: case DnsResourceRecordType.AAAA: { - string strIPAddress = request.QueryString["ipAddress"]; - if (string.IsNullOrEmpty(strIPAddress)) - { - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'ipAddress' missing."); - - strIPAddress = value; - } - - IPAddress ipAddress = IPAddress.Parse(strIPAddress); + IPAddress ipAddress = IPAddress.Parse(request.GetQueryAlt("ipAddress", "value")); if (type == DnsResourceRecordType.A) _dnsWebService._dnsServer.AuthZoneManager.DeleteRecord(zoneInfo.Name, domain, type, new DnsARecordData(ipAddress)); @@ -2545,14 +2159,7 @@ namespace DnsServerCore case DnsResourceRecordType.NS: { - string nameServer = request.QueryString["nameServer"]; - if (string.IsNullOrEmpty(nameServer)) - { - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'nameServer' missing."); - - nameServer = value; - } + string nameServer = request.GetQueryAlt("nameServer", "value").TrimEnd('.'); _dnsWebService._dnsServer.AuthZoneManager.DeleteRecord(zoneInfo.Name, domain, type, new DnsNSRecordData(nameServer)); } @@ -2564,14 +2171,7 @@ namespace DnsServerCore case DnsResourceRecordType.PTR: { - string ptrName = request.QueryString["ptrName"]; - if (string.IsNullOrEmpty(ptrName)) - { - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'ptrName' missing."); - - ptrName = value; - } + string ptrName = request.GetQueryAlt("ptrName", "value").TrimEnd('.'); _dnsWebService._dnsServer.AuthZoneManager.DeleteRecord(zoneInfo.Name, domain, type, new DnsPTRRecordData(ptrName)); } @@ -2579,33 +2179,16 @@ namespace DnsServerCore case DnsResourceRecordType.MX: { - string preference = request.QueryString["preference"]; - if (string.IsNullOrEmpty(preference)) - throw new DnsWebServiceException("Parameter 'preference' missing."); + ushort preference = request.GetQuery("preference", ushort.Parse); + string exchange = request.GetQueryAlt("exchange", "value").TrimEnd('.'); - string exchange = request.QueryString["exchange"]; - if (string.IsNullOrEmpty(exchange)) - { - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'exchange' missing."); - - exchange = value; - } - - _dnsWebService._dnsServer.AuthZoneManager.DeleteRecord(zoneInfo.Name, domain, type, new DnsMXRecordData(ushort.Parse(preference), exchange)); + _dnsWebService._dnsServer.AuthZoneManager.DeleteRecord(zoneInfo.Name, domain, type, new DnsMXRecordData(preference, exchange)); } break; case DnsResourceRecordType.TXT: { - string text = request.QueryString["text"]; - if (string.IsNullOrEmpty(text)) - { - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'text' missing."); - - text = value; - } + string text = request.GetQueryAlt("text", "value"); _dnsWebService._dnsServer.AuthZoneManager.DeleteRecord(zoneInfo.Name, domain, type, new DnsTXTRecordData(text)); } @@ -2613,28 +2196,12 @@ namespace DnsServerCore case DnsResourceRecordType.SRV: { - string priority = request.QueryString["priority"]; - if (string.IsNullOrEmpty(priority)) - throw new DnsWebServiceException("Parameter 'priority' missing."); + ushort priority = request.GetQuery("priority", ushort.Parse); + ushort weight = request.GetQuery("weight", ushort.Parse); + ushort port = request.GetQuery("port", ushort.Parse); + string target = request.GetQueryAlt("target", "value").TrimEnd('.'); - string weight = request.QueryString["weight"]; - if (string.IsNullOrEmpty(weight)) - throw new DnsWebServiceException("Parameter 'weight' missing."); - - string port = request.QueryString["port"]; - if (string.IsNullOrEmpty(port)) - throw new DnsWebServiceException("Parameter 'port' missing."); - - string target = request.QueryString["target"]; - if (string.IsNullOrEmpty(target)) - { - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'target' missing."); - - target = value; - } - - _dnsWebService._dnsServer.AuthZoneManager.DeleteRecord(zoneInfo.Name, domain, type, new DnsSRVRecordData(ushort.Parse(priority), ushort.Parse(weight), ushort.Parse(port), target)); + _dnsWebService._dnsServer.AuthZoneManager.DeleteRecord(zoneInfo.Name, domain, type, new DnsSRVRecordData(priority, weight, port, target)); } break; @@ -2644,98 +2211,49 @@ namespace DnsServerCore case DnsResourceRecordType.DS: { - string strKeyTag = request.QueryString["keyTag"]; - if (string.IsNullOrEmpty(strKeyTag)) - throw new DnsWebServiceException("Parameter 'keyTag' missing."); + ushort keyTag = request.GetQuery("keyTag", ushort.Parse); + DnssecAlgorithm algorithm = Enum.Parse(request.GetQuery("algorithm").Replace('-', '_'), true); + DnssecDigestType digestType = Enum.Parse(request.GetQuery("digestType").Replace('-', '_'), true); + byte[] digest = Convert.FromHexString(request.GetQueryAlt("digest", "value")); - string strAlgorithm = request.QueryString["algorithm"]; - if (string.IsNullOrEmpty(strAlgorithm)) - throw new DnsWebServiceException("Parameter 'algorithm' missing."); - - string strDigestType = request.QueryString["digestType"]; - if (string.IsNullOrEmpty(strDigestType)) - throw new DnsWebServiceException("Parameter 'digestType' missing."); - - string digest = request.QueryString["digest"]; - if (string.IsNullOrEmpty(digest)) - { - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'digest' missing."); - - digest = value; - } - - _dnsWebService._dnsServer.AuthZoneManager.DeleteRecord(zoneInfo.Name, domain, type, new DnsDSRecordData(ushort.Parse(strKeyTag), Enum.Parse(strAlgorithm.Replace('-', '_'), true), Enum.Parse(strDigestType.Replace('-', '_'), true), Convert.FromHexString(digest))); + _dnsWebService._dnsServer.AuthZoneManager.DeleteRecord(zoneInfo.Name, domain, type, new DnsDSRecordData(keyTag, algorithm, digestType, digest)); } break; case DnsResourceRecordType.SSHFP: { - string strAlgorithm = request.QueryString["sshfpAlgorithm"]; - if (string.IsNullOrEmpty(strAlgorithm)) - throw new DnsWebServiceException("Parameter 'sshfpAlgorithm' missing."); + DnsSSHFPAlgorithm sshfpAlgorithm = request.GetQuery("sshfpAlgorithm"); + DnsSSHFPFingerprintType sshfpFingerprintType = request.GetQuery("sshfpFingerprintType"); + byte[] sshfpFingerprint = request.GetQuery("sshfpFingerprint", Convert.FromHexString); - string strFingerprintType = request.QueryString["sshfpFingerprintType"]; - if (string.IsNullOrEmpty(strFingerprintType)) - throw new DnsWebServiceException("Parameter 'sshfpFingerprintType' missing."); - - string strFingerprint = request.QueryString["sshfpFingerprint"]; - if (string.IsNullOrEmpty(strFingerprint)) - throw new DnsWebServiceException("Parameter 'sshfpFingerprint' missing."); - - _dnsWebService._dnsServer.AuthZoneManager.DeleteRecord(zoneInfo.Name, domain, type, new DnsSSHFPRecordData(Enum.Parse(strAlgorithm, true), Enum.Parse(strFingerprintType, true), Convert.FromHexString(strFingerprint))); + _dnsWebService._dnsServer.AuthZoneManager.DeleteRecord(zoneInfo.Name, domain, type, new DnsSSHFPRecordData(sshfpAlgorithm, sshfpFingerprintType, sshfpFingerprint)); } break; case DnsResourceRecordType.TLSA: { - string strCertificateUsage = request.QueryString["tlsaCertificateUsage"]; - if (string.IsNullOrEmpty(strCertificateUsage)) - throw new DnsWebServiceException("Parameter 'tlsaCertificateUsage' missing."); + DnsTLSACertificateUsage tlsaCertificateUsage = Enum.Parse(request.GetQuery("tlsaCertificateUsage").Replace('-', '_'), true); + DnsTLSASelector tlsaSelector = request.GetQuery("tlsaSelector"); + DnsTLSAMatchingType tlsaMatchingType = Enum.Parse(request.GetQuery("tlsaMatchingType").Replace('-', '_'), true); + string tlsaCertificateAssociationData = request.GetQuery("tlsaCertificateAssociationData"); - string strSelector = request.QueryString["tlsaSelector"]; - if (string.IsNullOrEmpty(strSelector)) - throw new DnsWebServiceException("Parameter 'tlsaSelector' missing."); - - string strMatchingType = request.QueryString["tlsaMatchingType"]; - if (string.IsNullOrEmpty(strMatchingType)) - throw new DnsWebServiceException("Parameter 'tlsaMatchingType' missing."); - - string strCertificateAssociationData = request.QueryString["tlsaCertificateAssociationData"]; - if (string.IsNullOrEmpty(strCertificateAssociationData)) - throw new DnsWebServiceException("Parameter 'tlsaCertificateAssociationData' missing."); - - _dnsWebService._dnsServer.AuthZoneManager.DeleteRecord(zoneInfo.Name, domain, type, new DnsTLSARecordData(Enum.Parse(strCertificateUsage.Replace('-', '_'), true), Enum.Parse(strSelector, true), Enum.Parse(strMatchingType.Replace('-', '_'), true), strCertificateAssociationData)); + _dnsWebService._dnsServer.AuthZoneManager.DeleteRecord(zoneInfo.Name, domain, type, new DnsTLSARecordData(tlsaCertificateUsage, tlsaSelector, tlsaMatchingType, tlsaCertificateAssociationData)); } break; case DnsResourceRecordType.CAA: { - string flags = request.QueryString["flags"]; - if (string.IsNullOrEmpty(flags)) - throw new DnsWebServiceException("Parameter 'flags' missing."); + byte flags = request.GetQuery("flags", byte.Parse); + string tag = request.GetQuery("tag"); + string value = request.GetQuery("value"); - string tag = request.QueryString["tag"]; - if (string.IsNullOrEmpty(tag)) - throw new DnsWebServiceException("Parameter 'tag' missing."); - - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'value' missing."); - - _dnsWebService._dnsServer.AuthZoneManager.DeleteRecord(zoneInfo.Name, domain, type, new DnsCAARecordData(byte.Parse(flags), tag, value)); + _dnsWebService._dnsServer.AuthZoneManager.DeleteRecord(zoneInfo.Name, domain, type, new DnsCAARecordData(flags, tag, value)); } break; case DnsResourceRecordType.ANAME: { - string aname = request.QueryString["aname"]; - if (string.IsNullOrEmpty(aname)) - { - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'aname' missing."); - - aname = value; - } + string aname = request.GetQueryAlt("aname", "value").TrimEnd('.'); _dnsWebService._dnsServer.AuthZoneManager.DeleteRecord(zoneInfo.Name, domain, type, new DnsANAMERecordData(aname)); } @@ -2743,20 +2261,10 @@ namespace DnsServerCore case DnsResourceRecordType.FWD: { - string strProtocol = request.QueryString["protocol"]; - if (string.IsNullOrEmpty(strProtocol)) - strProtocol = "Udp"; + DnsTransportProtocol protocol = request.GetQuery("protocol", DnsTransportProtocol.Udp); + string forwarder = request.GetQueryAlt("forwarder", "value"); - string forwarder = request.QueryString["forwarder"]; - if (string.IsNullOrEmpty(forwarder)) - { - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'forwarder' missing."); - - forwarder = value; - } - - _dnsWebService._dnsServer.AuthZoneManager.DeleteRecord(zoneInfo.Name, domain, type, new DnsForwarderRecordData(Enum.Parse(strProtocol, true), forwarder)); + _dnsWebService._dnsServer.AuthZoneManager.DeleteRecord(zoneInfo.Name, domain, type, new DnsForwarderRecordData(protocol, forwarder)); } break; @@ -2768,26 +2276,18 @@ namespace DnsServerCore throw new DnsWebServiceException("Type not supported for DeleteRecord()."); } - _dnsWebService._log.Write(DnsWebService.GetRequestRemoteEndPoint(request), "[" + session.User.Username + "] Record was deleted from authoritative zone {domain: " + domain + "; type: " + type + ";}"); + _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] Record was deleted from authoritative zone {domain: " + domain + "; type: " + type + ";}"); _dnsWebService._dnsServer.AuthZoneManager.SaveZoneFile(zoneInfo.Name); } - public void UpdateRecord(HttpListenerRequest request, Utf8JsonWriter jsonWriter) + public void UpdateRecord(HttpContext context) { - string strType = request.QueryString["type"]; - if (string.IsNullOrEmpty(strType)) - throw new DnsWebServiceException("Parameter 'type' missing."); + HttpRequest request = context.Request; - DnsResourceRecordType type = Enum.Parse(strType, true); + string domain = request.GetQuery("domain").TrimEnd('.'); - string domain = request.QueryString["domain"]; - if (string.IsNullOrEmpty(domain)) - throw new DnsWebServiceException("Parameter 'domain' missing."); - - domain = domain.TrimEnd('.'); - - string zoneName = request.QueryString["zone"]; + string zoneName = request.Query["zone"]; if (zoneName is not null) zoneName = zoneName.TrimEnd('.'); @@ -2798,34 +2298,18 @@ namespace DnsServerCore if (zoneInfo.Internal) throw new DnsWebServiceException("Access was denied to manage internal DNS Server zone."); - UserSession session = _dnsWebService.GetSession(request); + UserSession session = context.GetCurrentSession(); if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneInfo.Name, session.User, PermissionFlag.Modify)) throw new DnsWebServiceException("Access was denied."); - string newDomain = request.QueryString["newDomain"]; - if (string.IsNullOrEmpty(newDomain)) - newDomain = domain; - - newDomain = newDomain.TrimEnd('.'); - - uint ttl; - string strTtl = request.QueryString["ttl"]; - if (string.IsNullOrEmpty(strTtl)) - ttl = _defaultRecordTtl; - else - ttl = uint.Parse(strTtl); - - string value = request.QueryString["value"]; - string newValue = request.QueryString["newValue"]; - - bool disable = false; - string strDisable = request.QueryString["disable"]; - if (!string.IsNullOrEmpty(strDisable)) - disable = bool.Parse(strDisable); - - string comments = request.QueryString["comments"]; + string newDomain = request.GetQuery("newDomain", domain).TrimEnd('.'); + uint ttl = request.GetQuery("ttl", uint.Parse, _defaultRecordTtl); + bool disable = request.GetQuery("disable", bool.Parse, false); + string comments = request.Query["comments"]; + DnsResourceRecordType type = request.GetQuery("type"); + DnsResourceRecord oldRecord = null; DnsResourceRecord newRecord; switch (type) @@ -2833,67 +2317,41 @@ namespace DnsServerCore case DnsResourceRecordType.A: case DnsResourceRecordType.AAAA: { - string strIPAddress = request.QueryString["ipAddress"]; - if (string.IsNullOrEmpty(strIPAddress)) - { - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'ipAddress' missing."); - - strIPAddress = value; - } - - IPAddress oldIpAddress = IPAddress.Parse(strIPAddress); - - string strNewIPAddress = request.QueryString["newIpAddress"]; - if (string.IsNullOrEmpty(strNewIPAddress)) - { - if (string.IsNullOrEmpty(newValue)) - newValue = strIPAddress; - - strNewIPAddress = newValue; - } - IPAddress newIpAddress = IPAddress.Parse(strNewIPAddress); - - bool ptr = false; - string strPtr = request.QueryString["ptr"]; - if (!string.IsNullOrEmpty(strPtr)) - ptr = bool.Parse(strPtr); + IPAddress ipAddress = IPAddress.Parse(request.GetQueryAlt("ipAddress", "value")); + IPAddress newIpAddress = IPAddress.Parse(request.GetQueryAlt("newIpAddress", "newValue", ipAddress.ToString())); + bool ptr = request.GetQuery("ptr", bool.Parse, false); if (ptr) { - string ptrDomain = Zone.GetReverseZone(newIpAddress, type == DnsResourceRecordType.A ? 32 : 128); + string newPtrDomain = Zone.GetReverseZone(newIpAddress, type == DnsResourceRecordType.A ? 32 : 128); - AuthZoneInfo reverseZoneInfo = _dnsWebService._dnsServer.AuthZoneManager.FindAuthZoneInfo(ptrDomain); - if (reverseZoneInfo == null) + AuthZoneInfo newReverseZoneInfo = _dnsWebService._dnsServer.AuthZoneManager.FindAuthZoneInfo(newPtrDomain); + if (newReverseZoneInfo is null) { - bool createPtrZone = false; - string strCreatePtrZone = request.QueryString["createPtrZone"]; - if (!string.IsNullOrEmpty(strCreatePtrZone)) - createPtrZone = bool.Parse(strCreatePtrZone); - + bool createPtrZone = request.GetQuery("createPtrZone", bool.Parse, false); if (!createPtrZone) throw new DnsServerException("No reverse zone available to add PTR record."); string ptrZone = Zone.GetReverseZone(newIpAddress, type == DnsResourceRecordType.A ? 24 : 64); - reverseZoneInfo = _dnsWebService._dnsServer.AuthZoneManager.CreatePrimaryZone(ptrZone, _dnsWebService._dnsServer.ServerDomain, false); - if (reverseZoneInfo is null) + newReverseZoneInfo = _dnsWebService._dnsServer.AuthZoneManager.CreatePrimaryZone(ptrZone, _dnsWebService._dnsServer.ServerDomain, false); + if (newReverseZoneInfo is null) throw new DnsServerException("Failed to create reverse zone to add PTR record: " + ptrZone); //set permissions - _dnsWebService._authManager.SetPermission(PermissionSection.Zones, reverseZoneInfo.Name, session.User, PermissionFlag.ViewModifyDelete); - _dnsWebService._authManager.SetPermission(PermissionSection.Zones, reverseZoneInfo.Name, _dnsWebService._authManager.GetGroup(Group.ADMINISTRATORS), PermissionFlag.ViewModifyDelete); - _dnsWebService._authManager.SetPermission(PermissionSection.Zones, reverseZoneInfo.Name, _dnsWebService._authManager.GetGroup(Group.DNS_ADMINISTRATORS), PermissionFlag.ViewModifyDelete); + _dnsWebService._authManager.SetPermission(PermissionSection.Zones, newReverseZoneInfo.Name, session.User, PermissionFlag.ViewModifyDelete); + _dnsWebService._authManager.SetPermission(PermissionSection.Zones, newReverseZoneInfo.Name, _dnsWebService._authManager.GetGroup(Group.ADMINISTRATORS), PermissionFlag.ViewModifyDelete); + _dnsWebService._authManager.SetPermission(PermissionSection.Zones, newReverseZoneInfo.Name, _dnsWebService._authManager.GetGroup(Group.DNS_ADMINISTRATORS), PermissionFlag.ViewModifyDelete); _dnsWebService._authManager.SaveConfigFile(); } - if (reverseZoneInfo.Internal) - throw new DnsServerException("Reverse zone '" + reverseZoneInfo.Name + "' is an internal zone."); + if (newReverseZoneInfo.Internal) + throw new DnsServerException("Reverse zone '" + newReverseZoneInfo.Name + "' is an internal zone."); - if (reverseZoneInfo.Type != AuthZoneType.Primary) - throw new DnsServerException("Reverse zone '" + reverseZoneInfo.Name + "' is not a primary zone."); + if (newReverseZoneInfo.Type != AuthZoneType.Primary) + throw new DnsServerException("Reverse zone '" + newReverseZoneInfo.Name + "' is not a primary zone."); - string oldPtrDomain = Zone.GetReverseZone(oldIpAddress, type == DnsResourceRecordType.A ? 32 : 128); + string oldPtrDomain = Zone.GetReverseZone(ipAddress, type == DnsResourceRecordType.A ? 32 : 128); AuthZoneInfo oldReverseZoneInfo = _dnsWebService._dnsServer.AuthZoneManager.FindAuthZoneInfo(oldPtrDomain); if ((oldReverseZoneInfo != null) && !oldReverseZoneInfo.Internal && (oldReverseZoneInfo.Type == AuthZoneType.Primary)) @@ -2904,20 +2362,18 @@ namespace DnsServerCore } //add new PTR record and save reverse zone - _dnsWebService._dnsServer.AuthZoneManager.SetRecords(reverseZoneInfo.Name, ptrDomain, DnsResourceRecordType.PTR, ttl, new DnsPTRRecordData[] { new DnsPTRRecordData(domain) }); - _dnsWebService._dnsServer.AuthZoneManager.SaveZoneFile(reverseZoneInfo.Name); + _dnsWebService._dnsServer.AuthZoneManager.SetRecords(newReverseZoneInfo.Name, newPtrDomain, DnsResourceRecordType.PTR, ttl, new DnsPTRRecordData[] { new DnsPTRRecordData(domain) }); + _dnsWebService._dnsServer.AuthZoneManager.SaveZoneFile(newReverseZoneInfo.Name); } - DnsResourceRecord oldRecord; - if (type == DnsResourceRecordType.A) { - oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsARecordData(oldIpAddress)); + oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsARecordData(ipAddress)); newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsARecordData(newIpAddress)); } else { - oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsAAAARecordData(oldIpAddress)); + oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsAAAARecordData(ipAddress)); newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsAAAARecordData(newIpAddress)); } @@ -2933,26 +2389,11 @@ namespace DnsServerCore case DnsResourceRecordType.NS: { - string nameServer = request.QueryString["nameServer"]; - if (string.IsNullOrEmpty(nameServer)) - { - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'nameServer' missing."); + string nameServer = request.GetQueryAlt("nameServer", "value").TrimEnd('.'); + string newNameServer = request.GetQueryAlt("newNameServer", "newValue", nameServer).TrimEnd('.'); - nameServer = value; - } - - string newNameServer = request.QueryString["newNameServer"]; - if (string.IsNullOrEmpty(newNameServer)) - { - if (string.IsNullOrEmpty(newValue)) - newValue = nameServer; - - newNameServer = newValue; - } - - DnsResourceRecord oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsNSRecordData(nameServer.TrimEnd('.'))); - newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsNSRecordData(newNameServer.TrimEnd('.'))); + oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsNSRecordData(nameServer)); + newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsNSRecordData(newNameServer)); if (disable) newRecord.Disable(); @@ -2960,8 +2401,7 @@ namespace DnsServerCore if (!string.IsNullOrEmpty(comments)) newRecord.SetComments(comments); - string glueAddresses = request.QueryString["glue"]; - if (!string.IsNullOrEmpty(glueAddresses)) + if (request.TryGetQuery("glue", out string glueAddresses)) newRecord.SetGlueRecords(glueAddresses); _dnsWebService._dnsServer.AuthZoneManager.UpdateRecord(zoneInfo.Name, oldRecord, newRecord); @@ -2970,17 +2410,10 @@ namespace DnsServerCore case DnsResourceRecordType.CNAME: { - string cname = request.QueryString["cname"]; - if (string.IsNullOrEmpty(cname)) - { - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'cname' missing."); + string cname = request.GetQueryAlt("cname", "value").TrimEnd('.'); - cname = value; - } - - DnsResourceRecord oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsCNAMERecordData(cname.TrimEnd('.'))); - newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsCNAMERecordData(cname.TrimEnd('.'))); + oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsCNAMERecordData(cname)); + newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsCNAMERecordData(cname)); if (disable) newRecord.Disable(); @@ -2994,42 +2427,21 @@ namespace DnsServerCore case DnsResourceRecordType.SOA: { - string primaryNameServer = request.QueryString["primaryNameServer"]; - if (string.IsNullOrEmpty(primaryNameServer)) - throw new DnsWebServiceException("Parameter 'primaryNameServer' missing."); + string primaryNameServer = request.GetQuery("primaryNameServer").TrimEnd('.'); + string responsiblePerson = request.GetQuery("responsiblePerson").TrimEnd('.'); + uint serial = request.GetQuery("serial", uint.Parse); + uint refresh = request.GetQuery("refresh", uint.Parse); + uint retry = request.GetQuery("retry", uint.Parse); + uint expire = request.GetQuery("expire", uint.Parse); + uint minimum = request.GetQuery("minimum", uint.Parse); - string responsiblePerson = request.QueryString["responsiblePerson"]; - if (string.IsNullOrEmpty(responsiblePerson)) - throw new DnsWebServiceException("Parameter 'responsiblePerson' missing."); - - string serial = request.QueryString["serial"]; - if (string.IsNullOrEmpty(serial)) - throw new DnsWebServiceException("Parameter 'serial' missing."); - - string refresh = request.QueryString["refresh"]; - if (string.IsNullOrEmpty(refresh)) - throw new DnsWebServiceException("Parameter 'refresh' missing."); - - string retry = request.QueryString["retry"]; - if (string.IsNullOrEmpty(retry)) - throw new DnsWebServiceException("Parameter 'retry' missing."); - - string expire = request.QueryString["expire"]; - if (string.IsNullOrEmpty(expire)) - throw new DnsWebServiceException("Parameter 'expire' missing."); - - string minimum = request.QueryString["minimum"]; - if (string.IsNullOrEmpty(minimum)) - throw new DnsWebServiceException("Parameter 'minimum' missing."); - - DnsResourceRecord newSOARecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsSOARecordData(primaryNameServer.TrimEnd('.'), responsiblePerson.TrimEnd('.'), uint.Parse(serial), uint.Parse(refresh), uint.Parse(retry), uint.Parse(expire), uint.Parse(minimum))); + DnsResourceRecord newSOARecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsSOARecordData(primaryNameServer, responsiblePerson, serial, refresh, retry, expire, minimum)); switch (zoneInfo.Type) { case AuthZoneType.Secondary: case AuthZoneType.Stub: - string primaryAddresses = request.QueryString["primaryAddresses"]; - if (!string.IsNullOrEmpty(primaryAddresses)) + if (request.TryGetQuery("primaryAddresses", out string primaryAddresses)) newSOARecord.SetPrimaryNameServers(primaryAddresses); break; @@ -3039,14 +2451,10 @@ namespace DnsServerCore { DnsResourceRecordInfo recordInfo = newSOARecord.GetRecordInfo(); - string zoneTransferProtocol = request.QueryString["zoneTransferProtocol"]; - if (string.IsNullOrEmpty(zoneTransferProtocol)) - recordInfo.ZoneTransferProtocol = DnsTransportProtocol.Tcp; - else - recordInfo.ZoneTransferProtocol = Enum.Parse(zoneTransferProtocol, true); + if (request.TryGetQuery("zoneTransferProtocol", out DnsTransportProtocol zoneTransferProtocol)) + recordInfo.ZoneTransferProtocol = zoneTransferProtocol; - string tsigKeyName = request.QueryString["tsigKeyName"]; - if (!string.IsNullOrEmpty(tsigKeyName)) + if (request.TryGetQuery("tsigKeyName", out string tsigKeyName)) recordInfo.TsigKeyName = tsigKeyName; } @@ -3061,26 +2469,11 @@ namespace DnsServerCore case DnsResourceRecordType.PTR: { - string ptrName = request.QueryString["ptrName"]; - if (string.IsNullOrEmpty(ptrName)) - { - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'ptrName' missing."); + string ptrName = request.GetQueryAlt("ptrName", "value").TrimEnd('.'); + string newPtrName = request.GetQueryAlt("newPtrName", "newValue", ptrName).TrimEnd('.'); - ptrName = value; - } - - string newPtrName = request.QueryString["newPtrName"]; - if (string.IsNullOrEmpty(newPtrName)) - { - if (string.IsNullOrEmpty(newValue)) - newValue = ptrName; - - newPtrName = newValue; - } - - DnsResourceRecord oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsPTRRecordData(ptrName.TrimEnd('.'))); - newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsPTRRecordData(newPtrName.TrimEnd('.'))); + oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsPTRRecordData(ptrName)); + newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsPTRRecordData(newPtrName)); if (disable) newRecord.Disable(); @@ -3094,34 +2487,14 @@ namespace DnsServerCore case DnsResourceRecordType.MX: { - string preference = request.QueryString["preference"]; - if (string.IsNullOrEmpty(preference)) - preference = "1"; + ushort preference = request.GetQuery("preference", ushort.Parse); + ushort newPreference = request.GetQuery("newPreference", ushort.Parse, preference); - string newPreference = request.QueryString["newPreference"]; - if (string.IsNullOrEmpty(newPreference)) - newPreference = preference; + string exchange = request.GetQueryAlt("exchange", "value").TrimEnd('.'); + string newExchange = request.GetQueryAlt("newExchange", "newValue", exchange).TrimEnd('.'); - string exchange = request.QueryString["exchange"]; - if (string.IsNullOrEmpty(exchange)) - { - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'exchange' missing."); - - exchange = value; - } - - string newExchange = request.QueryString["newExchange"]; - if (string.IsNullOrEmpty(newExchange)) - { - if (string.IsNullOrEmpty(newValue)) - newValue = exchange; - - newExchange = newValue; - } - - DnsResourceRecord oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsMXRecordData(ushort.Parse(preference), exchange.TrimEnd('.'))); - newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsMXRecordData(ushort.Parse(newPreference), newExchange.TrimEnd('.'))); + oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsMXRecordData(preference, exchange)); + newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsMXRecordData(newPreference, newExchange)); if (disable) newRecord.Disable(); @@ -3135,25 +2508,10 @@ namespace DnsServerCore case DnsResourceRecordType.TXT: { - string text = request.QueryString["text"]; - if (string.IsNullOrEmpty(text)) - { - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'text' missing."); + string text = request.GetQueryAlt("text", "value"); + string newText = request.GetQueryAlt("newText", "newValue", text); - text = value; - } - - string newText = request.QueryString["newText"]; - if (string.IsNullOrEmpty(newText)) - { - if (string.IsNullOrEmpty(newValue)) - newValue = text; - - newText = newValue; - } - - DnsResourceRecord oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsTXTRecordData(text)); + oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsTXTRecordData(text)); newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsTXTRecordData(newText)); if (disable) @@ -3168,50 +2526,20 @@ namespace DnsServerCore case DnsResourceRecordType.SRV: { - string priority = request.QueryString["priority"]; - if (string.IsNullOrEmpty(priority)) - throw new DnsWebServiceException("Parameter 'priority' missing."); + ushort priority = request.GetQuery("priority", ushort.Parse); + ushort newPriority = request.GetQuery("newPriority", ushort.Parse, priority); - string newPriority = request.QueryString["newPriority"]; - if (string.IsNullOrEmpty(newPriority)) - newPriority = priority; + ushort weight = request.GetQuery("weight", ushort.Parse); + ushort newWeight = request.GetQuery("newWeight", ushort.Parse, weight); - string weight = request.QueryString["weight"]; - if (string.IsNullOrEmpty(weight)) - throw new DnsWebServiceException("Parameter 'weight' missing."); + ushort port = request.GetQuery("port", ushort.Parse); + ushort newPort = request.GetQuery("newPort", ushort.Parse, port); - string newWeight = request.QueryString["newWeight"]; - if (string.IsNullOrEmpty(newWeight)) - newWeight = weight; + string target = request.GetQueryAlt("target", "value").TrimEnd('.'); + string newTarget = request.GetQueryAlt("newTarget", "newValue", target).TrimEnd('.'); - string port = request.QueryString["port"]; - if (string.IsNullOrEmpty(port)) - throw new DnsWebServiceException("Parameter 'port' missing."); - - string newPort = request.QueryString["newPort"]; - if (string.IsNullOrEmpty(newPort)) - newPort = port; - - string target = request.QueryString["target"]; - if (string.IsNullOrEmpty(target)) - { - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'target' missing."); - - target = value; - } - - string newTarget = request.QueryString["newTarget"]; - if (string.IsNullOrEmpty(newTarget)) - { - if (string.IsNullOrEmpty(newValue)) - newValue = target; - - newTarget = newValue; - } - - DnsResourceRecord oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsSRVRecordData(ushort.Parse(priority), ushort.Parse(weight), ushort.Parse(port), target.TrimEnd('.'))); - newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsSRVRecordData(ushort.Parse(newPriority), ushort.Parse(newWeight), ushort.Parse(newPort), newTarget.TrimEnd('.'))); + oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsSRVRecordData(priority, weight, port, target)); + newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsSRVRecordData(newPriority, newWeight, newPort, newTarget)); if (disable) newRecord.Disable(); @@ -3225,17 +2553,10 @@ namespace DnsServerCore case DnsResourceRecordType.DNAME: { - string dname = request.QueryString["dname"]; - if (string.IsNullOrEmpty(dname)) - { - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'dname' missing."); + string dname = request.GetQueryAlt("dname", "value").TrimEnd('.'); - dname = value; - } - - DnsResourceRecord oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsDNAMERecordData(dname.TrimEnd('.'))); - newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsDNAMERecordData(dname.TrimEnd('.'))); + oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsDNAMERecordData(dname)); + newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsDNAMERecordData(dname)); if (disable) newRecord.Disable(); @@ -3249,50 +2570,20 @@ namespace DnsServerCore case DnsResourceRecordType.DS: { - string strKeyTag = request.QueryString["keyTag"]; - if (string.IsNullOrEmpty(strKeyTag)) - throw new DnsWebServiceException("Parameter 'keyTag' missing."); + ushort keyTag = request.GetQuery("keyTag", ushort.Parse); + ushort newKeyTag = request.GetQuery("newKeyTag", ushort.Parse, keyTag); - string strNewKeyTag = request.QueryString["newKeyTag"]; - if (string.IsNullOrEmpty(strNewKeyTag)) - strNewKeyTag = strKeyTag; + DnssecAlgorithm algorithm = Enum.Parse(request.GetQuery("algorithm").Replace('-', '_'), true); + DnssecAlgorithm newAlgorithm = Enum.Parse(request.GetQuery("newAlgorithm", algorithm.ToString()).Replace('-', '_'), true); - string strAlgorithm = request.QueryString["algorithm"]; - if (string.IsNullOrEmpty(strAlgorithm)) - throw new DnsWebServiceException("Parameter 'algorithm' missing."); + DnssecDigestType digestType = Enum.Parse(request.GetQuery("digestType").Replace('-', '_'), true); + DnssecDigestType newDigestType = Enum.Parse(request.GetQuery("newDigestType", digestType.ToString()).Replace('-', '_'), true); - string strNewAlgorithm = request.QueryString["newAlgorithm"]; - if (string.IsNullOrEmpty(strNewAlgorithm)) - strNewAlgorithm = strAlgorithm; + byte[] digest = request.GetQueryAlt("digest", "value", Convert.FromHexString); + byte[] newDigest = request.GetQueryAlt("newDigest", "newValue", Convert.FromHexString, digest); - string strDigestType = request.QueryString["digestType"]; - if (string.IsNullOrEmpty(strDigestType)) - throw new DnsWebServiceException("Parameter 'digestType' missing."); - - string strNewDigestType = request.QueryString["newDigestType"]; - if (string.IsNullOrEmpty(strNewDigestType)) - strNewDigestType = strDigestType; - - string digest = request.QueryString["digest"]; - if (string.IsNullOrEmpty(digest)) - { - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'digest' missing."); - - digest = value; - } - - string newDigest = request.QueryString["newDigest"]; - if (string.IsNullOrEmpty(newDigest)) - { - if (string.IsNullOrEmpty(newValue)) - newValue = digest; - - newDigest = newValue; - } - - DnsResourceRecord oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsDSRecordData(ushort.Parse(strKeyTag), Enum.Parse(strAlgorithm.Replace('-', '_'), true), Enum.Parse(strDigestType.Replace('-', '_'), true), Convert.FromHexString(digest))); - newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsDSRecordData(ushort.Parse(strNewKeyTag), Enum.Parse(strNewAlgorithm.Replace('-', '_'), true), Enum.Parse(strNewDigestType.Replace('-', '_'), true), Convert.FromHexString(newDigest))); + oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsDSRecordData(keyTag, algorithm, digestType, digest)); + newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsDSRecordData(newKeyTag, newAlgorithm, newDigestType, newDigest)); if (disable) newRecord.Disable(); @@ -3306,32 +2597,17 @@ namespace DnsServerCore case DnsResourceRecordType.SSHFP: { - string strAlgorithm = request.QueryString["sshfpAlgorithm"]; - if (string.IsNullOrEmpty(strAlgorithm)) - throw new DnsWebServiceException("Parameter 'sshfpAlgorithm' missing."); + DnsSSHFPAlgorithm sshfpAlgorithm = request.GetQuery("sshfpAlgorithm"); + DnsSSHFPAlgorithm newSshfpAlgorithm = request.GetQuery("newSshfpAlgorithm", sshfpAlgorithm); - string strNewAlgorithm = request.QueryString["newSshfpAlgorithm"]; - if (string.IsNullOrEmpty(strNewAlgorithm)) - strNewAlgorithm = strAlgorithm; + DnsSSHFPFingerprintType sshfpFingerprintType = request.GetQuery("sshfpFingerprintType"); + DnsSSHFPFingerprintType newSshfpFingerprintType = request.GetQuery("newSshfpFingerprintType", sshfpFingerprintType); - string strFingerprintType = request.QueryString["sshfpFingerprintType"]; - if (string.IsNullOrEmpty(strFingerprintType)) - throw new DnsWebServiceException("Parameter 'sshfpFingerprintType' missing."); + byte[] sshfpFingerprint = request.GetQuery("sshfpFingerprint", Convert.FromHexString); + byte[] newSshfpFingerprint = request.GetQuery("newSshfpFingerprint", Convert.FromHexString, sshfpFingerprint); - string strNewFingerprintType = request.QueryString["newSshfpFingerprintType"]; - if (string.IsNullOrEmpty(strNewFingerprintType)) - strNewFingerprintType = strFingerprintType; - - string strFingerprint = request.QueryString["sshfpFingerprint"]; - if (string.IsNullOrEmpty(strFingerprint)) - throw new DnsWebServiceException("Parameter 'sshfpFingerprint' missing."); - - string strNewFingerprint = request.QueryString["newSshfpFingerprint"]; - if (string.IsNullOrEmpty(strNewFingerprint)) - strNewFingerprint = strFingerprint; - - DnsResourceRecord oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsSSHFPRecordData(Enum.Parse(strAlgorithm, true), Enum.Parse(strFingerprintType, true), Convert.FromHexString(strFingerprint))); - newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsSSHFPRecordData(Enum.Parse(strNewAlgorithm, true), Enum.Parse(strNewFingerprintType, true), Convert.FromHexString(strNewFingerprint))); + oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsSSHFPRecordData(sshfpAlgorithm, sshfpFingerprintType, sshfpFingerprint)); + newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsSSHFPRecordData(newSshfpAlgorithm, newSshfpFingerprintType, newSshfpFingerprint)); if (disable) newRecord.Disable(); @@ -3345,40 +2621,20 @@ namespace DnsServerCore case DnsResourceRecordType.TLSA: { - string strCertificateUsage = request.QueryString["tlsaCertificateUsage"]; - if (string.IsNullOrEmpty(strCertificateUsage)) - throw new DnsWebServiceException("Parameter 'tlsaCertificateUsage' missing."); + DnsTLSACertificateUsage tlsaCertificateUsage = Enum.Parse(request.GetQuery("tlsaCertificateUsage").Replace('-', '_'), true); + DnsTLSACertificateUsage newTlsaCertificateUsage = Enum.Parse(request.GetQuery("newTlsaCertificateUsage", tlsaCertificateUsage.ToString()).Replace('-', '_'), true); - string strNewCertificateUsage = request.QueryString["newTlsaCertificateUsage"]; - if (string.IsNullOrEmpty(strNewCertificateUsage)) - strNewCertificateUsage = strCertificateUsage; + DnsTLSASelector tlsaSelector = request.GetQuery("tlsaSelector"); + DnsTLSASelector newTlsaSelector = request.GetQuery("newTlsaSelector", tlsaSelector); - string strSelector = request.QueryString["tlsaSelector"]; - if (string.IsNullOrEmpty(strSelector)) - throw new DnsWebServiceException("Parameter 'tlsaSelector' missing."); + DnsTLSAMatchingType tlsaMatchingType = Enum.Parse(request.GetQuery("tlsaMatchingType").Replace('-', '_'), true); + DnsTLSAMatchingType newTlsaMatchingType = Enum.Parse(request.GetQuery("newTlsaMatchingType", tlsaMatchingType.ToString()).Replace('-', '_'), true); - string strNewSelector = request.QueryString["newTlsaSelector"]; - if (string.IsNullOrEmpty(strNewSelector)) - strNewSelector = strSelector; + string tlsaCertificateAssociationData = request.GetQuery("tlsaCertificateAssociationData"); + string newTlsaCertificateAssociationData = request.GetQuery("newTlsaCertificateAssociationData", tlsaCertificateAssociationData); - string strMatchingType = request.QueryString["tlsaMatchingType"]; - if (string.IsNullOrEmpty(strMatchingType)) - throw new DnsWebServiceException("Parameter 'tlsaMatchingType' missing."); - - string strNewMatchingType = request.QueryString["newTlsaMatchingType"]; - if (string.IsNullOrEmpty(strNewMatchingType)) - strNewMatchingType = strMatchingType; - - string strCertificateAssociationData = request.QueryString["tlsaCertificateAssociationData"]; - if (string.IsNullOrEmpty(strCertificateAssociationData)) - throw new DnsWebServiceException("Parameter 'tlsaCertificateAssociationData' missing."); - - string strNewCertificateAssociationData = request.QueryString["newTlsaCertificateAssociationData"]; - if (string.IsNullOrEmpty(strNewCertificateAssociationData)) - strNewCertificateAssociationData = strCertificateAssociationData; - - DnsResourceRecord oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsTLSARecordData(Enum.Parse(strCertificateUsage.Replace('-', '_'), true), Enum.Parse(strSelector, true), Enum.Parse(strMatchingType.Replace('-', '_'), true), strCertificateAssociationData)); - newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsTLSARecordData(Enum.Parse(strNewCertificateUsage.Replace('-', '_'), true), Enum.Parse(strNewSelector, true), Enum.Parse(strNewMatchingType.Replace('-', '_'), true), strNewCertificateAssociationData)); + oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsTLSARecordData(tlsaCertificateUsage, tlsaSelector, tlsaMatchingType, tlsaCertificateAssociationData)); + newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsTLSARecordData(newTlsaCertificateUsage, newTlsaSelector, newTlsaMatchingType, newTlsaCertificateAssociationData)); if (disable) newRecord.Disable(); @@ -3392,30 +2648,17 @@ namespace DnsServerCore case DnsResourceRecordType.CAA: { - string flags = request.QueryString["flags"]; - if (string.IsNullOrEmpty(flags)) - throw new DnsWebServiceException("Parameter 'flags' missing."); + byte flags = request.GetQuery("flags", byte.Parse); + byte newFlags = request.GetQuery("newFlags", byte.Parse, flags); - string newFlags = request.QueryString["newFlags"]; - if (string.IsNullOrEmpty(newFlags)) - newFlags = flags; + string tag = request.GetQuery("tag"); + string newTag = request.GetQuery("newTag", tag); - string tag = request.QueryString["tag"]; - if (string.IsNullOrEmpty(tag)) - throw new DnsWebServiceException("Parameter 'tag' missing."); + string value = request.GetQuery("value"); + string newValue = request.GetQuery("newValue", value); - string newTag = request.QueryString["newTag"]; - if (string.IsNullOrEmpty(newTag)) - newTag = tag; - - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'value' missing."); - - if (string.IsNullOrEmpty(newValue)) - newValue = value; - - DnsResourceRecord oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsCAARecordData(byte.Parse(flags), tag, value)); - newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsCAARecordData(byte.Parse(newFlags), newTag, newValue)); + oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsCAARecordData(flags, tag, value)); + newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsCAARecordData(newFlags, newTag, newValue)); if (disable) newRecord.Disable(); @@ -3429,26 +2672,11 @@ namespace DnsServerCore case DnsResourceRecordType.ANAME: { - string aname = request.QueryString["aname"]; - if (string.IsNullOrEmpty(aname)) - { - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'aname' missing."); + string aname = request.GetQueryAlt("aname", "value").TrimEnd('.'); + string newAName = request.GetQueryAlt("newAName", "newValue", aname).TrimEnd('.'); - aname = value; - } - - string newAName = request.QueryString["newAName"]; - if (string.IsNullOrEmpty(newAName)) - { - if (string.IsNullOrEmpty(newValue)) - newValue = aname; - - newAName = newValue; - } - - DnsResourceRecord oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsANAMERecordData(aname.TrimEnd('.'))); - newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsANAMERecordData(newAName.TrimEnd('.'))); + oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsANAMERecordData(aname)); + newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsANAMERecordData(newAName)); if (disable) newRecord.Disable(); @@ -3462,38 +2690,13 @@ namespace DnsServerCore case DnsResourceRecordType.FWD: { - DnsTransportProtocol protocol = DnsTransportProtocol.Udp; - string strProtocol = request.QueryString["protocol"]; - if (!string.IsNullOrEmpty(strProtocol)) - protocol = Enum.Parse(strProtocol, true); + DnsTransportProtocol protocol = request.GetQuery("protocol", DnsTransportProtocol.Udp); + DnsTransportProtocol newProtocol = request.GetQuery("newProtocol", protocol); - DnsTransportProtocol newProtocol = protocol; - string strNewProtocol = request.QueryString["newProtocol"]; - if (!string.IsNullOrEmpty(strNewProtocol)) - newProtocol = Enum.Parse(strNewProtocol, true); + string forwarder = request.GetQueryAlt("forwarder", "value"); + string newForwarder = request.GetQueryAlt("newForwarder", "newValue", forwarder); - string forwarder = request.QueryString["forwarder"]; - if (string.IsNullOrEmpty(forwarder)) - { - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'forwarder' missing."); - - forwarder = value; - } - - string newForwarder = request.QueryString["newForwarder"]; - if (string.IsNullOrEmpty(newForwarder)) - { - if (string.IsNullOrEmpty(newValue)) - newValue = forwarder; - - newForwarder = newValue; - } - - bool dnssecValidation = false; - string strDnssecValidation = request.QueryString["dnssecValidation"]; - if (!string.IsNullOrEmpty(strDnssecValidation)) - dnssecValidation = bool.Parse(strDnssecValidation); + bool dnssecValidation = request.GetQuery("dnssecValidation", bool.Parse, false); NetProxyType proxyType = NetProxyType.None; string proxyAddress = null; @@ -3503,27 +2706,17 @@ namespace DnsServerCore if (!newForwarder.Equals("this-server")) { - string strProxyType = request.QueryString["proxyType"]; - if (!string.IsNullOrEmpty(strProxyType)) - proxyType = Enum.Parse(strProxyType, true); - + proxyType = request.GetQuery("proxyType", NetProxyType.None); if (proxyType != NetProxyType.None) { - proxyAddress = request.QueryString["proxyAddress"]; - if (string.IsNullOrEmpty(proxyAddress)) - throw new DnsWebServiceException("Parameter 'proxyAddress' missing."); - - string strProxyPort = request.QueryString["proxyPort"]; - if (string.IsNullOrEmpty(strProxyPort)) - throw new DnsWebServiceException("Parameter 'proxyPort' missing."); - - proxyPort = ushort.Parse(strProxyPort); - proxyUsername = request.QueryString["proxyUsername"]; - proxyPassword = request.QueryString["proxyPassword"]; + proxyAddress = request.GetQuery("proxyAddress"); + proxyPort = request.GetQuery("proxyPort", ushort.Parse); + proxyUsername = request.Query["proxyUsername"]; + proxyPassword = request.Query["proxyPassword"]; } } - DnsResourceRecord oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsForwarderRecordData(protocol, forwarder)); + oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsForwarderRecordData(protocol, forwarder)); newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsForwarderRecordData(newProtocol, newForwarder, dnssecValidation, proxyType, proxyAddress, proxyPort, proxyUsername, proxyPassword)); if (disable) @@ -3538,24 +2731,11 @@ namespace DnsServerCore case DnsResourceRecordType.APP: { - string appName = request.QueryString["appName"]; - if (string.IsNullOrEmpty(appName)) - { - if (string.IsNullOrEmpty(value)) - throw new DnsWebServiceException("Parameter 'appName' missing."); + string appName = request.GetQueryAlt("appName", "value"); + string classPath = request.GetQuery("classPath"); + string recordData = request.GetQuery("recordData", ""); - appName = value; - } - - string classPath = request.QueryString["classPath"]; - if (string.IsNullOrEmpty(classPath)) - throw new DnsWebServiceException("Parameter 'classPath' missing."); - - string recordData = request.QueryString["recordData"]; - if (string.IsNullOrEmpty(recordData)) - recordData = ""; - - DnsResourceRecord oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsApplicationRecordData(appName, classPath, recordData)); + oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsApplicationRecordData(appName, classPath, recordData)); newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsApplicationRecordData(appName, classPath, recordData)); if (disable) @@ -3572,10 +2752,12 @@ namespace DnsServerCore throw new DnsWebServiceException("Type not supported for UpdateRecords()."); } - _dnsWebService._log.Write(DnsWebService.GetRequestRemoteEndPoint(request), "[" + session.User.Username + "] Record was updated for authoritative zone {oldDomain: " + domain + "; domain: " + newDomain + "; type: " + type + "; oldValue: " + value + "; value: " + newValue + "; ttl: " + ttl + "; disabled: " + disable + ";}"); + _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] Record was updated for authoritative zone {" + (oldRecord is null ? "" : "oldRecord: " + oldRecord.ToString() + "; ") + "newRecord: " + newRecord.ToString() + "}"); _dnsWebService._dnsServer.AuthZoneManager.SaveZoneFile(zoneInfo.Name); + Utf8JsonWriter jsonWriter = context.GetCurrentJsonWriter(); + jsonWriter.WritePropertyName("zone"); WriteZoneInfoAsJson(zoneInfo, jsonWriter);