From f3c4dfb106be2896789279c91e6e654fc02f3871 Mon Sep 17 00:00:00 2001 From: Student Main Date: Fri, 5 Jun 2020 16:04:58 +0800 Subject: [PATCH] switch legacy url generation by hidden flag in config --- .../Controller/ShadowsocksController.cs | 2 +- shadowsocks-csharp/Model/Configuration.cs | 6 ++ shadowsocks-csharp/Model/Server.cs | 61 ++++++++++--------- shadowsocks-csharp/View/QRCodeForm.cs | 8 +-- test/UrlTest.cs | 2 +- 5 files changed, 44 insertions(+), 35 deletions(-) diff --git a/shadowsocks-csharp/Controller/ShadowsocksController.cs b/shadowsocks-csharp/Controller/ShadowsocksController.cs index 182f1bb3..e24ae4d2 100644 --- a/shadowsocks-csharp/Controller/ShadowsocksController.cs +++ b/shadowsocks-csharp/Controller/ShadowsocksController.cs @@ -371,7 +371,7 @@ namespace Shadowsocks.Controller public string GetServerURLForCurrentServer() { - return GetCurrentServer().URL; + return GetCurrentServer().GetURL(_config.generateLegacyUrl); } public void UpdatePACFromGeosite() diff --git a/shadowsocks-csharp/Model/Configuration.cs b/shadowsocks-csharp/Model/Configuration.cs index 0485ff3b..aa393c64 100644 --- a/shadowsocks-csharp/Model/Configuration.cs +++ b/shadowsocks-csharp/Model/Configuration.cs @@ -24,11 +24,13 @@ namespace Shadowsocks.Model public bool enabled; public bool shareOverLan; public bool isDefault; + // hidden public bool isIPv6Enabled = false; public int localPort; public bool portableMode = true; public bool showPluginOutput; public string pacUrl; + // geosite config is hidden public string geositeUrl; public string geositeGroup = "geolocation-!cn"; public bool geositeBlacklistMode = true; @@ -39,6 +41,10 @@ namespace Shadowsocks.Model public bool autoCheckUpdate; public bool checkPreRelease; public bool isVerboseLogging; + + // hidden config + public bool generateLegacyUrl = false; + //public NLogConfig.LogLevel logLevel; public LogViewerConfig logViewer; public ProxyConfig proxy; diff --git a/shadowsocks-csharp/Model/Server.cs b/shadowsocks-csharp/Model/Server.cs index 1f5cf828..40909615 100755 --- a/shadowsocks-csharp/Model/Server.cs +++ b/shadowsocks-csharp/Model/Server.cs @@ -56,47 +56,50 @@ namespace Shadowsocks.Model : $"{remarks} ({serverStr})"; } - public string URL + public string GetURL(bool legacyUrl = false) { - get - { - string tag = string.Empty; - string url = string.Empty; + string tag = string.Empty; + string url = string.Empty; - if (string.IsNullOrWhiteSpace(plugin)) - { - // For backwards compatiblity, if no plugin, use old url format - string parts = $"{method}:{password}@{server}:{server_port}"; - string base64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(parts)); - url = base64; - } - else + if (legacyUrl && string.IsNullOrWhiteSpace(plugin)) + { + // For backwards compatiblity, if no plugin, use old url format + string parts = $"{method}:{password}@{server}:{server_port}"; + string base64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(parts)); + url = base64; + } + else + { + // SIP002 + string parts = $"{method}:{password}"; + string base64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(parts)); + string websafeBase64 = base64.Replace('+', '-').Replace('/', '_').TrimEnd('='); + + url = string.Format( + "{0}@{1}:{2}/", + websafeBase64, + FormalHostName, + server_port + ); + + if (!plugin.IsNullOrWhiteSpace()) { - // SIP002 - string parts = $"{method}:{password}"; - string base64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(parts)); - string websafeBase64 = base64.Replace('+', '-').Replace('/', '_').TrimEnd('='); string pluginPart = plugin; if (!string.IsNullOrWhiteSpace(plugin_opts)) { pluginPart += ";" + plugin_opts; } - - url = string.Format( - "{0}@{1}:{2}/?plugin={3}", - websafeBase64, - FormalHostName, - server_port, - HttpUtility.UrlEncode(pluginPart, Encoding.UTF8)); + string pluginQuery = "?plugin=" + HttpUtility.UrlEncode(pluginPart, Encoding.UTF8); + url += pluginQuery; } + } - if (!remarks.IsNullOrEmpty()) - { - tag = $"#{HttpUtility.UrlEncode(remarks, Encoding.UTF8)}"; - } - return $"ss://{url}{tag}"; + if (!remarks.IsNullOrEmpty()) + { + tag = $"#{HttpUtility.UrlEncode(remarks, Encoding.UTF8)}"; } + return $"ss://{url}{tag}"; } public string FormalHostName diff --git a/shadowsocks-csharp/View/QRCodeForm.cs b/shadowsocks-csharp/View/QRCodeForm.cs index 44483a89..d8fc8c60 100755 --- a/shadowsocks-csharp/View/QRCodeForm.cs +++ b/shadowsocks-csharp/View/QRCodeForm.cs @@ -64,14 +64,14 @@ namespace Shadowsocks.View private void QRCodeForm_Load(object sender, EventArgs e) { - var servers = Configuration.Load(); - var serverDatas = servers.configs.Select( + Configuration config = Configuration.Load(); + List> serverDatas = config.configs.Select( server => - new KeyValuePair(server.URL, server.ToString()) + new KeyValuePair(server.GetURL(config.generateLegacyUrl), server.ToString()) ).ToList(); listBox1.DataSource = serverDatas; - var selectIndex = serverDatas.FindIndex(serverData => serverData.Key.StartsWith(code)); + int selectIndex = serverDatas.FindIndex(serverData => serverData.Key.StartsWith(code)); if (selectIndex >= 0) listBox1.SetSelected(selectIndex, true); } diff --git a/test/UrlTest.cs b/test/UrlTest.cs index 2b37bc55..77f0626c 100644 --- a/test/UrlTest.cs +++ b/test/UrlTest.cs @@ -243,7 +243,7 @@ namespace Shadowsocks.Test string expected = testCase.Key; Server config = testCase.Value; - var actual = config.URL; + var actual = config.GetURL(true); Assert.AreEqual(expected, actual); } }