@@ -12,12 +12,14 @@ using Shadowsocks.Util; | |||||
namespace Shadowsocks.Controller | namespace Shadowsocks.Controller | ||||
{ | { | ||||
class PACServer : Listener.Service | |||||
public class PACServer : Listener.Service | |||||
{ | { | ||||
public const string PAC_FILE = "pac.txt"; | public const string PAC_FILE = "pac.txt"; | ||||
public const string USER_RULE_FILE = "user-rule.txt"; | public const string USER_RULE_FILE = "user-rule.txt"; | ||||
public const string USER_ABP_FILE = "abp.txt"; | public const string USER_ABP_FILE = "abp.txt"; | ||||
public string PacSecret { get; private set; } = ""; | |||||
FileSystemWatcher PACFileWatcher; | FileSystemWatcher PACFileWatcher; | ||||
FileSystemWatcher UserRuleFileWatcher; | FileSystemWatcher UserRuleFileWatcher; | ||||
private Configuration _config; | private Configuration _config; | ||||
@@ -34,6 +36,17 @@ namespace Shadowsocks.Controller | |||||
public void UpdateConfiguration(Configuration config) | public void UpdateConfiguration(Configuration config) | ||||
{ | { | ||||
this._config = config; | this._config = config; | ||||
if (config.secureLocalPac) | |||||
{ | |||||
var rd = new byte[32]; | |||||
new Random().NextBytes(rd); | |||||
PacSecret = $"&secret={Convert.ToBase64String(rd)}"; | |||||
} | |||||
else | |||||
{ | |||||
PacSecret = ""; | |||||
} | |||||
} | } | ||||
public override bool Handle(byte[] firstPacket, int length, Socket socket, object state) | public override bool Handle(byte[] firstPacket, int length, Socket socket, object state) | ||||
@@ -269,7 +269,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
if (_config.enabled) | if (_config.enabled) | ||||
{ | { | ||||
SystemProxy.Update(_config, true); | |||||
SystemProxy.Update(_config, true, null); | |||||
} | } | ||||
Encryption.RNG.Close(); | Encryption.RNG.Close(); | ||||
} | } | ||||
@@ -347,6 +347,16 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
} | } | ||||
public void ToggleSecureLocalPac(bool enabled) | |||||
{ | |||||
_config.secureLocalPac = enabled; | |||||
SaveConfig(_config); | |||||
if (ConfigChanged != null) | |||||
{ | |||||
ConfigChanged(this, new EventArgs()); | |||||
} | |||||
} | |||||
public void ToggleCheckingUpdate(bool enabled) | public void ToggleCheckingUpdate(bool enabled) | ||||
{ | { | ||||
_config.autoCheckUpdate = enabled; | _config.autoCheckUpdate = enabled; | ||||
@@ -515,7 +525,7 @@ namespace Shadowsocks.Controller | |||||
{ | { | ||||
if (_config.enabled) | if (_config.enabled) | ||||
{ | { | ||||
SystemProxy.Update(_config, false); | |||||
SystemProxy.Update(_config, false, _pacServer); | |||||
_systemProxyIsDirty = true; | _systemProxyIsDirty = true; | ||||
} | } | ||||
else | else | ||||
@@ -523,7 +533,7 @@ namespace Shadowsocks.Controller | |||||
// only switch it off if we have switched it on | // only switch it off if we have switched it on | ||||
if (_systemProxyIsDirty) | if (_systemProxyIsDirty) | ||||
{ | { | ||||
SystemProxy.Update(_config, false); | |||||
SystemProxy.Update(_config, false, _pacServer); | |||||
_systemProxyIsDirty = false; | _systemProxyIsDirty = false; | ||||
} | } | ||||
} | } | ||||
@@ -11,7 +11,7 @@ namespace Shadowsocks.Controller | |||||
return value.ToString("yyyyMMddHHmmssfff"); | return value.ToString("yyyyMMddHHmmssfff"); | ||||
} | } | ||||
public static void Update(Configuration config, bool forceDisable) | |||||
public static void Update(Configuration config, bool forceDisable, PACServer pacSrv) | |||||
{ | { | ||||
bool global = config.global; | bool global = config.global; | ||||
bool enabled = config.enabled; | bool enabled = config.enabled; | ||||
@@ -35,7 +35,7 @@ namespace Shadowsocks.Controller | |||||
if (config.useOnlinePac && !config.pacUrl.IsNullOrEmpty()) | if (config.useOnlinePac && !config.pacUrl.IsNullOrEmpty()) | ||||
pacUrl = config.pacUrl; | pacUrl = config.pacUrl; | ||||
else | else | ||||
pacUrl = $"http://127.0.0.1:{config.localPort}/pac?t={GetTimestamp(DateTime.Now)}"; | |||||
pacUrl = $"http://127.0.0.1:{config.localPort}/pac?t={GetTimestamp(DateTime.Now)}{pacSrv.PacSecret}"; | |||||
WinINet.SetIEProxy(true, false, "", pacUrl); | WinINet.SetIEProxy(true, false, "", pacUrl); | ||||
} | } | ||||
} | } | ||||
@@ -22,6 +22,7 @@ namespace Shadowsocks.Model | |||||
public int localPort; | public int localPort; | ||||
public string pacUrl; | public string pacUrl; | ||||
public bool useOnlinePac; | public bool useOnlinePac; | ||||
public bool secureLocalPac = true; | |||||
public bool availabilityStatistics; | public bool availabilityStatistics; | ||||
public bool autoCheckUpdate; | public bool autoCheckUpdate; | ||||
public bool checkPreRelease; | public bool checkPreRelease; | ||||
@@ -47,6 +47,7 @@ namespace Shadowsocks.View | |||||
private MenuItem updateFromGFWListItem; | private MenuItem updateFromGFWListItem; | ||||
private MenuItem editGFWUserRuleItem; | private MenuItem editGFWUserRuleItem; | ||||
private MenuItem editOnlinePACItem; | private MenuItem editOnlinePACItem; | ||||
private MenuItem secureLocalPacUrlToggleItem; | |||||
private MenuItem autoCheckUpdatesToggleItem; | private MenuItem autoCheckUpdatesToggleItem; | ||||
private MenuItem checkPreReleaseToggleItem; | private MenuItem checkPreReleaseToggleItem; | ||||
private MenuItem proxyItem; | private MenuItem proxyItem; | ||||
@@ -271,6 +272,7 @@ namespace Shadowsocks.View | |||||
this.updateFromGFWListItem = CreateMenuItem("Update Local PAC from GFWList", new EventHandler(this.UpdatePACFromGFWListItem_Click)), | this.updateFromGFWListItem = CreateMenuItem("Update Local PAC from GFWList", new EventHandler(this.UpdatePACFromGFWListItem_Click)), | ||||
this.editGFWUserRuleItem = CreateMenuItem("Edit User Rule for GFWList...", new EventHandler(this.EditUserRuleFileForGFWListItem_Click)), | this.editGFWUserRuleItem = CreateMenuItem("Edit User Rule for GFWList...", new EventHandler(this.EditUserRuleFileForGFWListItem_Click)), | ||||
this.editOnlinePACItem = CreateMenuItem("Edit Online PAC URL...", new EventHandler(this.UpdateOnlinePACURLItem_Click)), | this.editOnlinePACItem = CreateMenuItem("Edit Online PAC URL...", new EventHandler(this.UpdateOnlinePACURLItem_Click)), | ||||
this.secureLocalPacUrlToggleItem = CreateMenuItem("Secure Local PAC", new EventHandler(this.SecureLocalPacUrlToggleItem_Click)), | |||||
}), | }), | ||||
this.proxyItem = CreateMenuItem("Forward Proxy...", new EventHandler(this.proxyItem_Click)), | this.proxyItem = CreateMenuItem("Forward Proxy...", new EventHandler(this.proxyItem_Click)), | ||||
new MenuItem("-"), | new MenuItem("-"), | ||||
@@ -397,6 +399,7 @@ namespace Shadowsocks.View | |||||
AutoStartupItem.Checked = AutoStartup.Check(); | AutoStartupItem.Checked = AutoStartup.Check(); | ||||
onlinePACItem.Checked = onlinePACItem.Enabled && config.useOnlinePac; | onlinePACItem.Checked = onlinePACItem.Enabled && config.useOnlinePac; | ||||
localPACItem.Checked = !onlinePACItem.Checked; | localPACItem.Checked = !onlinePACItem.Checked; | ||||
secureLocalPacUrlToggleItem.Checked = config.secureLocalPac; | |||||
UpdatePACItemsEnabledStatus(); | UpdatePACItemsEnabledStatus(); | ||||
UpdateUpdateMenu(); | UpdateUpdateMenu(); | ||||
} | } | ||||
@@ -796,6 +799,12 @@ namespace Shadowsocks.View | |||||
} | } | ||||
} | } | ||||
private void SecureLocalPacUrlToggleItem_Click(object sender, EventArgs e) | |||||
{ | |||||
Configuration configuration = controller.GetConfigurationCopy(); | |||||
controller.ToggleSecureLocalPac(!configuration.secureLocalPac); | |||||
} | |||||
private void UpdatePACItemsEnabledStatus() | private void UpdatePACItemsEnabledStatus() | ||||
{ | { | ||||
if (this.localPACItem.Checked) | if (this.localPACItem.Checked) | ||||
@@ -814,6 +823,7 @@ namespace Shadowsocks.View | |||||
} | } | ||||
} | } | ||||
private void UpdateUpdateMenu() | private void UpdateUpdateMenu() | ||||
{ | { | ||||
Configuration configuration = controller.GetConfigurationCopy(); | Configuration configuration = controller.GetConfigurationCopy(); | ||||