2021-03-07 15:55:33 +05:30
/ *
Technitium DNS Server
2024-02-04 18:18:41 +05:30
Copyright ( C ) 2024 Shreyas Zare ( shreyas @technitium . com )
2021-03-07 15:55:33 +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 ;
using Microsoft.Extensions.Hosting ;
2024-05-19 15:18:19 +05:30
using Microsoft.Win32 ;
2021-03-07 15:55:33 +05:30
using System ;
2021-11-06 13:27:44 +05:30
using System.Reflection ;
2021-03-07 15:55:33 +05:30
using System.Threading ;
using System.Threading.Tasks ;
2021-11-06 13:27:44 +05:30
using TechnitiumLibrary.Net.Firewall ;
2021-03-07 15:55:33 +05:30
2021-03-13 13:29:59 +05:30
namespace DnsServerWindowsService
2021-03-07 15:55:33 +05:30
{
2024-02-04 18:18:41 +05:30
public sealed class DnsServiceWorker : BackgroundService
2021-03-07 15:55:33 +05:30
{
readonly DnsWebService _service ;
public DnsServiceWorker ( )
{
2022-03-12 16:02:48 +05:30
string configFolder = null ;
string [ ] args = Environment . GetCommandLineArgs ( ) ;
if ( args . Length = = 2 )
configFolder = args [ 1 ] ;
2022-09-18 18:18:33 +05:30
_service = new DnsWebService ( configFolder , new Uri ( "https://go.technitium.com/?id=43" ) , new Uri ( "https://go.technitium.com/?id=44" ) ) ;
2021-03-07 15:55:33 +05:30
}
2023-01-01 17:37:28 +05:30
public override async Task StartAsync ( CancellationToken cancellationToken )
2021-03-07 15:55:33 +05:30
{
2021-11-06 13:27:44 +05:30
CheckFirewallEntries ( ) ;
2023-01-01 17:37:28 +05:30
await _service . StartAsync ( ) ;
2021-03-07 15:55:33 +05:30
}
2023-01-01 17:37:28 +05:30
public override async Task StopAsync ( CancellationToken cancellationToken )
2021-03-07 15:55:33 +05:30
{
2023-01-01 17:37:28 +05:30
await _service . StopAsync ( ) ;
2021-03-07 15:55:33 +05:30
}
public override void Dispose ( )
{
if ( _service ! = null )
_service . Dispose ( ) ;
}
protected override Task ExecuteAsync ( CancellationToken stoppingToken )
{
return Task . CompletedTask ;
}
2021-11-06 13:27:44 +05:30
2024-02-04 18:18:41 +05:30
private static void CheckFirewallEntries ( )
2021-11-06 13:27:44 +05:30
{
2024-05-19 15:18:19 +05:30
bool autoFirewallEntry = true ;
2021-11-06 13:27:44 +05:30
2024-05-19 15:18:19 +05:30
try
{
#pragma warning disable CA1416 // Validate platform compatibility
using ( RegistryKey key = Registry . LocalMachine . OpenSubKey ( @"SOFTWARE\Technitium\DNS Server" , false ) )
{
if ( key is not null )
autoFirewallEntry = Convert . ToInt32 ( key . GetValue ( "AutoFirewallEntry" , 1 ) ) = = 1 ;
}
#pragma warning restore CA1416 // Validate platform compatibility
}
catch
{ }
2021-11-06 13:27:44 +05:30
2024-05-19 15:18:19 +05:30
if ( autoFirewallEntry )
{
string appPath = Assembly . GetEntryAssembly ( ) . Location ;
if ( appPath . EndsWith ( ".dll" , StringComparison . OrdinalIgnoreCase ) )
appPath = appPath . Substring ( 0 , appPath . Length - 4 ) + ".exe" ;
if ( ! WindowsFirewallEntryExists ( appPath ) )
AddWindowsFirewallEntry ( appPath ) ;
}
2021-11-06 13:27:44 +05:30
}
2024-02-04 18:18:41 +05:30
private static bool WindowsFirewallEntryExists ( string appPath )
2021-11-06 13:27:44 +05:30
{
try
{
return WindowsFirewall . RuleExistsVista ( "" , appPath ) = = RuleStatus . Allowed ;
}
catch
{
return false ;
}
}
2024-02-04 18:18:41 +05:30
private static bool AddWindowsFirewallEntry ( string appPath )
2021-11-06 13:27:44 +05:30
{
try
{
RuleStatus status = WindowsFirewall . RuleExistsVista ( "" , appPath ) ;
switch ( status )
{
case RuleStatus . Blocked :
case RuleStatus . Disabled :
WindowsFirewall . RemoveRuleVista ( "" , appPath ) ;
break ;
case RuleStatus . Allowed :
return true ;
}
WindowsFirewall . AddRuleVista ( "Technitium DNS Server" , "Allows incoming connection request to the DNS server." , FirewallAction . Allow , appPath , Protocol . ANY , null , null , null , null , InterfaceTypeFlags . All , true , Direction . Inbound , true ) ;
return true ;
}
catch
{
return false ;
}
}
2021-03-07 15:55:33 +05:30
}
}