Unverified Commit 1e982c65 authored by Jehonathan Thomas's avatar Jehonathan Thomas Committed by GitHub

Merge pull request #508 from antrv/feature/sysproxy-win7

Fix restoring the system proxy state at the system shutdown in Windows 7
parents c963bc58 8b0e1e76
...@@ -18,6 +18,12 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -18,6 +18,12 @@ namespace Titanium.Web.Proxy.Helpers
[DllImport("kernel32.dll", SetLastError = true)] [DllImport("kernel32.dll", SetLastError = true)]
internal static extern bool SetConsoleCtrlHandler(ConsoleEventDelegate callback, bool add); 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 // Pinvoke
internal delegate bool ConsoleEventDelegate(int eventType); internal delegate bool ConsoleEventDelegate(int eventType);
} }
......
...@@ -80,10 +80,13 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -80,10 +80,13 @@ namespace Titanium.Web.Proxy.Helpers
/// <param name="protocolType"></param> /// <param name="protocolType"></param>
internal void SetProxy(string hostname, int port, ProxyProtocolType protocolType) internal void SetProxy(string hostname, int port, ProxyProtocolType protocolType)
{ {
var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true); using (var reg = OpenInternetSettingsKey())
if (reg != null)
{ {
if (reg == null)
{
return;
}
saveOriginalProxyConfiguration(reg); saveOriginalProxyConfiguration(reg);
prepareRegistry(reg); prepareRegistry(reg);
...@@ -124,9 +127,13 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -124,9 +127,13 @@ namespace Titanium.Web.Proxy.Helpers
/// </summary> /// </summary>
internal void RemoveProxy(ProxyProtocolType protocolType, bool saveOriginalConfig = true) internal void RemoveProxy(ProxyProtocolType protocolType, bool saveOriginalConfig = true)
{ {
var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true); using (var reg = OpenInternetSettingsKey())
if (reg != null)
{ {
if (reg == null)
{
return;
}
if (saveOriginalConfig) if (saveOriginalConfig)
{ {
saveOriginalProxyConfiguration(reg); saveOriginalProxyConfiguration(reg);
...@@ -161,10 +168,13 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -161,10 +168,13 @@ namespace Titanium.Web.Proxy.Helpers
/// </summary> /// </summary>
internal void DisableAllProxy() internal void DisableAllProxy()
{ {
var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true); using (var reg = OpenInternetSettingsKey())
if (reg != null)
{ {
if (reg == null)
{
return;
}
saveOriginalProxyConfiguration(reg); saveOriginalProxyConfiguration(reg);
reg.SetValue(regProxyEnable, 0); reg.SetValue(regProxyEnable, 0);
...@@ -176,10 +186,13 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -176,10 +186,13 @@ namespace Titanium.Web.Proxy.Helpers
internal void SetAutoProxyUrl(string url) internal void SetAutoProxyUrl(string url)
{ {
var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true); using (var reg = OpenInternetSettingsKey())
if (reg != null)
{ {
if (reg == null)
{
return;
}
saveOriginalProxyConfiguration(reg); saveOriginalProxyConfiguration(reg);
reg.SetValue(regAutoConfigUrl, url); reg.SetValue(regAutoConfigUrl, url);
refresh(); refresh();
...@@ -188,10 +201,13 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -188,10 +201,13 @@ namespace Titanium.Web.Proxy.Helpers
internal void SetProxyOverride(string proxyOverride) internal void SetProxyOverride(string proxyOverride)
{ {
var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true); using (var reg = OpenInternetSettingsKey())
if (reg != null)
{ {
if (reg == null)
{
return;
}
saveOriginalProxyConfiguration(reg); saveOriginalProxyConfiguration(reg);
reg.SetValue(regProxyOverride, proxyOverride); reg.SetValue(regProxyOverride, proxyOverride);
refresh(); refresh();
...@@ -205,10 +221,13 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -205,10 +221,13 @@ namespace Titanium.Web.Proxy.Helpers
return; return;
} }
var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true); using (var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true))
if (reg != null)
{ {
if (reg == null)
{
return;
}
var ov = originalValues; var ov = originalValues;
if (ov.AutoConfigUrl != null) if (ov.AutoConfigUrl != null)
{ {
...@@ -246,26 +265,43 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -246,26 +265,43 @@ namespace Titanium.Web.Proxy.Helpers
reg.DeleteValue(regProxyOverride, false); 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; 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() internal ProxyInfo GetProxyInfoFromRegistry()
{ {
var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true); using (var reg = OpenInternetSettingsKey())
if (reg != null)
{ {
if (reg == null)
{
return null;
}
return getProxyInfoFromRegistry(reg); return getProxyInfoFromRegistry(reg);
} }
return null;
} }
private ProxyInfo getProxyInfoFromRegistry(RegistryKey reg) 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(regProxyServer) as string,
reg.GetValue(regProxyOverride) as string); reg.GetValue(regProxyOverride) as string);
...@@ -307,5 +343,13 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -307,5 +343,13 @@ namespace Titanium.Web.Proxy.Helpers
NativeMethods.InternetSetOption(IntPtr.Zero, InternetOptionSettingsChanged, IntPtr.Zero, 0); NativeMethods.InternetSetOption(IntPtr.Zero, InternetOptionSettingsChanged, IntPtr.Zero, 0);
NativeMethods.InternetSetOption(IntPtr.Zero, InternetOptionRefresh, 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);
}
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment