mirror of
https://github.com/Control-D-Inc/ctrld.git
synced 2026-07-16 13:17:19 +02:00
fix(windows): make staticcheck happy
This commit is contained in:
committed by
Cuong Manh Le
parent
023969ff6d
commit
68280f74d8
@@ -1138,39 +1138,9 @@ func (p *prog) stopDNSIntercept() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// dnsInterceptSupported reports whether DNS intercept mode is supported on this platform.
|
// exemptVPNDNSServers updates the WFP filters to permit outbound DNS to the given
|
||||||
func dnsInterceptSupported() bool {
|
// VPN DNS server IPs. This prevents the block filters from intercepting ctrld's own
|
||||||
if err := fwpuclntDLL.Load(); err != nil {
|
// forwarded queries to VPN DNS servers (split DNS routing).
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// validateDNSIntercept checks that the system meets requirements for DNS intercept mode.
|
|
||||||
func (p *prog) validateDNSIntercept() error {
|
|
||||||
// Hard mode requires WFP and elevation for filter management.
|
|
||||||
if hardIntercept {
|
|
||||||
if !dnsInterceptSupported() {
|
|
||||||
return fmt.Errorf("dns intercept: fwpuclnt.dll not available — WFP requires Windows Vista or later")
|
|
||||||
}
|
|
||||||
if !isElevated() {
|
|
||||||
return fmt.Errorf("dns intercept: administrator privileges required for WFP filter management in hard mode")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// dns mode only needs NRPT (HKLM registry writes), which services can do
|
|
||||||
// without explicit elevation checks.
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// isElevated checks if the current process has administrator privileges.
|
|
||||||
func isElevated() bool {
|
|
||||||
token := windows.GetCurrentProcessToken()
|
|
||||||
return token.IsElevated()
|
|
||||||
}
|
|
||||||
|
|
||||||
// exemptVPNDNSServers updates the WFP filters to permit outbound DNS to VPN DNS servers.
|
|
||||||
// This prevents the block filters from intercepting ctrld's own forwarded queries to
|
|
||||||
// VPN DNS servers (split DNS routing).
|
|
||||||
//
|
//
|
||||||
// The function is idempotent: it first removes ALL existing VPN permit filters,
|
// The function is idempotent: it first removes ALL existing VPN permit filters,
|
||||||
// then adds new ones for the current server list. When called with nil/empty
|
// then adds new ones for the current server list. When called with nil/empty
|
||||||
@@ -1572,31 +1542,6 @@ func (p *prog) probeNRPT() bool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// restartDNSClientService restarts the Windows DNS Client (Dnscache) service.
|
|
||||||
// This forces the DNS Client to fully re-initialize, including re-reading NRPT
|
|
||||||
// from the registry. This is the nuclear option when RefreshPolicyEx alone isn't
|
|
||||||
// enough — equivalent to macOS forceReloadPFMainRuleset().
|
|
||||||
func restartDNSClientService() {
|
|
||||||
mainLog.Load().Info().Msg("DNS intercept: restarting DNS Client service (Dnscache) to force NRPT reload")
|
|
||||||
cmd := exec.Command("net", "stop", "Dnscache", "/y")
|
|
||||||
if out, err := cmd.CombinedOutput(); err != nil {
|
|
||||||
mainLog.Load().Debug().Err(err).Str("output", string(out)).Msg("DNS intercept: failed to stop Dnscache (may require SYSTEM privileges)")
|
|
||||||
// Fall back to PowerShell Restart-Service
|
|
||||||
cmd2 := exec.Command("powershell", "-Command", "Restart-Service", "Dnscache", "-Force")
|
|
||||||
if out2, err2 := cmd2.CombinedOutput(); err2 != nil {
|
|
||||||
mainLog.Load().Warn().Err(err2).Str("output", string(out2)).Msg("DNS intercept: failed to restart Dnscache via PowerShell")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Start it again
|
|
||||||
cmd3 := exec.Command("net", "start", "Dnscache")
|
|
||||||
if out3, err3 := cmd3.CombinedOutput(); err3 != nil {
|
|
||||||
mainLog.Load().Warn().Err(err3).Str("output", string(out3)).Msg("DNS intercept: failed to start Dnscache after stop")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mainLog.Load().Info().Msg("DNS intercept: DNS Client service restarted")
|
|
||||||
}
|
|
||||||
|
|
||||||
// nrptProbeAndHeal runs the NRPT probe with retries and escalating remediation.
|
// nrptProbeAndHeal runs the NRPT probe with retries and escalating remediation.
|
||||||
// Called asynchronously after startup and from the health monitor.
|
// Called asynchronously after startup and from the health monitor.
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -14,9 +14,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
kernel32 = windows.NewLazySystemDLL("kernel32.dll")
|
|
||||||
wtsapi32 = windows.NewLazySystemDLL("wtsapi32.dll")
|
wtsapi32 = windows.NewLazySystemDLL("wtsapi32.dll")
|
||||||
procGetConsoleWindow = kernel32.NewProc("GetConsoleWindow")
|
|
||||||
procWTSGetActiveConsoleSessionId = wtsapi32.NewProc("WTSGetActiveConsoleSessionId")
|
procWTSGetActiveConsoleSessionId = wtsapi32.NewProc("WTSGetActiveConsoleSessionId")
|
||||||
procWTSQuerySessionInformation = wtsapi32.NewProc("WTSQuerySessionInformationW")
|
procWTSQuerySessionInformation = wtsapi32.NewProc("WTSQuerySessionInformationW")
|
||||||
procWTSFreeMemory = wtsapi32.NewProc("WTSFreeMemory")
|
procWTSFreeMemory = wtsapi32.NewProc("WTSFreeMemory")
|
||||||
|
|||||||
Reference in New Issue
Block a user