Skip to content
This repository was archived by the owner on Jul 9, 2023. It is now read-only.

Fix restoring the system proxy state at the system shutdown in Windows 7 #508

Merged
merged 2 commits into from
Oct 18, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions src/Titanium.Web.Proxy/Helpers/NativeMethods.SystemProxy.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,12 @@ internal static extern bool InternetSetOption(IntPtr hInternet, int dwOption, In
[DllImport("kernel32.dll", SetLastError = true)]
internal static extern bool SetConsoleCtrlHandler(ConsoleEventDelegate callback, bool add);

/// <summary>
/// <see href="https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getsystemmetrics" />
/// </summary>
[DllImport("user32.dll")]
internal static extern int GetSystemMetrics(int nIndex);

// Pinvoke
internal delegate bool ConsoleEventDelegate(int eventType);
}
Expand Down
92 changes: 68 additions & 24 deletions src/Titanium.Web.Proxy/Helpers/SystemProxy.cs
Original file line number Diff line number Diff line change
Expand Up @@ -80,10 +80,13 @@ public SystemProxyManager()
/// <param name="protocolType"></param>
internal void SetProxy(string hostname, int port, ProxyProtocolType protocolType)
{
var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true);

if (reg != null)
using (var reg = OpenInternetSettingsKey())
{
if (reg == null)
{
return;
}

saveOriginalProxyConfiguration(reg);
prepareRegistry(reg);

Expand Down Expand Up @@ -124,9 +127,13 @@ internal void SetProxy(string hostname, int port, ProxyProtocolType protocolType
/// </summary>
internal void RemoveProxy(ProxyProtocolType protocolType, bool saveOriginalConfig = true)
{
var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true);
if (reg != null)
using (var reg = OpenInternetSettingsKey())
{
if (reg == null)
{
return;
}

if (saveOriginalConfig)
{
saveOriginalProxyConfiguration(reg);
Expand Down Expand Up @@ -161,10 +168,13 @@ internal void RemoveProxy(ProxyProtocolType protocolType, bool saveOriginalConfi
/// </summary>
internal void DisableAllProxy()
{
var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true);

if (reg != null)
using (var reg = OpenInternetSettingsKey())
{
if (reg == null)
{
return;
}

saveOriginalProxyConfiguration(reg);

reg.SetValue(regProxyEnable, 0);
Expand All @@ -176,10 +186,13 @@ internal void DisableAllProxy()

internal void SetAutoProxyUrl(string url)
{
var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true);

if (reg != null)
using (var reg = OpenInternetSettingsKey())
{
if (reg == null)
{
return;
}

saveOriginalProxyConfiguration(reg);
reg.SetValue(regAutoConfigUrl, url);
refresh();
Expand All @@ -188,10 +201,13 @@ internal void SetAutoProxyUrl(string url)

internal void SetProxyOverride(string proxyOverride)
{
var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true);

if (reg != null)
using (var reg = OpenInternetSettingsKey())
{
if (reg == null)
{
return;
}

saveOriginalProxyConfiguration(reg);
reg.SetValue(regProxyOverride, proxyOverride);
refresh();
Expand All @@ -205,10 +221,13 @@ internal void RestoreOriginalSettings()
return;
}

var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true);

if (reg != null)
using (var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true))
{
if (reg == null)
{
return;
}

var ov = originalValues;
if (ov.AutoConfigUrl != null)
{
Expand Down Expand Up @@ -246,26 +265,43 @@ internal void RestoreOriginalSettings()
reg.DeleteValue(regProxyOverride, false);
}

// This should not be needed, but sometimes the values are not stored into the registry
// at system shutdown without flushing.
reg.Flush();

originalValues = null;
refresh();

const int SM_SHUTTINGDOWN = 0x2000;
Version windows7Version = new Version(6, 1);
if (Environment.OSVersion.Version > windows7Version ||
NativeMethods.GetSystemMetrics(SM_SHUTTINGDOWN) == 0)
{
// Do not call refresh() in Windows 7 or earlier at system shutdown.
// SetInternetOption in the refresh method re-enables ProxyEnable registry value
// in Windows 7 or earlier at system shutdown.
refresh();
}
}
}

internal ProxyInfo GetProxyInfoFromRegistry()
{
var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true);

if (reg != null)
using (var reg = OpenInternetSettingsKey())
{
if (reg == null)
{
return null;
}

return getProxyInfoFromRegistry(reg);
}

return null;
}

private ProxyInfo getProxyInfoFromRegistry(RegistryKey reg)
{
var pi = new ProxyInfo(null, reg.GetValue(regAutoConfigUrl) as string, reg.GetValue(regProxyEnable) as int?,
var pi = new ProxyInfo(null,
reg.GetValue(regAutoConfigUrl) as string,
reg.GetValue(regProxyEnable) as int?,
reg.GetValue(regProxyServer) as string,
reg.GetValue(regProxyOverride) as string);

Expand Down Expand Up @@ -307,5 +343,13 @@ private static void refresh()
NativeMethods.InternetSetOption(IntPtr.Zero, InternetOptionSettingsChanged, IntPtr.Zero, 0);
NativeMethods.InternetSetOption(IntPtr.Zero, InternetOptionRefresh, IntPtr.Zero, 0);
}

/// <summary>
/// Opens the registry key with the internet settings
/// </summary>
private static RegistryKey OpenInternetSettingsKey()
{
return Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true);
}
}
}