2022-12-24 17:14:51 +05:30
/ *
Technitium DNS Server
2025-01-11 17:59:23 +05:30
Copyright ( C ) 2025 Shreyas Zare ( shreyas @technitium . com )
2022-12-24 17:14:51 +05:30
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
the Free Software Foundation , either version 3 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program . If not , see < http : //www.gnu.org/licenses/>.
* /
using DnsServerCore.Auth ;
using DnsServerCore.Dns ;
2023-01-01 18:27:19 +05:30
using Microsoft.AspNetCore.Http ;
2022-12-24 17:14:51 +05:30
using System ;
using System.Collections.Generic ;
2023-09-23 18:18:19 +05:30
using System.Collections.Immutable ;
2022-12-24 17:14:51 +05:30
using System.IO ;
using System.IO.Compression ;
using System.Net ;
2024-05-19 16:26:07 +05:30
using System.Net.Mail ;
2022-12-24 17:14:51 +05:30
using System.Net.Sockets ;
using System.Text ;
using System.Text.Json ;
using System.Threading ;
using System.Threading.Tasks ;
2023-01-01 18:27:19 +05:30
using TechnitiumLibrary ;
2022-12-24 17:14:51 +05:30
using TechnitiumLibrary.Net ;
using TechnitiumLibrary.Net.Dns ;
2024-02-04 18:07:08 +05:30
using TechnitiumLibrary.Net.Dns.ClientConnection ;
2022-12-24 17:14:51 +05:30
using TechnitiumLibrary.Net.Dns.ResourceRecords ;
using TechnitiumLibrary.Net.Proxy ;
namespace DnsServerCore
{
2025-02-15 12:51:16 +05:30
public partial class DnsWebService
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
sealed class WebServiceSettingsApi : IDisposable
{
#region variables
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
readonly DnsWebService _dnsWebService ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
Timer _blockListUpdateTimer ;
DateTime _blockListLastUpdatedOn ;
int _blockListUpdateIntervalHours = 24 ;
const int BLOCK_LIST_UPDATE_TIMER_INITIAL_INTERVAL = 5000 ;
const int BLOCK_LIST_UPDATE_TIMER_PERIODIC_INTERVAL = 900000 ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
Timer _temporaryDisableBlockingTimer ;
DateTime _temporaryDisableBlockingTill ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
#endregion
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
#region constructor
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
public WebServiceSettingsApi ( DnsWebService dnsWebService )
{
_dnsWebService = dnsWebService ;
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
#endregion
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
#region IDisposable
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
bool _disposed ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
public void Dispose ( )
{
if ( _disposed )
return ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( _blockListUpdateTimer is not null )
_blockListUpdateTimer . Dispose ( ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( _temporaryDisableBlockingTimer is not null )
_temporaryDisableBlockingTimer . Dispose ( ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
_disposed = true ;
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
#endregion
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
#region block list
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
private void ForceUpdateBlockLists ( bool forceReload )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
Task . Run ( async delegate ( )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
if ( await _dnsWebService . _dnsServer . BlockListZoneManager . UpdateBlockListsAsync ( forceReload ) )
{
//block lists were updated
//save last updated on time
_blockListLastUpdatedOn = DateTime . UtcNow ;
_dnsWebService . SaveConfigFile ( ) ;
}
} ) ;
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
public void StartBlockListUpdateTimer ( bool forceUpdateAndReload )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
if ( _blockListUpdateTimer is null )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
if ( forceUpdateAndReload )
_blockListLastUpdatedOn = default ;
_blockListUpdateTimer = new Timer ( async delegate ( object state )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
try
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
if ( DateTime . UtcNow > _blockListLastUpdatedOn . AddHours ( _blockListUpdateIntervalHours ) )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
if ( await _dnsWebService . _dnsServer . BlockListZoneManager . UpdateBlockListsAsync ( _blockListLastUpdatedOn = = default ) )
{
//block lists were updated
//save last updated on time
_blockListLastUpdatedOn = DateTime . UtcNow ;
_dnsWebService . SaveConfigFile ( ) ;
}
2022-12-24 17:14:51 +05:30
}
}
2025-02-15 12:51:16 +05:30
catch ( Exception ex )
{
_dnsWebService . _log . Write ( "DNS Server encountered an error while updating block lists.\r\n" + ex . ToString ( ) ) ;
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
} , null , BLOCK_LIST_UPDATE_TIMER_INITIAL_INTERVAL , BLOCK_LIST_UPDATE_TIMER_PERIODIC_INTERVAL ) ;
}
2022-12-24 17:14:51 +05:30
}
2025-02-15 12:51:16 +05:30
public void StopBlockListUpdateTimer ( )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
if ( _blockListUpdateTimer is not null )
{
_blockListUpdateTimer . Dispose ( ) ;
_blockListUpdateTimer = null ;
}
2022-12-24 17:14:51 +05:30
}
2025-02-15 12:51:16 +05:30
public void StopTemporaryDisableBlockingTimer ( )
{
Timer temporaryDisableBlockingTimer = _temporaryDisableBlockingTimer ;
if ( temporaryDisableBlockingTimer is not null )
temporaryDisableBlockingTimer . Dispose ( ) ;
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
#endregion
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
#region private
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
private void RestartService ( bool restartDnsService , bool restartWebService , IReadOnlyList < IPAddress > oldWebServiceLocalAddresses , int oldWebServiceHttpPort , int oldWebServiceTlsPort )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
if ( restartDnsService )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
_ = Task . Run ( async delegate ( )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
_dnsWebService . _log . Write ( "Attempting to restart DNS service." ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
try
{
await _dnsWebService . _dnsServer . StopAsync ( ) ;
await _dnsWebService . _dnsServer . StartAsync ( ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
_dnsWebService . _log . Write ( "DNS service was restarted successfully." ) ;
}
catch ( Exception ex )
{
_dnsWebService . _log . Write ( "Failed to restart DNS service.\r\n" + ex . ToString ( ) ) ;
}
} ) ;
}
if ( restartWebService )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
_ = Task . Run ( async delegate ( )
{
await Task . Delay ( 2000 ) ; //wait for this HTTP response to be delivered before stopping web server
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
_dnsWebService . _log . Write ( "Attempting to restart web service." ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
try
{
await _dnsWebService . StopWebServiceAsync ( ) ;
await _dnsWebService . TryStartWebServiceAsync ( oldWebServiceLocalAddresses , oldWebServiceHttpPort , oldWebServiceTlsPort ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
_dnsWebService . _log . Write ( "Web service was restarted successfully." ) ;
}
catch ( Exception ex )
{
_dnsWebService . _log . Write ( "Failed to restart web service.\r\n" + ex . ToString ( ) ) ;
}
} ) ;
}
2022-12-24 17:14:51 +05:30
}
2025-02-15 12:51:16 +05:30
private static async Task CreateBackupEntryFromFileAsync ( ZipArchive backupZip , string sourceFileName , string entryName )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
using ( FileStream fS = new FileStream ( sourceFileName , FileMode . Open , FileAccess . Read , FileShare . ReadWrite ) )
{
ZipArchiveEntry entry = backupZip . CreateEntry ( entryName ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
DateTime lastWrite = File . GetLastWriteTime ( sourceFileName ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
// If file to be archived has an invalid last modified time, use the first datetime representable in the Zip timestamp format
// (midnight on January 1, 1980):
if ( lastWrite . Year < 1980 | | lastWrite . Year > 2107 )
lastWrite = new DateTime ( 1980 , 1 , 1 , 0 , 0 , 0 ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
entry . LastWriteTime = lastWrite ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
using ( Stream sE = entry . Open ( ) )
{
await fS . CopyToAsync ( sE ) ;
}
2022-12-24 17:14:51 +05:30
}
}
2025-02-15 12:51:16 +05:30
private void WriteDnsSettings ( Utf8JsonWriter jsonWriter )
{
//general
jsonWriter . WriteString ( "version" , _dnsWebService . GetServerVersion ( ) ) ;
jsonWriter . WriteString ( "uptimestamp" , _dnsWebService . _uptimestamp ) ;
jsonWriter . WriteString ( "dnsServerDomain" , _dnsWebService . _dnsServer . ServerDomain ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
jsonWriter . WriteStringArray ( "dnsServerLocalEndPoints" , _dnsWebService . _dnsServer . LocalEndPoints ) ;
2023-10-29 19:52:40 +05:30
2025-02-15 12:51:16 +05:30
jsonWriter . WriteStringArray ( "dnsServerIPv4SourceAddresses" , DnsClientConnection . IPv4SourceAddresses ) ;
jsonWriter . WriteStringArray ( "dnsServerIPv6SourceAddresses" , DnsClientConnection . IPv6SourceAddresses ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
jsonWriter . WriteNumber ( "defaultRecordTtl" , _dnsWebService . _zonesApi . DefaultRecordTtl ) ;
jsonWriter . WriteString ( "defaultResponsiblePerson" , _dnsWebService . _dnsServer . ResponsiblePersonInternal ? . Address ) ;
jsonWriter . WriteBoolean ( "useSoaSerialDateScheme" , _dnsWebService . _dnsServer . AuthZoneManager . UseSoaSerialDateScheme ) ;
jsonWriter . WriteNumber ( "minSoaRefresh" , _dnsWebService . _dnsServer . AuthZoneManager . MinSoaRefresh ) ;
jsonWriter . WriteNumber ( "minSoaRetry" , _dnsWebService . _dnsServer . AuthZoneManager . MinSoaRetry ) ;
jsonWriter . WriteStringArray ( "zoneTransferAllowedNetworks" , _dnsWebService . _dnsServer . ZoneTransferAllowedNetworks ) ;
jsonWriter . WriteStringArray ( "notifyAllowedNetworks" , _dnsWebService . _dnsServer . NotifyAllowedNetworks ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
jsonWriter . WriteBoolean ( "dnsAppsEnableAutomaticUpdate" , _dnsWebService . _appsApi . EnableAutomaticUpdate ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
jsonWriter . WriteBoolean ( "preferIPv6" , _dnsWebService . _dnsServer . PreferIPv6 ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
jsonWriter . WriteNumber ( "udpPayloadSize" , _dnsWebService . _dnsServer . UdpPayloadSize ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
jsonWriter . WriteBoolean ( "dnssecValidation" , _dnsWebService . _dnsServer . DnssecValidation ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
jsonWriter . WriteBoolean ( "eDnsClientSubnet" , _dnsWebService . _dnsServer . EDnsClientSubnet ) ;
jsonWriter . WriteNumber ( "eDnsClientSubnetIPv4PrefixLength" , _dnsWebService . _dnsServer . EDnsClientSubnetIPv4PrefixLength ) ;
jsonWriter . WriteNumber ( "eDnsClientSubnetIPv6PrefixLength" , _dnsWebService . _dnsServer . EDnsClientSubnetIPv6PrefixLength ) ;
jsonWriter . WriteString ( "eDnsClientSubnetIpv4Override" , _dnsWebService . _dnsServer . EDnsClientSubnetIpv4Override ? . ToString ( ) ) ;
jsonWriter . WriteString ( "eDnsClientSubnetIpv6Override" , _dnsWebService . _dnsServer . EDnsClientSubnetIpv6Override ? . ToString ( ) ) ;
2024-02-04 18:07:08 +05:30
2025-02-15 12:51:16 +05:30
jsonWriter . WriteNumber ( "qpmLimitRequests" , _dnsWebService . _dnsServer . QpmLimitRequests ) ;
jsonWriter . WriteNumber ( "qpmLimitErrors" , _dnsWebService . _dnsServer . QpmLimitErrors ) ;
jsonWriter . WriteNumber ( "qpmLimitSampleMinutes" , _dnsWebService . _dnsServer . QpmLimitSampleMinutes ) ;
jsonWriter . WriteNumber ( "qpmLimitIPv4PrefixLength" , _dnsWebService . _dnsServer . QpmLimitIPv4PrefixLength ) ;
jsonWriter . WriteNumber ( "qpmLimitIPv6PrefixLength" , _dnsWebService . _dnsServer . QpmLimitIPv6PrefixLength ) ;
2024-02-04 18:07:08 +05:30
2025-02-15 12:51:16 +05:30
jsonWriter . WritePropertyName ( "qpmLimitBypassList" ) ;
jsonWriter . WriteStartArray ( ) ;
2024-02-04 18:07:08 +05:30
2025-02-15 12:51:16 +05:30
if ( _dnsWebService . _dnsServer . QpmLimitBypassList is not null )
{
foreach ( NetworkAddress network in _dnsWebService . _dnsServer . QpmLimitBypassList )
jsonWriter . WriteStringValue ( network . ToString ( ) ) ;
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
jsonWriter . WriteEndArray ( ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
jsonWriter . WriteNumber ( "clientTimeout" , _dnsWebService . _dnsServer . ClientTimeout ) ;
jsonWriter . WriteNumber ( "tcpSendTimeout" , _dnsWebService . _dnsServer . TcpSendTimeout ) ;
jsonWriter . WriteNumber ( "tcpReceiveTimeout" , _dnsWebService . _dnsServer . TcpReceiveTimeout ) ;
jsonWriter . WriteNumber ( "quicIdleTimeout" , _dnsWebService . _dnsServer . QuicIdleTimeout ) ;
jsonWriter . WriteNumber ( "quicMaxInboundStreams" , _dnsWebService . _dnsServer . QuicMaxInboundStreams ) ;
jsonWriter . WriteNumber ( "listenBacklog" , _dnsWebService . _dnsServer . ListenBacklog ) ;
jsonWriter . WriteNumber ( "maxConcurrentResolutionsPerCore" , _dnsWebService . _dnsServer . MaxConcurrentResolutionsPerCore ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
//web service
jsonWriter . WritePropertyName ( "webServiceLocalAddresses" ) ;
2024-11-16 14:10:21 +05:30
jsonWriter . WriteStartArray ( ) ;
2025-02-15 12:51:16 +05:30
foreach ( IPAddress localAddress in _dnsWebService . _webServiceLocalAddresses )
2024-11-16 14:10:21 +05:30
{
2025-02-15 12:51:16 +05:30
if ( localAddress . AddressFamily = = AddressFamily . InterNetworkV6 )
jsonWriter . WriteStringValue ( "[" + localAddress . ToString ( ) + "]" ) ;
else
jsonWriter . WriteStringValue ( localAddress . ToString ( ) ) ;
2024-11-16 14:10:21 +05:30
}
jsonWriter . WriteEndArray ( ) ;
2025-02-15 12:51:16 +05:30
jsonWriter . WriteNumber ( "webServiceHttpPort" , _dnsWebService . _webServiceHttpPort ) ;
jsonWriter . WriteBoolean ( "webServiceEnableTls" , _dnsWebService . _webServiceEnableTls ) ;
jsonWriter . WriteBoolean ( "webServiceEnableHttp3" , _dnsWebService . _webServiceEnableHttp3 ) ;
jsonWriter . WriteBoolean ( "webServiceHttpToTlsRedirect" , _dnsWebService . _webServiceHttpToTlsRedirect ) ;
jsonWriter . WriteBoolean ( "webServiceUseSelfSignedTlsCertificate" , _dnsWebService . _webServiceUseSelfSignedTlsCertificate ) ;
jsonWriter . WriteNumber ( "webServiceTlsPort" , _dnsWebService . _webServiceTlsPort ) ;
jsonWriter . WriteString ( "webServiceTlsCertificatePath" , _dnsWebService . _webServiceTlsCertificatePath ) ;
jsonWriter . WriteString ( "webServiceTlsCertificatePassword" , "************" ) ;
jsonWriter . WriteString ( "webServiceRealIpHeader" , _dnsWebService . _webServiceRealIpHeader ) ;
//optional protocols
jsonWriter . WriteBoolean ( "enableDnsOverUdpProxy" , _dnsWebService . _dnsServer . EnableDnsOverUdpProxy ) ;
jsonWriter . WriteBoolean ( "enableDnsOverTcpProxy" , _dnsWebService . _dnsServer . EnableDnsOverTcpProxy ) ;
jsonWriter . WriteBoolean ( "enableDnsOverHttp" , _dnsWebService . _dnsServer . EnableDnsOverHttp ) ;
jsonWriter . WriteBoolean ( "enableDnsOverTls" , _dnsWebService . _dnsServer . EnableDnsOverTls ) ;
jsonWriter . WriteBoolean ( "enableDnsOverHttps" , _dnsWebService . _dnsServer . EnableDnsOverHttps ) ;
jsonWriter . WriteBoolean ( "enableDnsOverHttp3" , _dnsWebService . _dnsServer . EnableDnsOverHttp3 ) ;
jsonWriter . WriteBoolean ( "enableDnsOverQuic" , _dnsWebService . _dnsServer . EnableDnsOverQuic ) ;
jsonWriter . WriteNumber ( "dnsOverUdpProxyPort" , _dnsWebService . _dnsServer . DnsOverUdpProxyPort ) ;
jsonWriter . WriteNumber ( "dnsOverTcpProxyPort" , _dnsWebService . _dnsServer . DnsOverTcpProxyPort ) ;
jsonWriter . WriteNumber ( "dnsOverHttpPort" , _dnsWebService . _dnsServer . DnsOverHttpPort ) ;
jsonWriter . WriteNumber ( "dnsOverTlsPort" , _dnsWebService . _dnsServer . DnsOverTlsPort ) ;
jsonWriter . WriteNumber ( "dnsOverHttpsPort" , _dnsWebService . _dnsServer . DnsOverHttpsPort ) ;
jsonWriter . WriteNumber ( "dnsOverQuicPort" , _dnsWebService . _dnsServer . DnsOverQuicPort ) ;
jsonWriter . WritePropertyName ( "reverseProxyNetworkACL" ) ;
{
jsonWriter . WriteStartArray ( ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( _dnsWebService . _dnsServer . ReverseProxyNetworkACL is not null )
{
foreach ( NetworkAccessControl nac in _dnsWebService . _dnsServer . ReverseProxyNetworkACL )
jsonWriter . WriteStringValue ( nac . ToString ( ) ) ;
}
jsonWriter . WriteEndArray ( ) ;
}
jsonWriter . WriteString ( "dnsTlsCertificatePath" , _dnsWebService . _dnsTlsCertificatePath ) ;
jsonWriter . WriteString ( "dnsTlsCertificatePassword" , "************" ) ;
jsonWriter . WriteString ( "dnsOverHttpRealIpHeader" , _dnsWebService . _dnsServer . DnsOverHttpRealIpHeader ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
//tsig
jsonWriter . WritePropertyName ( "tsigKeys" ) ;
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
jsonWriter . WriteStartArray ( ) ;
if ( _dnsWebService . _dnsServer . TsigKeys is not null )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
foreach ( KeyValuePair < string , TsigKey > tsigKey in _dnsWebService . _dnsServer . TsigKeys . ToImmutableSortedDictionary ( ) )
{
jsonWriter . WriteStartObject ( ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
jsonWriter . WriteString ( "keyName" , tsigKey . Key ) ;
jsonWriter . WriteString ( "sharedSecret" , tsigKey . Value . SharedSecret ) ;
jsonWriter . WriteString ( "algorithmName" , tsigKey . Value . AlgorithmName ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
jsonWriter . WriteEndObject ( ) ;
}
2022-12-24 17:14:51 +05:30
}
2025-02-15 12:51:16 +05:30
jsonWriter . WriteEndArray ( ) ;
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
//recursion
jsonWriter . WriteString ( "recursion" , _dnsWebService . _dnsServer . Recursion . ToString ( ) ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
jsonWriter . WritePropertyName ( "recursionNetworkACL" ) ;
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
jsonWriter . WriteStartArray ( ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( _dnsWebService . _dnsServer . RecursionNetworkACL is not null )
{
foreach ( NetworkAccessControl nac in _dnsWebService . _dnsServer . RecursionNetworkACL )
jsonWriter . WriteStringValue ( nac . ToString ( ) ) ;
}
2023-10-29 19:52:40 +05:30
2025-02-15 12:51:16 +05:30
jsonWriter . WriteEndArray ( ) ;
}
2023-10-29 19:52:40 +05:30
2025-02-15 12:51:16 +05:30
jsonWriter . WriteBoolean ( "randomizeName" , _dnsWebService . _dnsServer . RandomizeName ) ;
jsonWriter . WriteBoolean ( "qnameMinimization" , _dnsWebService . _dnsServer . QnameMinimization ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
jsonWriter . WriteNumber ( "resolverRetries" , _dnsWebService . _dnsServer . ResolverRetries ) ;
jsonWriter . WriteNumber ( "resolverTimeout" , _dnsWebService . _dnsServer . ResolverTimeout ) ;
jsonWriter . WriteNumber ( "resolverConcurrency" , _dnsWebService . _dnsServer . ResolverConcurrency ) ;
jsonWriter . WriteNumber ( "resolverMaxStackCount" , _dnsWebService . _dnsServer . ResolverMaxStackCount ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
//cache
jsonWriter . WriteBoolean ( "saveCache" , _dnsWebService . _saveCache ) ;
jsonWriter . WriteBoolean ( "serveStale" , _dnsWebService . _dnsServer . ServeStale ) ;
jsonWriter . WriteNumber ( "serveStaleTtl" , _dnsWebService . _dnsServer . CacheZoneManager . ServeStaleTtl ) ;
jsonWriter . WriteNumber ( "serveStaleAnswerTtl" , _dnsWebService . _dnsServer . CacheZoneManager . ServeStaleAnswerTtl ) ;
jsonWriter . WriteNumber ( "serveStaleResetTtl" , _dnsWebService . _dnsServer . CacheZoneManager . ServeStaleResetTtl ) ;
jsonWriter . WriteNumber ( "serveStaleMaxWaitTime" , _dnsWebService . _dnsServer . ServeStaleMaxWaitTime ) ;
jsonWriter . WriteNumber ( "cacheMaximumEntries" , _dnsWebService . _dnsServer . CacheZoneManager . MaximumEntries ) ;
jsonWriter . WriteNumber ( "cacheMinimumRecordTtl" , _dnsWebService . _dnsServer . CacheZoneManager . MinimumRecordTtl ) ;
jsonWriter . WriteNumber ( "cacheMaximumRecordTtl" , _dnsWebService . _dnsServer . CacheZoneManager . MaximumRecordTtl ) ;
jsonWriter . WriteNumber ( "cacheNegativeRecordTtl" , _dnsWebService . _dnsServer . CacheZoneManager . NegativeRecordTtl ) ;
jsonWriter . WriteNumber ( "cacheFailureRecordTtl" , _dnsWebService . _dnsServer . CacheZoneManager . FailureRecordTtl ) ;
jsonWriter . WriteNumber ( "cachePrefetchEligibility" , _dnsWebService . _dnsServer . CachePrefetchEligibility ) ;
jsonWriter . WriteNumber ( "cachePrefetchTrigger" , _dnsWebService . _dnsServer . CachePrefetchTrigger ) ;
jsonWriter . WriteNumber ( "cachePrefetchSampleIntervalInMinutes" , _dnsWebService . _dnsServer . CachePrefetchSampleIntervalInMinutes ) ;
jsonWriter . WriteNumber ( "cachePrefetchSampleEligibilityHitsPerHour" , _dnsWebService . _dnsServer . CachePrefetchSampleEligibilityHitsPerHour ) ;
//blocking
jsonWriter . WriteBoolean ( "enableBlocking" , _dnsWebService . _dnsServer . EnableBlocking ) ;
jsonWriter . WriteBoolean ( "allowTxtBlockingReport" , _dnsWebService . _dnsServer . AllowTxtBlockingReport ) ;
jsonWriter . WritePropertyName ( "blockingBypassList" ) ;
jsonWriter . WriteStartArray ( ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( _dnsWebService . _dnsServer . BlockingBypassList is not null )
{
foreach ( NetworkAddress network in _dnsWebService . _dnsServer . BlockingBypassList )
jsonWriter . WriteStringValue ( network . ToString ( ) ) ;
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
jsonWriter . WriteEndArray ( ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( ! _dnsWebService . _dnsServer . EnableBlocking & & ( DateTime . UtcNow < _temporaryDisableBlockingTill ) )
jsonWriter . WriteString ( "temporaryDisableBlockingTill" , _temporaryDisableBlockingTill ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
jsonWriter . WriteString ( "blockingType" , _dnsWebService . _dnsServer . BlockingType . ToString ( ) ) ;
jsonWriter . WriteNumber ( "blockingAnswerTtl" , _dnsWebService . _dnsServer . BlockingAnswerTtl ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
jsonWriter . WritePropertyName ( "customBlockingAddresses" ) ;
2022-12-24 17:14:51 +05:30
jsonWriter . WriteStartArray ( ) ;
2025-02-15 12:51:16 +05:30
foreach ( DnsARecordData record in _dnsWebService . _dnsServer . CustomBlockingARecords )
jsonWriter . WriteStringValue ( record . Address . ToString ( ) ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
foreach ( DnsAAAARecordData record in _dnsWebService . _dnsServer . CustomBlockingAAAARecords )
jsonWriter . WriteStringValue ( record . Address . ToString ( ) ) ;
2022-12-24 17:14:51 +05:30
jsonWriter . WriteEndArray ( ) ;
2025-02-15 12:51:16 +05:30
jsonWriter . WritePropertyName ( "blockListUrls" ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( ( _dnsWebService . _dnsServer . BlockListZoneManager . AllowListUrls . Count = = 0 ) & & ( _dnsWebService . _dnsServer . BlockListZoneManager . BlockListUrls . Count = = 0 ) )
{
jsonWriter . WriteNullValue ( ) ;
}
else
{
jsonWriter . WriteStartArray ( ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
foreach ( Uri allowListUrl in _dnsWebService . _dnsServer . BlockListZoneManager . AllowListUrls )
jsonWriter . WriteStringValue ( "!" + allowListUrl . AbsoluteUri ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
foreach ( Uri blockListUrl in _dnsWebService . _dnsServer . BlockListZoneManager . BlockListUrls )
jsonWriter . WriteStringValue ( blockListUrl . AbsoluteUri ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
jsonWriter . WriteEndArray ( ) ;
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
jsonWriter . WriteNumber ( "blockListUpdateIntervalHours" , _blockListUpdateIntervalHours ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( _blockListUpdateTimer is not null )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
DateTime blockListNextUpdatedOn = _blockListLastUpdatedOn . AddHours ( _blockListUpdateIntervalHours ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
jsonWriter . WriteString ( "blockListNextUpdatedOn" , blockListNextUpdatedOn ) ;
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
//proxy & forwarders
jsonWriter . WritePropertyName ( "proxy" ) ;
if ( _dnsWebService . _dnsServer . Proxy = = null )
{
jsonWriter . WriteNullValue ( ) ;
}
else
{
jsonWriter . WriteStartObject ( ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
NetProxy proxy = _dnsWebService . _dnsServer . Proxy ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
jsonWriter . WriteString ( "type" , proxy . Type . ToString ( ) ) ;
jsonWriter . WriteString ( "address" , proxy . Address ) ;
jsonWriter . WriteNumber ( "port" , proxy . Port ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
NetworkCredential credential = proxy . Credential ;
if ( credential ! = null )
{
jsonWriter . WriteString ( "username" , credential . UserName ) ;
jsonWriter . WriteString ( "password" , credential . Password ) ;
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
jsonWriter . WritePropertyName ( "bypass" ) ;
jsonWriter . WriteStartArray ( ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
foreach ( NetProxyBypassItem item in proxy . BypassList )
jsonWriter . WriteStringValue ( item . Value ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
jsonWriter . WriteEndArray ( ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
jsonWriter . WriteEndObject ( ) ;
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
jsonWriter . WritePropertyName ( "forwarders" ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
DnsTransportProtocol forwarderProtocol = DnsTransportProtocol . Udp ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( _dnsWebService . _dnsServer . Forwarders = = null )
{
jsonWriter . WriteNullValue ( ) ;
}
else
{
forwarderProtocol = _dnsWebService . _dnsServer . Forwarders [ 0 ] . Protocol ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
jsonWriter . WriteStartArray ( ) ;
2024-02-04 18:07:08 +05:30
2025-02-15 12:51:16 +05:30
foreach ( NameServerAddress forwarder in _dnsWebService . _dnsServer . Forwarders )
jsonWriter . WriteStringValue ( forwarder . OriginalAddress ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
jsonWriter . WriteEndArray ( ) ;
}
2023-01-01 18:27:19 +05:30
2025-02-15 12:51:16 +05:30
jsonWriter . WriteString ( "forwarderProtocol" , forwarderProtocol . ToString ( ) ) ;
jsonWriter . WriteBoolean ( "concurrentForwarding" , _dnsWebService . _dnsServer . ConcurrentForwarding ) ;
2023-01-01 18:27:19 +05:30
2025-02-15 12:51:16 +05:30
jsonWriter . WriteNumber ( "forwarderRetries" , _dnsWebService . _dnsServer . ForwarderRetries ) ;
jsonWriter . WriteNumber ( "forwarderTimeout" , _dnsWebService . _dnsServer . ForwarderTimeout ) ;
jsonWriter . WriteNumber ( "forwarderConcurrency" , _dnsWebService . _dnsServer . ForwarderConcurrency ) ;
2023-01-01 18:27:19 +05:30
2025-02-15 12:51:16 +05:30
//logging
2025-03-29 19:07:33 +05:30
jsonWriter . WriteBoolean ( "enableLogging" , _dnsWebService . _log . LoggingType ! = LoggingType . None ) ;
jsonWriter . WriteString ( "loggingType" , _dnsWebService . _log . LoggingType . ToString ( ) ) ;
2025-02-15 12:51:16 +05:30
jsonWriter . WriteBoolean ( "ignoreResolverLogs" , _dnsWebService . _dnsServer . ResolverLogManager = = null ) ;
jsonWriter . WriteBoolean ( "logQueries" , _dnsWebService . _dnsServer . QueryLogManager ! = null ) ;
jsonWriter . WriteBoolean ( "useLocalTime" , _dnsWebService . _log . UseLocalTime ) ;
jsonWriter . WriteString ( "logFolder" , _dnsWebService . _log . LogFolder ) ;
jsonWriter . WriteNumber ( "maxLogFileDays" , _dnsWebService . _log . MaxLogFileDays ) ;
2023-01-01 18:27:19 +05:30
2025-02-15 12:51:16 +05:30
jsonWriter . WriteBoolean ( "enableInMemoryStats" , _dnsWebService . _dnsServer . StatsManager . EnableInMemoryStats ) ;
jsonWriter . WriteNumber ( "maxStatFileDays" , _dnsWebService . _dnsServer . StatsManager . MaxStatFileDays ) ;
}
2023-01-01 18:27:19 +05:30
2025-02-15 12:51:16 +05:30
#endregion
2023-01-01 18:27:19 +05:30
2025-02-15 12:51:16 +05:30
#region public
2023-01-01 18:27:19 +05:30
2025-02-15 12:51:16 +05:30
public void GetDnsSettings ( HttpContext context )
{
UserSession session = context . GetCurrentSession ( ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( ! _dnsWebService . _authManager . IsPermitted ( PermissionSection . Settings , session . User , PermissionFlag . View ) )
throw new DnsWebServiceException ( "Access was denied." ) ;
2023-01-01 18:27:19 +05:30
2025-02-15 12:51:16 +05:30
Utf8JsonWriter jsonWriter = context . GetCurrentJsonWriter ( ) ;
WriteDnsSettings ( jsonWriter ) ;
2022-12-24 17:14:51 +05:30
}
2025-02-15 12:51:16 +05:30
public async Task SetDnsSettingsAsync ( HttpContext context )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
UserSession session = context . GetCurrentSession ( ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( ! _dnsWebService . _authManager . IsPermitted ( PermissionSection . Settings , session . User , PermissionFlag . Modify ) )
throw new DnsWebServiceException ( "Access was denied." ) ;
2025-01-11 17:59:23 +05:30
2025-02-15 12:51:16 +05:30
bool serverDomainChanged = false ;
bool webServiceLocalAddressesChanged = false ;
bool restartDnsService = false ;
bool restartWebService = false ;
bool blockListUrlsUpdated = false ;
IReadOnlyList < IPAddress > oldWebServiceLocalAddresses = _dnsWebService . _webServiceLocalAddresses ;
int oldWebServiceHttpPort = _dnsWebService . _webServiceHttpPort ;
int oldWebServiceTlsPort = _dnsWebService . _webServiceTlsPort ;
bool _webServiceEnablingTls = false ;
HttpRequest request = context . Request ;
JsonDocument jsonDocument = null ;
if ( request . HasJsonContentType ( ) )
{
jsonDocument = await JsonDocument . ParseAsync ( request . Body ) ;
context . Items [ "jsonContent" ] = jsonDocument ;
2025-01-11 17:59:23 +05:30
}
2023-01-14 15:11:56 +05:30
2025-02-15 12:51:16 +05:30
try
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
#region general
if ( request . TryGetQueryOrForm ( "dnsServerDomain" , out string dnsServerDomain ) )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
dnsServerDomain = dnsServerDomain . TrimEnd ( '.' ) ;
if ( ! _dnsWebService . _dnsServer . ServerDomain . Equals ( dnsServerDomain , StringComparison . OrdinalIgnoreCase ) )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
_dnsWebService . _dnsServer . ServerDomain = dnsServerDomain ;
serverDomainChanged = true ;
2022-12-24 17:14:51 +05:30
}
}
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrFormArray ( "dnsServerLocalEndPoints" , IPEndPoint . Parse , out IPEndPoint [ ] dnsServerLocalEndPoints ) )
{
if ( ( dnsServerLocalEndPoints is null ) | | ( dnsServerLocalEndPoints . Length = = 0 ) )
{
dnsServerLocalEndPoints = [ new IPEndPoint ( IPAddress . Any , 53 ) , new IPEndPoint ( IPAddress . IPv6Any , 53 ) ] ;
}
else
{
foreach ( IPEndPoint localEndPoint in dnsServerLocalEndPoints )
{
if ( localEndPoint . Port = = 0 )
localEndPoint . Port = 53 ;
}
}
2025-01-11 17:59:23 +05:30
2025-02-15 12:51:16 +05:30
if ( ! _dnsWebService . _dnsServer . LocalEndPoints . HasSameItems ( dnsServerLocalEndPoints ) )
restartDnsService = true ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
_dnsWebService . _dnsServer . LocalEndPoints = dnsServerLocalEndPoints ;
}
2024-02-04 18:07:08 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrFormArray ( "dnsServerIPv4SourceAddresses" , NetworkAddress . Parse , out NetworkAddress [ ] dnsServerIPv4SourceAddresses ) )
DnsClientConnection . IPv4SourceAddresses = dnsServerIPv4SourceAddresses ;
2024-02-04 18:07:08 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrFormArray ( "dnsServerIPv6SourceAddresses" , NetworkAddress . Parse , out NetworkAddress [ ] dnsServerIPv6SourceAddresses ) )
DnsClientConnection . IPv6SourceAddresses = dnsServerIPv6SourceAddresses ;
2022-12-24 17:14:51 +05:30
2025-03-31 19:36:51 +05:30
if ( request . TryGetQueryOrForm ( "defaultRecordTtl" , ZoneFile . ParseTtl , out uint defaultRecordTtl ) )
2025-02-15 12:51:16 +05:30
_dnsWebService . _zonesApi . DefaultRecordTtl = defaultRecordTtl ;
2024-05-19 16:26:07 +05:30
2025-02-15 12:51:16 +05:30
string defaultResponsiblePerson = request . QueryOrForm ( "defaultResponsiblePerson" ) ;
if ( defaultResponsiblePerson is not null )
{
if ( defaultResponsiblePerson . Length = = 0 )
_dnsWebService . _dnsServer . ResponsiblePersonInternal = null ;
else if ( defaultResponsiblePerson . Length > 255 )
throw new ArgumentException ( "Default responsible person email address length cannot exceed 255 characters." , "defaultResponsiblePerson" ) ;
else
_dnsWebService . _dnsServer . ResponsiblePersonInternal = new MailAddress ( defaultResponsiblePerson ) ;
}
2023-10-29 19:52:40 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "useSoaSerialDateScheme" , bool . Parse , out bool useSoaSerialDateScheme ) )
_dnsWebService . _dnsServer . AuthZoneManager . UseSoaSerialDateScheme = useSoaSerialDateScheme ;
2024-12-21 15:52:31 +05:30
2025-03-31 19:36:51 +05:30
if ( request . TryGetQueryOrForm ( "minSoaRefresh" , ZoneFile . ParseTtl , out uint minSoaRefresh ) )
2025-02-15 12:51:16 +05:30
_dnsWebService . _dnsServer . AuthZoneManager . MinSoaRefresh = minSoaRefresh ;
2024-12-21 15:52:31 +05:30
2025-03-31 19:36:51 +05:30
if ( request . TryGetQueryOrForm ( "minSoaRetry" , ZoneFile . ParseTtl , out uint minSoaRetry ) )
2025-02-15 12:51:16 +05:30
_dnsWebService . _dnsServer . AuthZoneManager . MinSoaRetry = minSoaRetry ;
2023-10-29 19:52:40 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrFormArray ( "zoneTransferAllowedNetworks" , NetworkAddress . Parse , out NetworkAddress [ ] zoneTransferAllowedNetworks ) )
_dnsWebService . _dnsServer . ZoneTransferAllowedNetworks = zoneTransferAllowedNetworks ;
2023-10-29 19:52:40 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrFormArray ( "notifyAllowedNetworks" , NetworkAddress . Parse , out NetworkAddress [ ] notifyAllowedNetworks ) )
_dnsWebService . _dnsServer . NotifyAllowedNetworks = notifyAllowedNetworks ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "dnsAppsEnableAutomaticUpdate" , bool . Parse , out bool dnsAppsEnableAutomaticUpdate ) )
_dnsWebService . _appsApi . EnableAutomaticUpdate = dnsAppsEnableAutomaticUpdate ;
2023-01-14 15:11:56 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "preferIPv6" , bool . Parse , out bool preferIPv6 ) )
_dnsWebService . _dnsServer . PreferIPv6 = preferIPv6 ;
2023-01-14 15:11:56 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "udpPayloadSize" , ushort . Parse , out ushort udpPayloadSize ) )
_dnsWebService . _dnsServer . UdpPayloadSize = udpPayloadSize ;
2023-01-14 15:11:56 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "dnssecValidation" , bool . Parse , out bool dnssecValidation ) )
_dnsWebService . _dnsServer . DnssecValidation = dnssecValidation ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "eDnsClientSubnet" , bool . Parse , out bool eDnsClientSubnet ) )
_dnsWebService . _dnsServer . EDnsClientSubnet = eDnsClientSubnet ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "eDnsClientSubnetIPv4PrefixLength" , byte . Parse , out byte eDnsClientSubnetIPv4PrefixLength ) )
_dnsWebService . _dnsServer . EDnsClientSubnetIPv4PrefixLength = eDnsClientSubnetIPv4PrefixLength ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "eDnsClientSubnetIPv6PrefixLength" , byte . Parse , out byte eDnsClientSubnetIPv6PrefixLength ) )
_dnsWebService . _dnsServer . EDnsClientSubnetIPv6PrefixLength = eDnsClientSubnetIPv6PrefixLength ;
2024-03-16 15:45:30 +05:30
2025-02-15 12:51:16 +05:30
string eDnsClientSubnetIpv4Override = request . QueryOrForm ( "eDnsClientSubnetIpv4Override" ) ;
if ( eDnsClientSubnetIpv4Override is not null )
{
if ( eDnsClientSubnetIpv4Override . Length = = 0 )
_dnsWebService . _dnsServer . EDnsClientSubnetIpv4Override = null ;
else
_dnsWebService . _dnsServer . EDnsClientSubnetIpv4Override = NetworkAddress . Parse ( eDnsClientSubnetIpv4Override ) ;
}
2024-03-16 15:45:30 +05:30
2025-02-15 12:51:16 +05:30
string eDnsClientSubnetIpv6Override = request . QueryOrForm ( "eDnsClientSubnetIpv6Override" ) ;
if ( eDnsClientSubnetIpv6Override is not null )
{
if ( eDnsClientSubnetIpv6Override . Length = = 0 )
_dnsWebService . _dnsServer . EDnsClientSubnetIpv6Override = null ;
else
_dnsWebService . _dnsServer . EDnsClientSubnetIpv6Override = NetworkAddress . Parse ( eDnsClientSubnetIpv6Override ) ;
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "qpmLimitRequests" , int . Parse , out int qpmLimitRequests ) )
_dnsWebService . _dnsServer . QpmLimitRequests = qpmLimitRequests ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "qpmLimitErrors" , int . Parse , out int qpmLimitErrors ) )
_dnsWebService . _dnsServer . QpmLimitErrors = qpmLimitErrors ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "qpmLimitSampleMinutes" , int . Parse , out int qpmLimitSampleMinutes ) )
_dnsWebService . _dnsServer . QpmLimitSampleMinutes = qpmLimitSampleMinutes ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "qpmLimitIPv4PrefixLength" , int . Parse , out int qpmLimitIPv4PrefixLength ) )
_dnsWebService . _dnsServer . QpmLimitIPv4PrefixLength = qpmLimitIPv4PrefixLength ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "qpmLimitIPv6PrefixLength" , int . Parse , out int qpmLimitIPv6PrefixLength ) )
_dnsWebService . _dnsServer . QpmLimitIPv6PrefixLength = qpmLimitIPv6PrefixLength ;
2024-02-04 18:07:08 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrFormArray ( "qpmLimitBypassList" , NetworkAddress . Parse , out NetworkAddress [ ] qpmLimitBypassList ) )
_dnsWebService . _dnsServer . QpmLimitBypassList = qpmLimitBypassList ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "clientTimeout" , int . Parse , out int clientTimeout ) )
_dnsWebService . _dnsServer . ClientTimeout = clientTimeout ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "tcpSendTimeout" , int . Parse , out int tcpSendTimeout ) )
_dnsWebService . _dnsServer . TcpSendTimeout = tcpSendTimeout ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "tcpReceiveTimeout" , int . Parse , out int tcpReceiveTimeout ) )
_dnsWebService . _dnsServer . TcpReceiveTimeout = tcpReceiveTimeout ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "quicIdleTimeout" , int . Parse , out int quicIdleTimeout ) )
_dnsWebService . _dnsServer . QuicIdleTimeout = quicIdleTimeout ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "quicMaxInboundStreams" , int . Parse , out int quicMaxInboundStreams ) )
_dnsWebService . _dnsServer . QuicMaxInboundStreams = quicMaxInboundStreams ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "listenBacklog" , int . Parse , out int listenBacklog ) )
_dnsWebService . _dnsServer . ListenBacklog = listenBacklog ;
2024-12-21 15:52:31 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "maxConcurrentResolutionsPerCore" , ushort . Parse , out ushort maxConcurrentResolutionsPerCore ) )
_dnsWebService . _dnsServer . MaxConcurrentResolutionsPerCore = maxConcurrentResolutionsPerCore ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
#endregion
2025-01-11 17:59:23 +05:30
2025-02-15 12:51:16 +05:30
#region web service
2025-01-11 17:59:23 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrFormArray ( "webServiceLocalAddresses" , IPAddress . Parse , out IPAddress [ ] webServiceLocalAddresses ) )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
if ( ( webServiceLocalAddresses is null ) | | ( webServiceLocalAddresses . Length = = 0 ) )
webServiceLocalAddresses = [ IPAddress . Any , IPAddress . IPv6Any ] ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( ! _dnsWebService . _webServiceLocalAddresses . HasSameItems ( webServiceLocalAddresses ) )
{
webServiceLocalAddressesChanged = true ;
restartWebService = true ;
}
2022-12-24 17:14:51 +05:30
2025-02-15 13:17:10 +05:30
_dnsWebService . _webServiceLocalAddresses = WebUtilities . GetValidKestrelLocalAddresses ( webServiceLocalAddresses ) ;
2025-02-15 12:51:16 +05:30
}
if ( request . TryGetQueryOrForm ( "webServiceHttpPort" , int . Parse , out int webServiceHttpPort ) )
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
if ( _dnsWebService . _webServiceHttpPort ! = webServiceHttpPort )
{
_dnsWebService . _webServiceHttpPort = webServiceHttpPort ;
restartWebService = true ;
}
2025-01-11 17:59:23 +05:30
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "webServiceEnableTls" , bool . Parse , out bool webServiceEnableTls ) )
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
if ( _dnsWebService . _webServiceEnableTls ! = webServiceEnableTls )
{
_dnsWebService . _webServiceEnableTls = webServiceEnableTls ;
_webServiceEnablingTls = webServiceEnableTls ;
restartWebService = true ;
}
2025-01-11 17:59:23 +05:30
}
2023-10-29 19:52:40 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "webServiceEnableHttp3" , bool . Parse , out bool webServiceEnableHttp3 ) )
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
if ( _dnsWebService . _webServiceEnableHttp3 ! = webServiceEnableHttp3 )
{
if ( webServiceEnableHttp3 )
DnsWebService . ValidateQuicSupport ( "HTTP/3" ) ;
2023-10-29 19:52:40 +05:30
2025-02-15 12:51:16 +05:30
_dnsWebService . _webServiceEnableHttp3 = webServiceEnableHttp3 ;
restartWebService = true ;
}
2025-01-11 17:59:23 +05:30
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "webServiceHttpToTlsRedirect" , bool . Parse , out bool webServiceHttpToTlsRedirect ) )
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
if ( _dnsWebService . _webServiceHttpToTlsRedirect ! = webServiceHttpToTlsRedirect )
{
_dnsWebService . _webServiceHttpToTlsRedirect = webServiceHttpToTlsRedirect ;
restartWebService = true ;
}
2025-01-11 17:59:23 +05:30
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "webServiceUseSelfSignedTlsCertificate" , bool . Parse , out bool webServiceUseSelfSignedTlsCertificate ) )
_dnsWebService . _webServiceUseSelfSignedTlsCertificate = webServiceUseSelfSignedTlsCertificate ;
2023-01-01 18:27:19 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "webServiceTlsPort" , int . Parse , out int webServiceTlsPort ) )
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
if ( _dnsWebService . _webServiceTlsPort ! = webServiceTlsPort )
{
_dnsWebService . _webServiceTlsPort = webServiceTlsPort ;
restartWebService = true ;
}
2025-01-11 17:59:23 +05:30
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
string webServiceTlsCertificatePath = request . QueryOrForm ( "webServiceTlsCertificatePath" ) ;
if ( webServiceTlsCertificatePath is not null )
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
if ( webServiceTlsCertificatePath . Length = = 0 )
{
_dnsWebService . _webServiceTlsCertificatePath = null ;
_dnsWebService . _webServiceTlsCertificatePassword = "" ;
}
else
{
string webServiceTlsCertificatePassword = request . QueryOrForm ( "webServiceTlsCertificatePassword" ) ;
2023-01-01 18:27:19 +05:30
2025-02-15 12:51:16 +05:30
if ( ( webServiceTlsCertificatePassword is null ) | | ( webServiceTlsCertificatePassword = = "************" ) )
webServiceTlsCertificatePassword = _dnsWebService . _webServiceTlsCertificatePassword ;
2023-01-01 18:27:19 +05:30
2025-02-15 12:51:16 +05:30
if ( ( webServiceTlsCertificatePath ! = _dnsWebService . _webServiceTlsCertificatePath ) | | ( webServiceTlsCertificatePassword ! = _dnsWebService . _webServiceTlsCertificatePassword ) )
{
if ( webServiceTlsCertificatePath . Length > 255 )
throw new ArgumentException ( "Web service TLS certificate path length cannot exceed 255 characters." , "webServiceTlsCertificatePath" ) ;
2024-10-19 17:05:47 +05:30
2025-02-15 12:51:16 +05:30
if ( webServiceTlsCertificatePassword ? . Length > 255 )
throw new ArgumentException ( "Web service TLS certificate password length cannot exceed 255 characters." , "webServiceTlsCertificatePassword" ) ;
2024-10-19 17:05:47 +05:30
2025-02-15 12:51:16 +05:30
_dnsWebService . LoadWebServiceTlsCertificate ( _dnsWebService . ConvertToAbsolutePath ( webServiceTlsCertificatePath ) , webServiceTlsCertificatePassword ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
_dnsWebService . _webServiceTlsCertificatePath = _dnsWebService . ConvertToRelativePath ( webServiceTlsCertificatePath ) ;
_dnsWebService . _webServiceTlsCertificatePassword = webServiceTlsCertificatePassword ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
_dnsWebService . StartTlsCertificateUpdateTimer ( ) ;
}
2025-01-11 17:59:23 +05:30
}
2023-01-01 18:27:19 +05:30
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "webServiceRealIpHeader" , out string webServiceRealIpHeader ) )
{
if ( webServiceRealIpHeader . Length > 255 )
throw new ArgumentException ( "Web service Real IP header name cannot exceed 255 characters." , "webServiceRealIpHeader" ) ;
2024-10-19 17:05:47 +05:30
2025-02-15 12:51:16 +05:30
if ( webServiceRealIpHeader . Contains ( ' ' ) )
throw new ArgumentException ( "Web service Real IP header name cannot contain invalid characters." , "webServiceRealIpHeader" ) ;
2024-10-19 17:05:47 +05:30
2025-02-15 12:51:16 +05:30
_dnsWebService . _webServiceRealIpHeader = webServiceRealIpHeader ;
}
2024-10-19 17:05:47 +05:30
2025-02-15 12:51:16 +05:30
#endregion
2025-01-11 17:59:23 +05:30
2025-02-15 12:51:16 +05:30
#region optional protocols
2025-01-11 17:59:23 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "enableDnsOverUdpProxy" , bool . Parse , out bool enableDnsOverUdpProxy ) )
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
if ( _dnsWebService . _dnsServer . EnableDnsOverUdpProxy ! = enableDnsOverUdpProxy )
{
_dnsWebService . _dnsServer . EnableDnsOverUdpProxy = enableDnsOverUdpProxy ;
restartDnsService = true ;
}
2025-01-11 17:59:23 +05:30
}
2023-08-12 13:20:35 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "enableDnsOverTcpProxy" , bool . Parse , out bool enableDnsOverTcpProxy ) )
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
if ( _dnsWebService . _dnsServer . EnableDnsOverTcpProxy ! = enableDnsOverTcpProxy )
{
_dnsWebService . _dnsServer . EnableDnsOverTcpProxy = enableDnsOverTcpProxy ;
restartDnsService = true ;
}
2025-01-11 17:59:23 +05:30
}
2023-08-12 13:20:35 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "enableDnsOverHttp" , bool . Parse , out bool enableDnsOverHttp ) )
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
if ( _dnsWebService . _dnsServer . EnableDnsOverHttp ! = enableDnsOverHttp )
{
_dnsWebService . _dnsServer . EnableDnsOverHttp = enableDnsOverHttp ;
restartDnsService = true ;
}
2025-01-11 17:59:23 +05:30
}
2023-01-14 15:11:56 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "enableDnsOverTls" , bool . Parse , out bool enableDnsOverTls ) )
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
if ( _dnsWebService . _dnsServer . EnableDnsOverTls ! = enableDnsOverTls )
{
_dnsWebService . _dnsServer . EnableDnsOverTls = enableDnsOverTls ;
restartDnsService = true ;
}
2025-01-11 17:59:23 +05:30
}
2023-01-14 15:11:56 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "enableDnsOverHttps" , bool . Parse , out bool enableDnsOverHttps ) )
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
if ( _dnsWebService . _dnsServer . EnableDnsOverHttps ! = enableDnsOverHttps )
{
_dnsWebService . _dnsServer . EnableDnsOverHttps = enableDnsOverHttps ;
restartDnsService = true ;
}
2025-01-11 17:59:23 +05:30
}
2023-01-14 15:11:56 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "enableDnsOverHttp3" , bool . Parse , out bool enableDnsOverHttp3 ) )
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
if ( _dnsWebService . _dnsServer . EnableDnsOverHttp3 ! = enableDnsOverHttp3 )
{
if ( enableDnsOverHttp3 )
DnsWebService . ValidateQuicSupport ( "DNS-over-HTTP/3" ) ;
2024-09-14 19:44:02 +05:30
2025-02-15 12:51:16 +05:30
_dnsWebService . _dnsServer . EnableDnsOverHttp3 = enableDnsOverHttp3 ;
restartDnsService = true ;
}
2025-01-11 17:59:23 +05:30
}
2024-09-14 19:44:02 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "enableDnsOverQuic" , bool . Parse , out bool enableDnsOverQuic ) )
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
if ( _dnsWebService . _dnsServer . EnableDnsOverQuic ! = enableDnsOverQuic )
{
if ( enableDnsOverQuic )
DnsWebService . ValidateQuicSupport ( ) ;
2023-01-14 15:11:56 +05:30
2025-02-15 12:51:16 +05:30
_dnsWebService . _dnsServer . EnableDnsOverQuic = enableDnsOverQuic ;
restartDnsService = true ;
}
2025-01-11 17:59:23 +05:30
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "dnsOverUdpProxyPort" , int . Parse , out int dnsOverUdpProxyPort ) )
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
if ( _dnsWebService . _dnsServer . DnsOverUdpProxyPort ! = dnsOverUdpProxyPort )
{
_dnsWebService . _dnsServer . DnsOverUdpProxyPort = dnsOverUdpProxyPort ;
restartDnsService = true ;
}
2025-01-11 17:59:23 +05:30
}
2023-08-12 13:20:35 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "dnsOverTcpProxyPort" , int . Parse , out int dnsOverTcpProxyPort ) )
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
if ( _dnsWebService . _dnsServer . DnsOverTcpProxyPort ! = dnsOverTcpProxyPort )
{
_dnsWebService . _dnsServer . DnsOverTcpProxyPort = dnsOverTcpProxyPort ;
restartDnsService = true ;
}
2025-01-11 17:59:23 +05:30
}
2023-08-12 13:20:35 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "dnsOverHttpPort" , int . Parse , out int dnsOverHttpPort ) )
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
if ( _dnsWebService . _dnsServer . DnsOverHttpPort ! = dnsOverHttpPort )
{
_dnsWebService . _dnsServer . DnsOverHttpPort = dnsOverHttpPort ;
restartDnsService = true ;
}
2025-01-11 17:59:23 +05:30
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "dnsOverTlsPort" , int . Parse , out int dnsOverTlsPort ) )
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
if ( _dnsWebService . _dnsServer . DnsOverTlsPort ! = dnsOverTlsPort )
{
_dnsWebService . _dnsServer . DnsOverTlsPort = dnsOverTlsPort ;
restartDnsService = true ;
}
2025-01-11 17:59:23 +05:30
}
2023-01-14 15:11:56 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "dnsOverHttpsPort" , int . Parse , out int dnsOverHttpsPort ) )
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
if ( _dnsWebService . _dnsServer . DnsOverHttpsPort ! = dnsOverHttpsPort )
{
_dnsWebService . _dnsServer . DnsOverHttpsPort = dnsOverHttpsPort ;
restartDnsService = true ;
}
2025-01-11 17:59:23 +05:30
}
2023-01-14 15:11:56 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "dnsOverQuicPort" , int . Parse , out int dnsOverQuicPort ) )
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
if ( _dnsWebService . _dnsServer . DnsOverQuicPort ! = dnsOverQuicPort )
{
_dnsWebService . _dnsServer . DnsOverQuicPort = dnsOverQuicPort ;
restartDnsService = true ;
}
2025-01-11 17:59:23 +05:30
}
2023-01-14 15:11:56 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrFormArray ( "reverseProxyNetworkACL" , NetworkAccessControl . Parse , out NetworkAccessControl [ ] reverseProxyNetworkACL ) )
_dnsWebService . _dnsServer . ReverseProxyNetworkACL = reverseProxyNetworkACL ;
2024-11-16 14:10:21 +05:30
2025-02-15 12:51:16 +05:30
string dnsTlsCertificatePath = request . QueryOrForm ( "dnsTlsCertificatePath" ) ;
if ( dnsTlsCertificatePath is not null )
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
if ( dnsTlsCertificatePath . Length = = 0 )
{
if ( ! string . IsNullOrEmpty ( _dnsWebService . _dnsTlsCertificatePath ) & & ( _dnsWebService . _dnsServer . EnableDnsOverTls | | _dnsWebService . _dnsServer . EnableDnsOverHttps | | _dnsWebService . _dnsServer . EnableDnsOverQuic ) )
restartDnsService = true ;
2023-01-14 15:11:56 +05:30
2025-02-15 12:51:16 +05:30
_dnsWebService . _dnsServer . CertificateCollection = null ;
_dnsWebService . _dnsTlsCertificatePath = null ;
_dnsWebService . _dnsTlsCertificatePassword = "" ;
}
else
{
string dnsTlsCertificatePassword = request . QueryOrForm ( "dnsTlsCertificatePassword" ) ;
2023-01-01 18:27:19 +05:30
2025-02-15 12:51:16 +05:30
if ( ( dnsTlsCertificatePassword is null ) | | ( dnsTlsCertificatePassword = = "************" ) )
dnsTlsCertificatePassword = _dnsWebService . _dnsTlsCertificatePassword ;
2023-01-01 18:27:19 +05:30
2025-02-15 12:51:16 +05:30
if ( ( dnsTlsCertificatePath ! = _dnsWebService . _dnsTlsCertificatePath ) | | ( dnsTlsCertificatePassword ! = _dnsWebService . _dnsTlsCertificatePassword ) )
{
if ( dnsTlsCertificatePath . Length > 255 )
throw new ArgumentException ( "DNS optional protocols TLS certificate path length cannot exceed 255 characters." , "dnsTlsCertificatePath" ) ;
2024-10-19 17:05:47 +05:30
2025-02-15 12:51:16 +05:30
if ( dnsTlsCertificatePassword ? . Length > 255 )
throw new ArgumentException ( "DNS optional protocols TLS certificate password length cannot exceed 255 characters." , "dnsTlsCertificatePassword" ) ;
2024-10-19 17:05:47 +05:30
2025-02-15 12:51:16 +05:30
_dnsWebService . LoadDnsTlsCertificate ( _dnsWebService . ConvertToAbsolutePath ( dnsTlsCertificatePath ) , dnsTlsCertificatePassword ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( string . IsNullOrEmpty ( _dnsWebService . _dnsTlsCertificatePath ) & & ( _dnsWebService . _dnsServer . EnableDnsOverTls | | _dnsWebService . _dnsServer . EnableDnsOverHttps | | _dnsWebService . _dnsServer . EnableDnsOverQuic ) )
restartDnsService = true ;
2023-01-14 15:11:56 +05:30
2025-02-15 12:51:16 +05:30
_dnsWebService . _dnsTlsCertificatePath = _dnsWebService . ConvertToRelativePath ( dnsTlsCertificatePath ) ;
_dnsWebService . _dnsTlsCertificatePassword = dnsTlsCertificatePassword ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
_dnsWebService . StartTlsCertificateUpdateTimer ( ) ;
}
2025-01-11 17:59:23 +05:30
}
2023-01-01 18:27:19 +05:30
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "dnsOverHttpRealIpHeader" , out string dnsOverHttpRealIpHeader ) )
_dnsWebService . _dnsServer . DnsOverHttpRealIpHeader = dnsOverHttpRealIpHeader ;
2024-10-19 17:05:47 +05:30
2025-02-15 12:51:16 +05:30
#endregion
2025-01-11 17:59:23 +05:30
2025-02-15 12:51:16 +05:30
#region tsig
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrFormArray ( "tsigKeys" , delegate ( JsonElement jsonObject )
{
string keyName = jsonObject . GetProperty ( "keyName" ) . GetString ( ) . TrimEnd ( '.' ) . ToLowerInvariant ( ) ; ;
string sharedSecret = jsonObject . GetProperty ( "sharedSecret" ) . GetString ( ) ;
string algorithmName = jsonObject . GetProperty ( "algorithmName" ) . GetString ( ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( DnsClient . IsDomainNameUnicode ( keyName ) )
keyName = DnsClient . ConvertDomainNameToAscii ( keyName ) ;
2024-09-14 19:44:02 +05:30
2025-02-15 12:51:16 +05:30
DnsClient . IsDomainNameValid ( keyName , true ) ;
2024-09-14 19:44:02 +05:30
2025-02-15 12:51:16 +05:30
if ( sharedSecret . Length = = 0 )
return new TsigKey ( keyName , algorithmName ) ;
2025-01-11 17:59:23 +05:30
2025-02-15 12:51:16 +05:30
return new TsigKey ( keyName , sharedSecret , algorithmName ) ;
} ,
delegate ( ArraySegment < string > tableRow )
{
string keyName = tableRow [ 0 ] . TrimEnd ( '.' ) . ToLowerInvariant ( ) ;
string sharedSecret = tableRow [ 1 ] ;
string algorithmName = tableRow [ 2 ] ;
2025-01-11 17:59:23 +05:30
2025-02-15 12:51:16 +05:30
if ( DnsClient . IsDomainNameUnicode ( keyName ) )
keyName = DnsClient . ConvertDomainNameToAscii ( keyName ) ;
2025-01-11 17:59:23 +05:30
2025-02-15 12:51:16 +05:30
DnsClient . IsDomainNameValid ( keyName , true ) ;
2025-01-11 17:59:23 +05:30
2025-02-15 12:51:16 +05:30
if ( sharedSecret . Length = = 0 )
return new TsigKey ( keyName , algorithmName ) ;
2025-01-11 17:59:23 +05:30
2025-02-15 12:51:16 +05:30
return new TsigKey ( keyName , sharedSecret , algorithmName ) ;
} ,
3 , out TsigKey [ ] tsigKeys , '|' )
)
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
if ( ( tsigKeys is null ) | | ( tsigKeys . Length = = 0 ) )
{
_dnsWebService . _dnsServer . TsigKeys = null ;
}
else
{
Dictionary < string , TsigKey > tsigKeysMap = new Dictionary < string , TsigKey > ( tsigKeys . Length ) ;
2025-01-11 17:59:23 +05:30
2025-02-15 12:51:16 +05:30
foreach ( TsigKey tsigKey in tsigKeys )
tsigKeysMap . Add ( tsigKey . KeyName , tsigKey ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
_dnsWebService . _dnsServer . TsigKeys = tsigKeysMap ;
}
2025-01-11 17:59:23 +05:30
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
#endregion
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
#region recursion
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrFormEnum ( "recursion" , out DnsServerRecursion recursion ) )
_dnsWebService . _dnsServer . Recursion = recursion ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrFormArray ( "recursionNetworkACL" , NetworkAccessControl . Parse , out NetworkAccessControl [ ] recursionNetworkACL ) )
_dnsWebService . _dnsServer . RecursionNetworkACL = recursionNetworkACL ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "randomizeName" , bool . Parse , out bool randomizeName ) )
_dnsWebService . _dnsServer . RandomizeName = randomizeName ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "qnameMinimization" , bool . Parse , out bool qnameMinimization ) )
_dnsWebService . _dnsServer . QnameMinimization = qnameMinimization ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "resolverRetries" , int . Parse , out int resolverRetries ) )
_dnsWebService . _dnsServer . ResolverRetries = resolverRetries ;
2024-09-14 19:44:02 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "resolverTimeout" , int . Parse , out int resolverTimeout ) )
_dnsWebService . _dnsServer . ResolverTimeout = resolverTimeout ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "resolverConcurrency" , int . Parse , out int resolverConcurrency ) )
_dnsWebService . _dnsServer . ResolverConcurrency = resolverConcurrency ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "resolverMaxStackCount" , int . Parse , out int resolverMaxStackCount ) )
_dnsWebService . _dnsServer . ResolverMaxStackCount = resolverMaxStackCount ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
#endregion
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
#region cache
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
//cache
if ( request . TryGetQueryOrForm ( "saveCache" , bool . Parse , out bool saveCache ) )
{
if ( ! saveCache )
_dnsWebService . _dnsServer . CacheZoneManager . DeleteCacheZoneFile ( ) ;
2024-05-19 16:26:07 +05:30
2025-02-15 12:51:16 +05:30
_dnsWebService . _saveCache = saveCache ;
}
2024-05-19 16:26:07 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "serveStale" , bool . Parse , out bool serveStale ) )
_dnsWebService . _dnsServer . ServeStale = serveStale ;
2024-05-19 16:26:07 +05:30
2025-03-31 19:36:51 +05:30
if ( request . TryGetQueryOrForm ( "serveStaleTtl" , ZoneFile . ParseTtl , out uint serveStaleTtl ) )
2025-02-15 12:51:16 +05:30
_dnsWebService . _dnsServer . CacheZoneManager . ServeStaleTtl = serveStaleTtl ;
2022-12-24 17:14:51 +05:30
2025-03-31 19:36:51 +05:30
if ( request . TryGetQueryOrForm ( "serveStaleAnswerTtl" , ZoneFile . ParseTtl , out uint serveStaleAnswerTtl ) )
2025-02-15 12:51:16 +05:30
_dnsWebService . _dnsServer . CacheZoneManager . ServeStaleAnswerTtl = serveStaleAnswerTtl ;
2022-12-24 17:14:51 +05:30
2025-03-31 19:36:51 +05:30
if ( request . TryGetQueryOrForm ( "serveStaleResetTtl" , ZoneFile . ParseTtl , out uint serveStaleResetTtl ) )
2025-02-15 12:51:16 +05:30
_dnsWebService . _dnsServer . CacheZoneManager . ServeStaleResetTtl = serveStaleResetTtl ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "serveStaleMaxWaitTime" , int . Parse , out int serveStaleMaxWaitTime ) )
_dnsWebService . _dnsServer . ServeStaleMaxWaitTime = serveStaleMaxWaitTime ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "cacheMaximumEntries" , long . Parse , out long cacheMaximumEntries ) )
_dnsWebService . _dnsServer . CacheZoneManager . MaximumEntries = cacheMaximumEntries ;
2022-12-24 17:14:51 +05:30
2025-03-31 19:36:51 +05:30
if ( request . TryGetQueryOrForm ( "cacheMinimumRecordTtl" , ZoneFile . ParseTtl , out uint cacheMinimumRecordTtl ) )
2025-02-15 12:51:16 +05:30
_dnsWebService . _dnsServer . CacheZoneManager . MinimumRecordTtl = cacheMinimumRecordTtl ;
2022-12-24 17:14:51 +05:30
2025-03-31 19:36:51 +05:30
if ( request . TryGetQueryOrForm ( "cacheMaximumRecordTtl" , ZoneFile . ParseTtl , out uint cacheMaximumRecordTtl ) )
2025-02-15 12:51:16 +05:30
_dnsWebService . _dnsServer . CacheZoneManager . MaximumRecordTtl = cacheMaximumRecordTtl ;
2023-01-14 15:11:56 +05:30
2025-03-31 19:36:51 +05:30
if ( request . TryGetQueryOrForm ( "cacheNegativeRecordTtl" , ZoneFile . ParseTtl , out uint cacheNegativeRecordTtl ) )
2025-02-15 12:51:16 +05:30
_dnsWebService . _dnsServer . CacheZoneManager . NegativeRecordTtl = cacheNegativeRecordTtl ;
2023-01-14 15:11:56 +05:30
2025-03-31 19:36:51 +05:30
if ( request . TryGetQueryOrForm ( "cacheFailureRecordTtl" , ZoneFile . ParseTtl , out uint cacheFailureRecordTtl ) )
2025-02-15 12:51:16 +05:30
_dnsWebService . _dnsServer . CacheZoneManager . FailureRecordTtl = cacheFailureRecordTtl ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "cachePrefetchEligibility" , int . Parse , out int cachePrefetchEligibility ) )
_dnsWebService . _dnsServer . CachePrefetchEligibility = cachePrefetchEligibility ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "cachePrefetchTrigger" , int . Parse , out int cachePrefetchTrigger ) )
_dnsWebService . _dnsServer . CachePrefetchTrigger = cachePrefetchTrigger ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "cachePrefetchSampleIntervalInMinutes" , int . Parse , out int cachePrefetchSampleIntervalInMinutes ) )
_dnsWebService . _dnsServer . CachePrefetchSampleIntervalInMinutes = cachePrefetchSampleIntervalInMinutes ;
2023-10-29 19:52:40 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "cachePrefetchSampleEligibilityHitsPerHour" , int . Parse , out int cachePrefetchSampleEligibilityHitsPerHour ) )
_dnsWebService . _dnsServer . CachePrefetchSampleEligibilityHitsPerHour = cachePrefetchSampleEligibilityHitsPerHour ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
#endregion
2024-10-19 17:05:47 +05:30
2025-02-15 12:51:16 +05:30
#region blocking
2025-01-11 17:59:23 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "enableBlocking" , bool . Parse , out bool enableBlocking ) )
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
_dnsWebService . _dnsServer . EnableBlocking = enableBlocking ;
if ( _dnsWebService . _dnsServer . EnableBlocking )
{
if ( _temporaryDisableBlockingTimer is not null )
_temporaryDisableBlockingTimer . Dispose ( ) ;
}
2025-01-11 17:59:23 +05:30
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "allowTxtBlockingReport" , bool . Parse , out bool allowTxtBlockingReport ) )
_dnsWebService . _dnsServer . AllowTxtBlockingReport = allowTxtBlockingReport ;
2025-01-11 17:59:23 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrFormArray ( "blockingBypassList" , NetworkAddress . Parse , out NetworkAddress [ ] blockingBypassList ) )
_dnsWebService . _dnsServer . BlockingBypassList = blockingBypassList ;
2025-01-11 17:59:23 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrFormEnum ( "blockingType" , out DnsServerBlockingType blockingType ) )
_dnsWebService . _dnsServer . BlockingType = blockingType ;
2025-01-11 17:59:23 +05:30
2025-03-31 19:36:51 +05:30
if ( request . TryGetQueryOrForm ( "blockingAnswerTtl" , ZoneFile . ParseTtl , out uint blockingAnswerTtl ) )
2025-02-15 12:51:16 +05:30
_dnsWebService . _dnsServer . BlockingAnswerTtl = blockingAnswerTtl ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrFormArray ( "customBlockingAddresses" , out string [ ] customBlockingAddresses ) )
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
if ( ( customBlockingAddresses is null ) | | ( customBlockingAddresses . Length = = 0 ) )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
_dnsWebService . _dnsServer . CustomBlockingARecords = null ;
_dnsWebService . _dnsServer . CustomBlockingAAAARecords = null ;
}
else
{
List < DnsARecordData > dnsARecords = new List < DnsARecordData > ( ) ;
List < DnsAAAARecordData > dnsAAAARecords = new List < DnsAAAARecordData > ( ) ;
foreach ( string strAddress in customBlockingAddresses )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
if ( IPAddress . TryParse ( strAddress , out IPAddress customAddress ) )
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
switch ( customAddress . AddressFamily )
{
case AddressFamily . InterNetwork :
dnsARecords . Add ( new DnsARecordData ( customAddress ) ) ;
break ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
case AddressFamily . InterNetworkV6 :
dnsAAAARecords . Add ( new DnsAAAARecordData ( customAddress ) ) ;
break ;
}
2025-01-11 17:59:23 +05:30
}
2022-12-24 17:14:51 +05:30
}
2025-02-15 12:51:16 +05:30
_dnsWebService . _dnsServer . CustomBlockingARecords = dnsARecords ;
_dnsWebService . _dnsServer . CustomBlockingAAAARecords = dnsAAAARecords ;
}
2025-01-11 17:59:23 +05:30
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrFormArray ( "blockListUrls" , out string [ ] blockListUrls ) )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
if ( ( blockListUrls is null ) | | ( blockListUrls . Length = = 0 ) )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
_dnsWebService . _dnsServer . BlockListZoneManager . AllowListUrls . Clear ( ) ;
_dnsWebService . _dnsServer . BlockListZoneManager . BlockListUrls . Clear ( ) ;
_dnsWebService . _dnsServer . BlockListZoneManager . Flush ( ) ;
}
else
{
if ( oldWebServiceHttpPort ! = _dnsWebService . _webServiceHttpPort )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
for ( int i = 0 ; i < blockListUrls . Length ; i + + )
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
if ( blockListUrls [ i ] . Contains ( "http://localhost:" + oldWebServiceHttpPort + "/blocklist.txt" ) )
{
blockListUrls [ i ] = "http://localhost:" + _dnsWebService . _webServiceHttpPort + "/blocklist.txt" ;
blockListUrlsUpdated = true ;
break ;
}
2025-01-11 17:59:23 +05:30
}
2022-12-24 17:14:51 +05:30
}
2025-02-15 12:51:16 +05:30
if ( ! blockListUrlsUpdated )
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
if ( blockListUrls . Length ! = ( _dnsWebService . _dnsServer . BlockListZoneManager . AllowListUrls . Count + _dnsWebService . _dnsServer . BlockListZoneManager . BlockListUrls . Count ) )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
blockListUrlsUpdated = true ;
}
else
{
foreach ( string strBlockListUrl in blockListUrls )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
if ( strBlockListUrl . StartsWith ( '!' ) )
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
string strAllowListUrl = strBlockListUrl . Substring ( 1 ) ;
if ( ! _dnsWebService . _dnsServer . BlockListZoneManager . AllowListUrls . Contains ( new Uri ( strAllowListUrl ) ) )
{
blockListUrlsUpdated = true ;
break ;
}
2025-01-11 17:59:23 +05:30
}
2025-02-15 12:51:16 +05:30
else
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
if ( ! _dnsWebService . _dnsServer . BlockListZoneManager . BlockListUrls . Contains ( new Uri ( strBlockListUrl ) ) )
{
blockListUrlsUpdated = true ;
break ;
}
2025-01-11 17:59:23 +05:30
}
2022-12-24 17:14:51 +05:30
}
}
}
2025-01-11 17:59:23 +05:30
2025-02-15 12:51:16 +05:30
if ( blockListUrlsUpdated )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
_dnsWebService . _dnsServer . BlockListZoneManager . AllowListUrls . Clear ( ) ;
_dnsWebService . _dnsServer . BlockListZoneManager . BlockListUrls . Clear ( ) ;
foreach ( string strBlockListUrl in blockListUrls )
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
if ( strBlockListUrl . StartsWith ( '!' ) )
{
Uri allowListUrl = new Uri ( strBlockListUrl . Substring ( 1 ) ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( allowListUrl . AbsoluteUri . Length > 255 )
throw new ArgumentException ( "Allow list URL length cannot exceed 255 characters." , "blockListUrls" ) ;
2024-10-19 17:05:47 +05:30
2025-02-15 12:51:16 +05:30
if ( ! _dnsWebService . _dnsServer . BlockListZoneManager . AllowListUrls . Contains ( allowListUrl ) )
_dnsWebService . _dnsServer . BlockListZoneManager . AllowListUrls . Add ( allowListUrl ) ;
}
else
{
Uri blockListUrl = new Uri ( strBlockListUrl ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( blockListUrl . AbsoluteUri . Length > 255 )
throw new ArgumentException ( "Block list URL length cannot exceed 255 characters." , "blockListUrls" ) ;
2024-10-19 17:05:47 +05:30
2025-02-15 12:51:16 +05:30
if ( ! _dnsWebService . _dnsServer . BlockListZoneManager . BlockListUrls . Contains ( blockListUrl ) )
_dnsWebService . _dnsServer . BlockListZoneManager . BlockListUrls . Add ( blockListUrl ) ;
}
2025-01-11 17:59:23 +05:30
}
2022-12-24 17:14:51 +05:30
}
}
}
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "blockListUpdateIntervalHours" , int . Parse , out int blockListUpdateIntervalHours ) )
{
if ( ( blockListUpdateIntervalHours < 0 ) | | ( blockListUpdateIntervalHours > 168 ) )
throw new DnsWebServiceException ( "Parameter `blockListUpdateIntervalHours` must be between 1 hour and 168 hours (7 days) or 0 to disable automatic update." ) ;
2025-01-11 17:59:23 +05:30
2025-02-15 12:51:16 +05:30
_blockListUpdateIntervalHours = blockListUpdateIntervalHours ;
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
#endregion
2024-10-19 17:05:47 +05:30
2025-02-15 12:51:16 +05:30
#region proxy & forwarders
2024-10-19 17:05:47 +05:30
2025-02-15 12:51:16 +05:30
//proxy & forwarders
if ( request . TryGetQueryOrFormEnum ( "proxyType" , out NetProxyType proxyType ) )
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
if ( proxyType = = NetProxyType . None )
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
_dnsWebService . _dnsServer . Proxy = null ;
2025-01-11 17:59:23 +05:30
}
2025-02-15 12:51:16 +05:30
else
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
NetworkCredential credential = null ;
2023-01-14 15:11:56 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "proxyUsername" , out string proxyUsername ) )
{
if ( proxyUsername . Length > 255 )
throw new ArgumentException ( "Proxy username length cannot exceed 255 characters." , "proxyUsername" ) ;
2023-04-23 16:32:16 +05:30
2025-02-15 12:51:16 +05:30
string proxyPassword = request . QueryOrForm ( "proxyPassword" ) ;
if ( proxyPassword ? . Length > 255 )
throw new ArgumentException ( "Proxy password length cannot exceed 255 characters." , "proxyPassword" ) ;
2023-04-23 16:32:16 +05:30
2025-02-15 12:51:16 +05:30
credential = new NetworkCredential ( proxyUsername , proxyPassword ) ;
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
_dnsWebService . _dnsServer . Proxy = NetProxy . CreateProxy ( proxyType , request . QueryOrForm ( "proxyAddress" ) , int . Parse ( request . QueryOrForm ( "proxyPort" ) ) , credential ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrFormArray ( "proxyBypass" , delegate ( string value ) { return new NetProxyBypassItem ( value ) ; } , out NetProxyBypassItem [ ] proxyBypass ) )
_dnsWebService . _dnsServer . Proxy . BypassList = proxyBypass ;
2025-01-11 17:59:23 +05:30
}
2025-02-15 12:51:16 +05:30
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrFormArray ( "forwarders" , NameServerAddress . Parse , out NameServerAddress [ ] forwarders ) )
{
if ( ( forwarders is null ) | | ( forwarders . Length = = 0 ) )
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
_dnsWebService . _dnsServer . Forwarders = null ;
2025-01-11 17:59:23 +05:30
}
2025-02-15 12:51:16 +05:30
else
{
DnsTransportProtocol forwarderProtocol = request . GetQueryOrFormEnum ( "forwarderProtocol" , DnsTransportProtocol . Udp ) ;
2024-09-14 19:44:02 +05:30
2025-02-15 12:51:16 +05:30
switch ( forwarderProtocol )
{
case DnsTransportProtocol . Udp :
if ( proxyType = = NetProxyType . Http )
throw new DnsWebServiceException ( "HTTP proxy server can transport only DNS-over-TCP, DNS-over-TLS, or DNS-over-HTTPS forwarder protocols. Use SOCKS5 proxy server for DNS-over-UDP or DNS-over-QUIC forwarder protocols." ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
break ;
2024-09-14 19:44:02 +05:30
2025-02-15 12:51:16 +05:30
case DnsTransportProtocol . HttpsJson :
forwarderProtocol = DnsTransportProtocol . Https ;
break ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
case DnsTransportProtocol . Quic :
DnsWebService . ValidateQuicSupport ( ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( proxyType = = NetProxyType . Http )
throw new DnsWebServiceException ( "HTTP proxy server can transport only DNS-over-TCP, DNS-over-TLS, or DNS-over-HTTPS forwarder protocols. Use SOCKS5 proxy server for DNS-over-UDP or DNS-over-QUIC forwarder protocols." ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
break ;
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
for ( int i = 0 ; i < forwarders . Length ; i + + )
{
if ( forwarders [ i ] . Protocol ! = forwarderProtocol )
forwarders [ i ] = forwarders [ i ] . ChangeProtocol ( forwarderProtocol ) ;
}
2023-10-29 19:52:40 +05:30
2025-02-15 12:51:16 +05:30
if ( ! _dnsWebService . _dnsServer . Forwarders . ListEquals ( forwarders ) )
_dnsWebService . _dnsServer . Forwarders = forwarders ;
}
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "concurrentForwarding" , bool . Parse , out bool concurrentForwarding ) )
_dnsWebService . _dnsServer . ConcurrentForwarding = concurrentForwarding ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "forwarderRetries" , int . Parse , out int forwarderRetries ) )
_dnsWebService . _dnsServer . ForwarderRetries = forwarderRetries ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "forwarderTimeout" , int . Parse , out int forwarderTimeout ) )
_dnsWebService . _dnsServer . ForwarderTimeout = forwarderTimeout ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "forwarderConcurrency" , int . Parse , out int forwarderConcurrency ) )
_dnsWebService . _dnsServer . ForwarderConcurrency = forwarderConcurrency ;
2024-02-04 18:07:08 +05:30
2025-02-15 12:51:16 +05:30
#endregion
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
#region logging
2022-12-24 17:14:51 +05:30
2025-03-29 19:07:33 +05:30
if ( request . TryGetQueryOrFormEnum ( "loggingType" , out LoggingType loggingType ) )
_dnsWebService . _log . LoggingType = loggingType ;
else if ( request . TryGetQueryOrForm ( "enableLogging" , bool . Parse , out bool enableLogging ) )
_dnsWebService . _log . LoggingType = enableLogging ? LoggingType . File : LoggingType . None ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "ignoreResolverLogs" , bool . Parse , out bool ignoreResolverLogs ) )
_dnsWebService . _dnsServer . ResolverLogManager = ignoreResolverLogs ? null : _dnsWebService . _log ;
2025-01-11 17:59:23 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "logQueries" , bool . Parse , out bool logQueries ) )
_dnsWebService . _dnsServer . QueryLogManager = logQueries ? _dnsWebService . _log : null ;
2025-01-11 17:59:23 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "useLocalTime" , bool . Parse , out bool useLocalTime ) )
_dnsWebService . _log . UseLocalTime = useLocalTime ;
2023-01-01 18:27:19 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "logFolder" , out string logFolder ) )
_dnsWebService . _log . LogFolder = logFolder ;
2025-01-11 17:59:23 +05:30
2025-02-15 12:51:16 +05:30
if ( request . TryGetQueryOrForm ( "maxLogFileDays" , int . Parse , out int maxLogFileDays ) )
_dnsWebService . _log . MaxLogFileDays = maxLogFileDays ;
if ( request . TryGetQueryOrForm ( "enableInMemoryStats" , bool . Parse , out bool enableInMemoryStats ) )
_dnsWebService . _dnsServer . StatsManager . EnableInMemoryStats = enableInMemoryStats ;
if ( request . TryGetQueryOrForm ( "maxStatFileDays" , int . Parse , out int maxStatFileDays ) )
_dnsWebService . _dnsServer . StatsManager . MaxStatFileDays = maxStatFileDays ;
#endregion
2025-01-11 17:59:23 +05:30
}
2025-02-15 12:51:16 +05:30
finally
2025-01-11 17:59:23 +05:30
{
2025-02-15 12:51:16 +05:30
jsonDocument ? . Dispose ( ) ;
2025-01-11 17:59:23 +05:30
2025-02-15 12:51:16 +05:30
//TLS actions
if ( ( _dnsWebService . _webServiceTlsCertificatePath is null ) & & ( _dnsWebService . _dnsTlsCertificatePath is null ) )
_dnsWebService . StopTlsCertificateUpdateTimer ( ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
_dnsWebService . SelfSignedCertCheck ( serverDomainChanged | | webServiceLocalAddressesChanged , true ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( _dnsWebService . _webServiceEnableTls & & string . IsNullOrEmpty ( _dnsWebService . _webServiceTlsCertificatePath ) & & ! _dnsWebService . _webServiceUseSelfSignedTlsCertificate )
{
//disable TLS
_dnsWebService . _webServiceEnableTls = false ;
restartWebService = true ;
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
//blocklist timers
if ( ( _blockListUpdateIntervalHours > 0 ) & & ( ( _dnsWebService . _dnsServer . BlockListZoneManager . AllowListUrls . Count + _dnsWebService . _dnsServer . BlockListZoneManager . BlockListUrls . Count ) > 0 ) )
{
if ( _blockListUpdateTimer is null )
StartBlockListUpdateTimer ( blockListUrlsUpdated ) ;
else if ( blockListUrlsUpdated )
ForceUpdateBlockLists ( true ) ;
}
else
{
StopBlockListUpdateTimer ( ) ;
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
//save config
_dnsWebService . SaveConfigFile ( ) ;
_dnsWebService . _log . SaveConfig ( ) ;
}
2023-01-01 18:27:19 +05:30
2025-02-15 12:51:16 +05:30
_dnsWebService . _log . Write ( context . GetRemoteEndPoint ( _dnsWebService . _webServiceRealIpHeader ) , "[" + session . User . Username + "] DNS Settings were updated successfully." ) ;
2023-01-01 18:27:19 +05:30
2025-02-15 12:51:16 +05:30
Utf8JsonWriter jsonWriter = context . GetCurrentJsonWriter ( ) ;
WriteDnsSettings ( jsonWriter ) ;
2023-01-01 18:27:19 +05:30
2025-02-15 12:51:16 +05:30
RestartService ( restartDnsService , restartWebService , oldWebServiceLocalAddresses , oldWebServiceHttpPort , oldWebServiceTlsPort ) ;
}
public void GetTsigKeyNames ( HttpContext context )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
UserSession session = context . GetCurrentSession ( ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if (
! _dnsWebService . _authManager . IsPermitted ( PermissionSection . Settings , session . User , PermissionFlag . View ) & &
! _dnsWebService . _authManager . IsPermitted ( PermissionSection . Zones , session . User , PermissionFlag . Modify )
)
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
throw new DnsWebServiceException ( "Access was denied." ) ;
2022-12-24 17:14:51 +05:30
}
2025-02-15 12:51:16 +05:30
Utf8JsonWriter jsonWriter = context . GetCurrentJsonWriter ( ) ;
jsonWriter . WritePropertyName ( "tsigKeyNames" ) ;
{
jsonWriter . WriteStartArray ( ) ;
if ( _dnsWebService . _dnsServer . TsigKeys is not null )
{
foreach ( KeyValuePair < string , TsigKey > tsigKey in _dnsWebService . _dnsServer . TsigKeys )
jsonWriter . WriteStringValue ( tsigKey . Key ) ;
}
jsonWriter . WriteEndArray ( ) ;
}
2022-12-24 17:14:51 +05:30
}
2025-02-15 12:51:16 +05:30
public async Task BackupSettingsAsync ( HttpContext context )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
UserSession session = context . GetCurrentSession ( ) ;
if ( ! _dnsWebService . _authManager . IsPermitted ( PermissionSection . Settings , session . User , PermissionFlag . Delete ) )
throw new DnsWebServiceException ( "Access was denied." ) ;
HttpRequest request = context . Request ;
bool blockLists = request . GetQueryOrForm ( "blockLists" , bool . Parse , false ) ;
bool logs = request . GetQueryOrForm ( "logs" , bool . Parse , false ) ;
bool scopes = request . GetQueryOrForm ( "scopes" , bool . Parse , false ) ;
bool apps = request . GetQueryOrForm ( "apps" , bool . Parse , false ) ;
bool stats = request . GetQueryOrForm ( "stats" , bool . Parse , false ) ;
bool zones = request . GetQueryOrForm ( "zones" , bool . Parse , false ) ;
bool allowedZones = request . GetQueryOrForm ( "allowedZones" , bool . Parse , false ) ;
bool blockedZones = request . GetQueryOrForm ( "blockedZones" , bool . Parse , false ) ;
bool dnsSettings = request . GetQueryOrForm ( "dnsSettings" , bool . Parse , false ) ;
bool authConfig = request . GetQueryOrForm ( "authConfig" , bool . Parse , false ) ;
bool logSettings = request . GetQueryOrForm ( "logSettings" , bool . Parse , false ) ;
string tmpFile = Path . GetTempFileName ( ) ;
try
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
using ( FileStream backupZipStream = new FileStream ( tmpFile , FileMode . Create , FileAccess . ReadWrite ) )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
//create backup zip
using ( ZipArchive backupZip = new ZipArchive ( backupZipStream , ZipArchiveMode . Create , true , Encoding . UTF8 ) )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
if ( blockLists )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
string [ ] blockListFiles = Directory . GetFiles ( Path . Combine ( _dnsWebService . _configFolder , "blocklists" ) , "*" , SearchOption . TopDirectoryOnly ) ;
foreach ( string blockListFile in blockListFiles )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
string entryName = "blocklists/" + Path . GetFileName ( blockListFile ) ;
backupZip . CreateEntryFromFile ( blockListFile , entryName ) ;
2022-12-24 17:14:51 +05:30
}
}
2025-02-15 12:51:16 +05:30
if ( logs )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
string [ ] logFiles = Directory . GetFiles ( _dnsWebService . _log . LogFolderAbsolutePath , "*.log" , SearchOption . TopDirectoryOnly ) ;
foreach ( string logFile in logFiles )
{
string entryName = "logs/" + Path . GetFileName ( logFile ) ;
if ( logFile . Equals ( _dnsWebService . _log . CurrentLogFile , StringComparison . OrdinalIgnoreCase ) )
{
await CreateBackupEntryFromFileAsync ( backupZip , logFile , entryName ) ;
}
else
{
backupZip . CreateEntryFromFile ( logFile , entryName ) ;
}
}
2022-12-24 17:14:51 +05:30
}
2025-02-15 12:51:16 +05:30
if ( scopes )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
string [ ] scopeFiles = Directory . GetFiles ( Path . Combine ( _dnsWebService . _configFolder , "scopes" ) , "*.scope" , SearchOption . TopDirectoryOnly ) ;
foreach ( string scopeFile in scopeFiles )
{
string entryName = "scopes/" + Path . GetFileName ( scopeFile ) ;
backupZip . CreateEntryFromFile ( scopeFile , entryName ) ;
}
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( apps )
{
string [ ] appFiles = Directory . GetFiles ( Path . Combine ( _dnsWebService . _configFolder , "apps" ) , "*" , SearchOption . AllDirectories ) ;
foreach ( string appFile in appFiles )
{
string entryName = appFile . Substring ( _dnsWebService . _configFolder . Length ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( Path . DirectorySeparatorChar ! = '/' )
entryName = entryName . Replace ( Path . DirectorySeparatorChar , '/' ) ;
entryName = entryName . TrimStart ( '/' ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
await CreateBackupEntryFromFileAsync ( backupZip , appFile , entryName ) ;
}
2022-12-24 17:14:51 +05:30
}
2025-02-15 12:51:16 +05:30
if ( stats )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
string [ ] hourlyStatsFiles = Directory . GetFiles ( Path . Combine ( _dnsWebService . _configFolder , "stats" ) , "*.stat" , SearchOption . TopDirectoryOnly ) ;
foreach ( string hourlyStatsFile in hourlyStatsFiles )
{
string entryName = "stats/" + Path . GetFileName ( hourlyStatsFile ) ;
backupZip . CreateEntryFromFile ( hourlyStatsFile , entryName ) ;
}
string [ ] dailyStatsFiles = Directory . GetFiles ( Path . Combine ( _dnsWebService . _configFolder , "stats" ) , "*.dstat" , SearchOption . TopDirectoryOnly ) ;
foreach ( string dailyStatsFile in dailyStatsFiles )
{
string entryName = "stats/" + Path . GetFileName ( dailyStatsFile ) ;
backupZip . CreateEntryFromFile ( dailyStatsFile , entryName ) ;
}
2022-12-24 17:14:51 +05:30
}
2025-02-15 12:51:16 +05:30
if ( zones )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
string [ ] zoneFiles = Directory . GetFiles ( Path . Combine ( _dnsWebService . _configFolder , "zones" ) , "*.zone" , SearchOption . TopDirectoryOnly ) ;
foreach ( string zoneFile in zoneFiles )
{
string entryName = "zones/" + Path . GetFileName ( zoneFile ) ;
backupZip . CreateEntryFromFile ( zoneFile , entryName ) ;
}
2022-12-24 17:14:51 +05:30
}
2025-02-15 12:51:16 +05:30
if ( allowedZones )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
string allowedZonesFile = Path . Combine ( _dnsWebService . _configFolder , "allowed.config" ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( File . Exists ( allowedZonesFile ) )
backupZip . CreateEntryFromFile ( allowedZonesFile , "allowed.config" ) ;
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( blockedZones )
{
string blockedZonesFile = Path . Combine ( _dnsWebService . _configFolder , "blocked.config" ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( File . Exists ( blockedZonesFile ) )
backupZip . CreateEntryFromFile ( blockedZonesFile , "blocked.config" ) ;
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( dnsSettings )
{
string dnsSettingsFile = Path . Combine ( _dnsWebService . _configFolder , "dns.config" ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( File . Exists ( dnsSettingsFile ) )
backupZip . CreateEntryFromFile ( dnsSettingsFile , "dns.config" ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
//backup web service cert
if ( ! string . IsNullOrEmpty ( _dnsWebService . _webServiceTlsCertificatePath ) )
{
string webServiceTlsCertificatePath = _dnsWebService . ConvertToAbsolutePath ( _dnsWebService . _webServiceTlsCertificatePath ) ;
2023-08-12 13:20:35 +05:30
2025-02-15 12:51:16 +05:30
if ( File . Exists ( webServiceTlsCertificatePath ) & & webServiceTlsCertificatePath . StartsWith ( _dnsWebService . _configFolder , Environment . OSVersion . Platform = = PlatformID . Win32NT ? StringComparison . OrdinalIgnoreCase : StringComparison . Ordinal ) )
{
string entryName = _dnsWebService . ConvertToRelativePath ( webServiceTlsCertificatePath ) . Replace ( '\\' , '/' ) ;
backupZip . CreateEntryFromFile ( webServiceTlsCertificatePath , entryName ) ;
}
}
2023-08-12 13:20:35 +05:30
2025-02-15 12:51:16 +05:30
//backup optional protocols cert
if ( ! string . IsNullOrEmpty ( _dnsWebService . _dnsTlsCertificatePath ) )
2023-08-12 13:20:35 +05:30
{
2025-02-15 12:51:16 +05:30
string dnsTlsCertificatePath = _dnsWebService . ConvertToAbsolutePath ( _dnsWebService . _dnsTlsCertificatePath ) ;
if ( File . Exists ( dnsTlsCertificatePath ) & & dnsTlsCertificatePath . StartsWith ( _dnsWebService . _configFolder , Environment . OSVersion . Platform = = PlatformID . Win32NT ? StringComparison . OrdinalIgnoreCase : StringComparison . Ordinal ) )
{
string entryName = _dnsWebService . ConvertToRelativePath ( dnsTlsCertificatePath ) . Replace ( '\\' , '/' ) ;
backupZip . CreateEntryFromFile ( dnsTlsCertificatePath , entryName ) ;
}
2023-08-12 13:20:35 +05:30
}
}
2025-02-15 12:51:16 +05:30
if ( authConfig )
2023-08-12 13:20:35 +05:30
{
2025-02-15 12:51:16 +05:30
string authSettingsFile = Path . Combine ( _dnsWebService . _configFolder , "auth.config" ) ;
2023-08-12 13:20:35 +05:30
2025-02-15 12:51:16 +05:30
if ( File . Exists ( authSettingsFile ) )
backupZip . CreateEntryFromFile ( authSettingsFile , "auth.config" ) ;
2023-08-12 13:20:35 +05:30
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( logSettings )
{
string logSettingsFile = Path . Combine ( _dnsWebService . _configFolder , "log.config" ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( File . Exists ( logSettingsFile ) )
backupZip . CreateEntryFromFile ( logSettingsFile , "log.config" ) ;
}
2022-12-24 17:14:51 +05:30
}
2025-02-15 12:51:16 +05:30
//send zip file
backupZipStream . Position = 0 ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
HttpResponse response = context . Response ;
2023-01-01 18:27:19 +05:30
2025-02-15 12:51:16 +05:30
response . ContentType = "application/zip" ;
response . ContentLength = backupZipStream . Length ;
response . Headers . ContentDisposition = "attachment;filename=" + _dnsWebService . _dnsServer . ServerDomain + DateTime . UtcNow . ToString ( "_yyyy-MM-dd_HH-mm-ss" ) + "_backup.zip" ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
using ( Stream output = response . Body )
{
await backupZipStream . CopyToAsync ( output ) ;
}
2022-12-24 17:14:51 +05:30
}
}
2025-02-15 12:51:16 +05:30
finally
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
try
{
File . Delete ( tmpFile ) ;
}
catch ( Exception ex )
{
_dnsWebService . _log . Write ( ex ) ;
}
2022-12-24 17:14:51 +05:30
}
2025-02-15 12:51:16 +05:30
_dnsWebService . _log . Write ( context . GetRemoteEndPoint ( _dnsWebService . _webServiceRealIpHeader ) , "[" + session . User . Username + "] Settings backup zip file was exported." ) ;
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
public async Task RestoreSettingsAsync ( HttpContext context )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
UserSession session = context . GetCurrentSession ( ) ;
if ( ! _dnsWebService . _authManager . IsPermitted ( PermissionSection . Settings , session . User , PermissionFlag . Delete ) )
throw new DnsWebServiceException ( "Access was denied." ) ;
HttpRequest request = context . Request ;
bool blockLists = request . GetQueryOrForm ( "blockLists" , bool . Parse , false ) ;
bool logs = request . GetQueryOrForm ( "logs" , bool . Parse , false ) ;
bool scopes = request . GetQueryOrForm ( "scopes" , bool . Parse , false ) ;
bool apps = request . GetQueryOrForm ( "apps" , bool . Parse , false ) ;
bool stats = request . GetQueryOrForm ( "stats" , bool . Parse , false ) ;
bool zones = request . GetQueryOrForm ( "zones" , bool . Parse , false ) ;
bool allowedZones = request . GetQueryOrForm ( "allowedZones" , bool . Parse , false ) ;
bool blockedZones = request . GetQueryOrForm ( "blockedZones" , bool . Parse , false ) ;
bool dnsSettings = request . GetQueryOrForm ( "dnsSettings" , bool . Parse , false ) ;
bool authConfig = request . GetQueryOrForm ( "authConfig" , bool . Parse , false ) ;
bool logSettings = request . GetQueryOrForm ( "logSettings" , bool . Parse , false ) ;
bool deleteExistingFiles = request . GetQueryOrForm ( "deleteExistingFiles" , bool . Parse , false ) ;
if ( ! request . HasFormContentType | | ( request . Form . Files . Count = = 0 ) )
throw new DnsWebServiceException ( "DNS backup zip file is missing." ) ;
IReadOnlyList < IPAddress > oldWebServiceLocalAddresses = _dnsWebService . _webServiceLocalAddresses ;
int oldWebServiceHttpPort = _dnsWebService . _webServiceHttpPort ;
int oldWebServiceTlsPort = _dnsWebService . _webServiceTlsPort ;
//write to temp file
string tmpFile = Path . GetTempFileName ( ) ;
try
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
using ( FileStream fS = new FileStream ( tmpFile , FileMode . Create , FileAccess . ReadWrite ) )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
await request . Form . Files [ 0 ] . CopyToAsync ( fS ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
fS . Position = 0 ;
using ( ZipArchive backupZip = new ZipArchive ( fS , ZipArchiveMode . Read , false , Encoding . UTF8 ) )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
if ( logSettings | | logs )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
//stop logging
_dnsWebService . _log . StopLogging ( ) ;
2022-12-24 17:14:51 +05:30
}
2025-02-15 12:51:16 +05:30
try
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
if ( logSettings )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
ZipArchiveEntry entry = backupZip . GetEntry ( "log.config" ) ;
if ( entry is not null )
entry . ExtractToFile ( Path . Combine ( _dnsWebService . _configFolder , entry . Name ) , true ) ;
//reload config
_dnsWebService . _log . LoadConfig ( ) ;
2022-12-24 17:14:51 +05:30
}
2025-02-15 12:51:16 +05:30
if ( logs )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
if ( deleteExistingFiles )
{
//delete existing log files
string [ ] logFiles = Directory . GetFiles ( _dnsWebService . _log . LogFolderAbsolutePath , "*.log" , SearchOption . TopDirectoryOnly ) ;
foreach ( string logFile in logFiles )
{
File . Delete ( logFile ) ;
}
}
//extract log files from backup
foreach ( ZipArchiveEntry entry in backupZip . Entries )
{
if ( entry . FullName . StartsWith ( "logs/" ) )
entry . ExtractToFile ( Path . Combine ( _dnsWebService . _log . LogFolderAbsolutePath , entry . Name ) , true ) ;
}
2022-12-24 17:14:51 +05:30
}
}
2025-02-15 12:51:16 +05:30
finally
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
if ( logSettings | | logs )
{
//start logging
2025-03-29 19:07:33 +05:30
if ( _dnsWebService . _log . LoggingType ! = LoggingType . None )
2025-02-15 12:51:16 +05:30
_dnsWebService . _log . StartLogging ( ) ;
}
2022-12-24 17:14:51 +05:30
}
2025-02-15 12:51:16 +05:30
if ( authConfig )
{
ZipArchiveEntry entry = backupZip . GetEntry ( "auth.config" ) ;
if ( entry is not null )
entry . ExtractToFile ( Path . Combine ( _dnsWebService . _configFolder , entry . Name ) , true ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
//reload auth config
_dnsWebService . _authManager . LoadConfigFile ( session ) ;
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( blockLists )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
if ( deleteExistingFiles )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
//delete existing block list files
string [ ] blockListFiles = Directory . GetFiles ( Path . Combine ( _dnsWebService . _configFolder , "blocklists" ) , "*" , SearchOption . TopDirectoryOnly ) ;
foreach ( string blockListFile in blockListFiles )
{
File . Delete ( blockListFile ) ;
}
2022-12-24 17:14:51 +05:30
}
2025-02-15 12:51:16 +05:30
//extract block list files from backup
foreach ( ZipArchiveEntry entry in backupZip . Entries )
{
if ( entry . FullName . StartsWith ( "blocklists/" ) )
entry . ExtractToFile ( Path . Combine ( _dnsWebService . _configFolder , "blocklists" , entry . Name ) , true ) ;
}
2022-12-24 17:14:51 +05:30
}
2025-02-15 12:51:16 +05:30
if ( dnsSettings )
2023-08-12 13:20:35 +05:30
{
2025-02-15 12:51:16 +05:30
ZipArchiveEntry entry = backupZip . GetEntry ( "dns.config" ) ;
if ( entry is not null )
entry . ExtractToFile ( Path . Combine ( _dnsWebService . _configFolder , entry . Name ) , true ) ;
2023-08-12 13:20:35 +05:30
2025-02-15 12:51:16 +05:30
//extract any certs
foreach ( ZipArchiveEntry certEntry in backupZip . Entries )
2023-08-12 13:20:35 +05:30
{
2025-02-15 12:51:16 +05:30
if ( certEntry . FullName . StartsWith ( "apps/" ) )
continue ;
2023-08-12 13:20:35 +05:30
2025-02-15 12:51:16 +05:30
if ( certEntry . FullName . EndsWith ( ".pfx" , StringComparison . OrdinalIgnoreCase ) | | certEntry . FullName . EndsWith ( ".p12" , StringComparison . OrdinalIgnoreCase ) )
{
string certFile = Path . Combine ( _dnsWebService . _configFolder , certEntry . FullName ) ;
Directory . CreateDirectory ( Path . GetDirectoryName ( certFile ) ) ;
certEntry . ExtractToFile ( certFile , true ) ;
}
2023-08-12 13:20:35 +05:30
}
2025-02-15 12:51:16 +05:30
//flush zones to avoid UpdateServerDomain task for old zones and old allowed/blocked zones
if ( zones )
_dnsWebService . _dnsServer . AuthZoneManager . Flush ( ) ;
2024-09-21 12:54:05 +05:30
2025-02-15 12:51:16 +05:30
if ( allowedZones )
_dnsWebService . _dnsServer . AllowedZoneManager . Flush ( ) ;
2024-09-21 12:54:05 +05:30
2025-02-15 12:51:16 +05:30
if ( blockedZones )
_dnsWebService . _dnsServer . BlockedZoneManager . Flush ( ) ;
2024-09-21 12:54:05 +05:30
2025-02-15 12:51:16 +05:30
//reload settings and block list zone
_dnsWebService . LoadConfigFile ( ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( ( _dnsWebService . _dnsServer . BlockListZoneManager . AllowListUrls . Count + _dnsWebService . _dnsServer . BlockListZoneManager . BlockListUrls . Count ) > 0 )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
ThreadPool . QueueUserWorkItem ( delegate ( object state )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
try
{
_dnsWebService . _dnsServer . BlockListZoneManager . LoadBlockLists ( ) ;
}
catch ( Exception ex )
{
_dnsWebService . _log . Write ( ex ) ;
}
} ) ;
2023-05-20 18:11:48 +05:30
2025-02-15 12:51:16 +05:30
if ( _blockListUpdateIntervalHours > 0 )
StartBlockListUpdateTimer ( false ) ;
else
StopBlockListUpdateTimer ( ) ;
}
2023-08-12 13:20:35 +05:30
else
2025-02-15 12:51:16 +05:30
{
_dnsWebService . _dnsServer . BlockListZoneManager . Flush ( ) ;
2023-08-12 13:20:35 +05:30
2025-02-15 12:51:16 +05:30
StopBlockListUpdateTimer ( ) ;
}
2023-08-12 13:20:35 +05:30
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( apps )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
//unload apps
_dnsWebService . _dnsServer . DnsApplicationManager . UnloadAllApplications ( ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( deleteExistingFiles )
{
//delete existing apps
string appFolder = Path . Combine ( _dnsWebService . _configFolder , "apps" ) ;
if ( Directory . Exists ( appFolder ) )
Directory . Delete ( appFolder , true ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
//create apps folder
Directory . CreateDirectory ( appFolder ) ;
}
//extract apps files from backup
foreach ( ZipArchiveEntry entry in backupZip . Entries )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
if ( entry . FullName . StartsWith ( "apps/" ) )
{
string entryPath = entry . FullName ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( Path . DirectorySeparatorChar ! = '/' )
entryPath = entryPath . Replace ( '/' , '\\' ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
string filePath = Path . Combine ( _dnsWebService . _configFolder , entryPath ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
Directory . CreateDirectory ( Path . GetDirectoryName ( filePath ) ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
entry . ExtractToFile ( filePath , true ) ;
}
2022-12-24 17:14:51 +05:30
}
2025-02-15 12:51:16 +05:30
//reload apps
2025-03-29 19:07:33 +05:30
await _dnsWebService . _dnsServer . DnsApplicationManager . LoadAllApplicationsAsync ( ) ;
2025-02-15 12:51:16 +05:30
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( zones )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
if ( deleteExistingFiles )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
//delete existing zone files
string [ ] zoneFiles = Directory . GetFiles ( Path . Combine ( _dnsWebService . _configFolder , "zones" ) , "*.zone" , SearchOption . TopDirectoryOnly ) ;
foreach ( string zoneFile in zoneFiles )
{
File . Delete ( zoneFile ) ;
}
2022-12-24 17:14:51 +05:30
}
2025-02-15 12:51:16 +05:30
//extract zone files from backup
foreach ( ZipArchiveEntry entry in backupZip . Entries )
{
if ( entry . FullName . StartsWith ( "zones/" ) )
entry . ExtractToFile ( Path . Combine ( _dnsWebService . _configFolder , "zones" , entry . Name ) , true ) ;
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
//reload zones
_dnsWebService . _dnsServer . AuthZoneManager . LoadAllZoneFiles ( ) ;
_dnsWebService . InspectAndFixZonePermissions ( ) ;
2022-12-24 17:14:51 +05:30
}
2025-02-15 12:51:16 +05:30
if ( allowedZones )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
ZipArchiveEntry entry = backupZip . GetEntry ( "allowed.config" ) ;
if ( entry = = null )
{
string fileName = Path . Combine ( _dnsWebService . _configFolder , "allowed.config" ) ;
if ( File . Exists ( fileName ) )
File . Delete ( fileName ) ;
}
else
{
entry . ExtractToFile ( Path . Combine ( _dnsWebService . _configFolder , entry . Name ) , true ) ;
}
//reload
_dnsWebService . _dnsServer . AllowedZoneManager . LoadAllowedZoneFile ( ) ;
2022-12-24 17:14:51 +05:30
}
2025-02-15 12:51:16 +05:30
if ( blockedZones )
{
ZipArchiveEntry entry = backupZip . GetEntry ( "blocked.config" ) ;
if ( entry = = null )
{
string fileName = Path . Combine ( _dnsWebService . _configFolder , "blocked.config" ) ;
if ( File . Exists ( fileName ) )
File . Delete ( fileName ) ;
}
else
{
entry . ExtractToFile ( Path . Combine ( _dnsWebService . _configFolder , entry . Name ) , true ) ;
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
//reload
_dnsWebService . _dnsServer . BlockedZoneManager . LoadBlockedZoneFile ( ) ;
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
if ( scopes )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
//stop dhcp server
_dnsWebService . _dhcpServer . Stop ( ) ;
try
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
if ( deleteExistingFiles )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
//delete existing scope files
string [ ] scopeFiles = Directory . GetFiles ( Path . Combine ( _dnsWebService . _configFolder , "scopes" ) , "*.scope" , SearchOption . TopDirectoryOnly ) ;
foreach ( string scopeFile in scopeFiles )
{
File . Delete ( scopeFile ) ;
}
2022-12-24 17:14:51 +05:30
}
2025-02-15 12:51:16 +05:30
//extract scope files from backup
foreach ( ZipArchiveEntry entry in backupZip . Entries )
{
if ( entry . FullName . StartsWith ( "scopes/" ) )
entry . ExtractToFile ( Path . Combine ( _dnsWebService . _configFolder , "scopes" , entry . Name ) , true ) ;
}
}
finally
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
//start dhcp server
_dnsWebService . _dhcpServer . Start ( ) ;
2022-12-24 17:14:51 +05:30
}
}
2025-02-15 12:51:16 +05:30
if ( stats )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
if ( deleteExistingFiles )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
//delete existing stats files
string [ ] hourlyStatsFiles = Directory . GetFiles ( Path . Combine ( _dnsWebService . _configFolder , "stats" ) , "*.stat" , SearchOption . TopDirectoryOnly ) ;
foreach ( string hourlyStatsFile in hourlyStatsFiles )
{
File . Delete ( hourlyStatsFile ) ;
}
string [ ] dailyStatsFiles = Directory . GetFiles ( Path . Combine ( _dnsWebService . _configFolder , "stats" ) , "*.dstat" , SearchOption . TopDirectoryOnly ) ;
foreach ( string dailyStatsFile in dailyStatsFiles )
{
File . Delete ( dailyStatsFile ) ;
}
2022-12-24 17:14:51 +05:30
}
2025-02-15 12:51:16 +05:30
//extract stats files from backup
foreach ( ZipArchiveEntry entry in backupZip . Entries )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
if ( entry . FullName . StartsWith ( "stats/" ) )
entry . ExtractToFile ( Path . Combine ( _dnsWebService . _configFolder , "stats" , entry . Name ) , true ) ;
2022-12-24 17:14:51 +05:30
}
2025-02-15 12:51:16 +05:30
//reload stats
_dnsWebService . _dnsServer . StatsManager . ReloadStats ( ) ;
2022-12-24 17:14:51 +05:30
}
2025-02-15 12:51:16 +05:30
_dnsWebService . _log . Write ( context . GetRemoteEndPoint ( _dnsWebService . _webServiceRealIpHeader ) , "[" + session . User . Username + "] Settings backup zip file was restored." ) ;
2022-12-24 17:14:51 +05:30
}
}
}
2025-02-15 12:51:16 +05:30
finally
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
try
{
File . Delete ( tmpFile ) ;
}
catch ( Exception ex )
{
_dnsWebService . _log . Write ( ex ) ;
}
2022-12-24 17:14:51 +05:30
}
2025-02-15 12:51:16 +05:30
Utf8JsonWriter jsonWriter = context . GetCurrentJsonWriter ( ) ;
WriteDnsSettings ( jsonWriter ) ;
2024-06-15 15:07:32 +05:30
2025-02-15 12:51:16 +05:30
if ( dnsSettings )
RestartService ( true , true , oldWebServiceLocalAddresses , oldWebServiceHttpPort , oldWebServiceTlsPort ) ;
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
public void ForceUpdateBlockLists ( HttpContext context )
{
UserSession session = context . GetCurrentSession ( ) ;
2023-01-01 18:27:19 +05:30
2025-02-15 12:51:16 +05:30
if ( ! _dnsWebService . _authManager . IsPermitted ( PermissionSection . Settings , session . User , PermissionFlag . Modify ) )
throw new DnsWebServiceException ( "Access was denied." ) ;
2023-01-01 18:27:19 +05:30
2025-02-15 12:51:16 +05:30
ForceUpdateBlockLists ( false ) ;
_dnsWebService . _log . Write ( context . GetRemoteEndPoint ( _dnsWebService . _webServiceRealIpHeader ) , "[" + session . User . Username + "] Block list update was triggered." ) ;
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
public void TemporaryDisableBlocking ( HttpContext context )
{
UserSession session = context . GetCurrentSession ( ) ;
2023-01-01 18:27:19 +05:30
2025-02-15 12:51:16 +05:30
if ( ! _dnsWebService . _authManager . IsPermitted ( PermissionSection . Settings , session . User , PermissionFlag . Modify ) )
throw new DnsWebServiceException ( "Access was denied." ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
int minutes = context . Request . GetQueryOrForm ( "minutes" , int . Parse ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
Timer temporaryDisableBlockingTimer = _temporaryDisableBlockingTimer ;
if ( temporaryDisableBlockingTimer is not null )
temporaryDisableBlockingTimer . Dispose ( ) ;
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
Timer newTemporaryDisableBlockingTimer = new Timer ( delegate ( object state )
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
try
{
_dnsWebService . _dnsServer . EnableBlocking = true ;
_dnsWebService . _log . Write ( context . GetRemoteEndPoint ( _dnsWebService . _webServiceRealIpHeader ) , "[" + session . User . Username + "] Blocking was enabled after " + minutes + " minute(s) being temporarily disabled." ) ;
}
catch ( Exception ex )
{
_dnsWebService . _log . Write ( ex ) ;
}
} ) ;
Timer originalTimer = Interlocked . CompareExchange ( ref _temporaryDisableBlockingTimer , newTemporaryDisableBlockingTimer , temporaryDisableBlockingTimer ) ;
if ( ReferenceEquals ( originalTimer , temporaryDisableBlockingTimer ) )
{
newTemporaryDisableBlockingTimer . Change ( minutes * 60 * 1000 , Timeout . Infinite ) ;
_dnsWebService . _dnsServer . EnableBlocking = false ;
_temporaryDisableBlockingTill = DateTime . UtcNow . AddMinutes ( minutes ) ;
_dnsWebService . _log . Write ( context . GetRemoteEndPoint ( _dnsWebService . _webServiceRealIpHeader ) , "[" + session . User . Username + "] Blocking was temporarily disabled for " + minutes + " minute(s)." ) ;
2022-12-24 17:14:51 +05:30
}
2025-02-15 12:51:16 +05:30
else
2022-12-24 17:14:51 +05:30
{
2025-02-15 12:51:16 +05:30
newTemporaryDisableBlockingTimer . Dispose ( ) ;
2022-12-24 17:14:51 +05:30
}
2025-02-15 12:51:16 +05:30
Utf8JsonWriter jsonWriter = context . GetCurrentJsonWriter ( ) ;
jsonWriter . WriteString ( "temporaryDisableBlockingTill" , _temporaryDisableBlockingTill ) ;
2022-12-24 17:14:51 +05:30
}
2025-02-15 12:51:16 +05:30
#endregion
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
#region properties
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
public DateTime BlockListLastUpdatedOn
{
get { return _blockListLastUpdatedOn ; }
set { _blockListLastUpdatedOn = value ; }
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
public int BlockListUpdateIntervalHours
{
get { return _blockListUpdateIntervalHours ; }
set { _blockListUpdateIntervalHours = value ; }
}
2022-12-24 17:14:51 +05:30
2025-02-15 12:51:16 +05:30
#endregion
2022-12-24 17:14:51 +05:30
}
}
}