diff --git a/shadowsocks-csharp/Controller/Service/GeositeUpdater.cs b/shadowsocks-csharp/Controller/Service/GeositeUpdater.cs index ea6dfb83..344b8e59 100644 --- a/shadowsocks-csharp/Controller/Service/GeositeUpdater.cs +++ b/shadowsocks-csharp/Controller/Service/GeositeUpdater.cs @@ -14,21 +14,22 @@ using System.Net; namespace Shadowsocks.Controller { - static class GeositeUpdater + public class GeositeResultEventArgs : EventArgs { - private static Logger logger = LogManager.GetCurrentClassLogger(); - - public static event EventHandler UpdateCompleted; + public bool Success; - public class ResultEventArgs : EventArgs + public GeositeResultEventArgs(bool success) { - public bool Success; - - public ResultEventArgs(bool success) - { - this.Success = success; - } + this.Success = success; } + } + + public static class GeositeUpdater + { + private static Logger logger = LogManager.GetCurrentClassLogger(); + + public static event EventHandler UpdateCompleted; + public static event ErrorEventHandler Error; private static readonly string DATABASE_PATH = Utils.GetTempPath("dlc.dat"); @@ -57,6 +58,12 @@ namespace Shadowsocks.Controller } } + public static void ResetEvent() + { + UpdateCompleted = null; + Error = null; + } + public static void UpdatePACFromGeosite(Configuration config) { string gfwListUrl = GEOSITE_URL; @@ -83,7 +90,7 @@ namespace Shadowsocks.Controller LoadGeositeList(); bool pacFileChanged = MergeAndWritePACFile(); - UpdateCompleted?.Invoke(null, new ResultEventArgs(pacFileChanged)); + UpdateCompleted?.Invoke(null, new GeositeResultEventArgs(pacFileChanged)); } catch (Exception ex) { diff --git a/shadowsocks-csharp/Controller/Service/GfwListUpdater.cs b/shadowsocks-csharp/Controller/Service/GfwListUpdater.cs deleted file mode 100644 index 7f380cb4..00000000 --- a/shadowsocks-csharp/Controller/Service/GfwListUpdater.cs +++ /dev/null @@ -1,137 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Net; -using System.Text; - -using Newtonsoft.Json; -using NLog; -using Shadowsocks.Model; -using Shadowsocks.Properties; -using Shadowsocks.Util; - -namespace Shadowsocks.Controller -{ - public class GFWListUpdater - { - private static Logger logger = LogManager.GetCurrentClassLogger(); - - private const string GFWLIST_URL = "https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt"; - - public event EventHandler UpdateCompleted; - - public event ErrorEventHandler Error; - - public class ResultEventArgs : EventArgs - { - public bool Success; - - public ResultEventArgs(bool success) - { - this.Success = success; - } - } - - private static readonly IEnumerable IgnoredLineBegins = new[] { '!', '[' }; - private void http_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) - { - try - { - File.WriteAllText(Utils.GetTempPath("gfwlist.txt"), e.Result, Encoding.UTF8); - bool pacFileChanged = MergeAndWritePACFile(e.Result); - UpdateCompleted?.Invoke(this, new ResultEventArgs(pacFileChanged)); - } - catch (Exception ex) - { - Error?.Invoke(this, new ErrorEventArgs(ex)); - } - } - - public static bool MergeAndWritePACFile(string gfwListResult) - { - string abpContent = MergePACFile(gfwListResult); - if (File.Exists(PACDaemon.PAC_FILE)) - { - string original = FileManager.NonExclusiveReadAllText(PACDaemon.PAC_FILE, Encoding.UTF8); - if (original == abpContent) - { - return false; - } - } - File.WriteAllText(PACDaemon.PAC_FILE, abpContent, Encoding.UTF8); - return true; - } - - private static string MergePACFile(string gfwListResult) - { - string abpContent; - if (File.Exists(PACDaemon.USER_ABP_FILE)) - { - abpContent = FileManager.NonExclusiveReadAllText(PACDaemon.USER_ABP_FILE, Encoding.UTF8); - } - else - { - abpContent = Resources.abp_js; - } - - List userruleLines = new List(); - if (File.Exists(PACDaemon.USER_RULE_FILE)) - { - string userrulesString = FileManager.NonExclusiveReadAllText(PACDaemon.USER_RULE_FILE, Encoding.UTF8); - userruleLines = ParseToValidList(userrulesString); - } - - List gfwLines = new List(); - gfwLines = ParseBase64ToValidList(gfwListResult); - abpContent = -$@"var __USERRULES__ = {JsonConvert.SerializeObject(userruleLines, Formatting.Indented)}; -var __RULES__ = {JsonConvert.SerializeObject(gfwLines, Formatting.Indented)}; -{abpContent}"; - return abpContent; - } - - public void UpdatePACFromGFWList(Configuration config) - { - string gfwListUrl = GFWLIST_URL; - if (!string.IsNullOrWhiteSpace(config.gfwListUrl)) - { - logger.Info("Found custom GFWListURL in config file"); - gfwListUrl = config.gfwListUrl; - } - logger.Info($"Checking GFWList from {gfwListUrl}"); - WebClient http = new WebClient(); - if (config.enabled) - { - http.Proxy = new WebProxy( - config.isIPv6Enabled - ? $"[{IPAddress.IPv6Loopback.ToString()}]" - : IPAddress.Loopback.ToString(), - config.localPort); - } - http.DownloadStringCompleted += http_DownloadStringCompleted; - http.DownloadStringAsync(new Uri(gfwListUrl)); - } - - public static List ParseBase64ToValidList(string response) - { - byte[] bytes = Convert.FromBase64String(response); - string content = Encoding.ASCII.GetString(bytes); - return ParseToValidList(content); - } - - private static List ParseToValidList(string content) - { - List valid_lines = new List(); - using (var sr = new StringReader(content)) - { - foreach (var line in sr.NonWhiteSpaceLines()) - { - if (line.BeginWithAny(IgnoredLineBegins)) - continue; - valid_lines.Add(line); - } - } - return valid_lines; - } - } -} diff --git a/shadowsocks-csharp/Controller/ShadowsocksController.cs b/shadowsocks-csharp/Controller/ShadowsocksController.cs index e1df6186..35eb4122 100644 --- a/shadowsocks-csharp/Controller/ShadowsocksController.cs +++ b/shadowsocks-csharp/Controller/ShadowsocksController.cs @@ -35,7 +35,6 @@ namespace Shadowsocks.Controller private Configuration _config; private StrategyManager _strategyManager; private PrivoxyRunner privoxyRunner; - private GFWListUpdater gfwListUpdater; private readonly ConcurrentDictionary _pluginsByServer; public AvailabilityStatistics availabilityStatistics = AvailabilityStatistics.Instance; @@ -80,7 +79,7 @@ namespace Shadowsocks.Controller public event EventHandler PACFileReadyToOpen; public event EventHandler UserRuleFileReadyToOpen; - public event EventHandler UpdatePACFromGFWListCompleted; + public event EventHandler UpdatePACFromGFWListCompleted; public event ErrorEventHandler UpdatePACFromGFWListError; @@ -418,10 +417,7 @@ namespace Shadowsocks.Controller public void UpdatePACFromGFWList() { - if (gfwListUpdater != null) - { - gfwListUpdater.UpdatePACFromGFWList(_config); - } + GeositeUpdater.UpdatePACFromGeosite(_config); } public void UpdateStatisticsConfiguration(bool enabled) @@ -534,9 +530,9 @@ namespace Shadowsocks.Controller _pacServer = _pacServer ?? new PACServer(_pacDaemon); _pacServer.UpdatePACURL(_config); // So PACServer works when system proxy disabled. - gfwListUpdater = gfwListUpdater ?? new GFWListUpdater(); - gfwListUpdater.UpdateCompleted += PacServer_PACUpdateCompleted; - gfwListUpdater.Error += PacServer_PACUpdateError; + GeositeUpdater.ResetEvent(); + GeositeUpdater.UpdateCompleted += PacServer_PACUpdateCompleted; + GeositeUpdater.Error += PacServer_PACUpdateError; availabilityStatistics.UpdateConfiguration(this); _listener?.Stop(); @@ -613,7 +609,7 @@ namespace Shadowsocks.Controller UpdateSystemProxy(); } - private void PacServer_PACUpdateCompleted(object sender, GFWListUpdater.ResultEventArgs e) + private void PacServer_PACUpdateCompleted(object sender, GeositeResultEventArgs e) { UpdatePACFromGFWListCompleted?.Invoke(this, e); } @@ -632,7 +628,7 @@ namespace Shadowsocks.Controller } else { - GFWListUpdater.MergeAndWritePACFile(FileManager.NonExclusiveReadAllText(Utils.GetTempPath("gfwlist.txt"))); + GeositeUpdater.MergeAndWritePACFile(); } UpdateSystemProxy(); } diff --git a/shadowsocks-csharp/View/MenuViewController.cs b/shadowsocks-csharp/View/MenuViewController.cs index 253c54c2..32f62374 100644 --- a/shadowsocks-csharp/View/MenuViewController.cs +++ b/shadowsocks-csharp/View/MenuViewController.cs @@ -393,7 +393,7 @@ namespace Shadowsocks.View logger.LogUsefulException(e.GetException()); } - void controller_UpdatePACFromGFWListCompleted(object sender, GFWListUpdater.ResultEventArgs e) + void controller_UpdatePACFromGFWListCompleted(object sender, GeositeResultEventArgs e) { string result = e.Success ? I18N.GetString("PAC updated") diff --git a/shadowsocks-csharp/shadowsocks-csharp.csproj b/shadowsocks-csharp/shadowsocks-csharp.csproj index 68ef1cd7..21d19e17 100644 --- a/shadowsocks-csharp/shadowsocks-csharp.csproj +++ b/shadowsocks-csharp/shadowsocks-csharp.csproj @@ -173,7 +173,6 @@ -