diff --git a/v2rayN/ServiceLib/Common/Utils.cs b/v2rayN/ServiceLib/Common/Utils.cs index 993f41f0..cf242963 100644 --- a/v2rayN/ServiceLib/Common/Utils.cs +++ b/v2rayN/ServiceLib/Common/Utils.cs @@ -427,6 +427,30 @@ namespace ServiceLib.Common return false; } + public static Uri? TryUri(string url) + { + try + { + return new Uri(url); + } + catch (UriFormatException) + { + return null; + } + } + + public static bool IsPrivateNetwork(string ip) + { + if (IPAddress.TryParse(ip, out var address)) + { + var ipBytes = address.GetAddressBytes(); + if (ipBytes[0] == 10) return true; + if (ipBytes[0] == 172 && ipBytes[1] >= 16 && ipBytes[1] <= 31) return true; + if (ipBytes[0] == 192 && ipBytes[1] == 168) return true; + } + return false; + } + #endregion 数据检查 #region 测速 @@ -632,7 +656,7 @@ namespace ServiceLib.Common } return Path.Combine(startupPath, fileName); } - + public static string GetExePath() { return Environment.ProcessPath ?? Process.GetCurrentProcess().MainModule?.FileName ?? string.Empty; diff --git a/v2rayN/ServiceLib/Handler/ConfigHandler.cs b/v2rayN/ServiceLib/Handler/ConfigHandler.cs index 7adbe4a2..62c51ceb 100644 --- a/v2rayN/ServiceLib/Handler/ConfigHandler.cs +++ b/v2rayN/ServiceLib/Handler/ConfigHandler.cs @@ -1335,17 +1335,17 @@ namespace ServiceLib.Handler Url = url }; - try + var uri = Utils.TryUri(url); + if (uri == null) return -1; + //Do not allow http protocol + if (url.StartsWith(Global.HttpProtocol) && !Utils.IsPrivateNetwork(uri.IdnHost)) { - var uri = new Uri(url); - var queryVars = Utils.ParseQueryString(uri.Query); - subItem.Remarks = queryVars["remarks"] ?? "import_sub"; - } - catch (UriFormatException) - { - return 0; + return -1; } + var queryVars = Utils.ParseQueryString(uri.Query); + subItem.Remarks = queryVars["remarks"] ?? "import_sub"; + return await AddSubItem(config, subItem); } diff --git a/v2rayN/ServiceLib/Handler/Fmt/Hysteria2Fmt.cs b/v2rayN/ServiceLib/Handler/Fmt/Hysteria2Fmt.cs index e6b155cb..7f51120c 100644 --- a/v2rayN/ServiceLib/Handler/Fmt/Hysteria2Fmt.cs +++ b/v2rayN/ServiceLib/Handler/Fmt/Hysteria2Fmt.cs @@ -10,7 +10,8 @@ ConfigType = EConfigType.Hysteria2 }; - Uri url = new(str); + var url = Utils.TryUri(str); + if (url == null) return null; item.Address = url.IdnHost; item.Port = url.Port; diff --git a/v2rayN/ServiceLib/Handler/Fmt/ShadowsocksFmt.cs b/v2rayN/ServiceLib/Handler/Fmt/ShadowsocksFmt.cs index 39d4fd67..1a697eb9 100644 --- a/v2rayN/ServiceLib/Handler/Fmt/ShadowsocksFmt.cs +++ b/v2rayN/ServiceLib/Handler/Fmt/ShadowsocksFmt.cs @@ -81,15 +81,9 @@ namespace ServiceLib.Handler.Fmt private static ProfileItem? ResolveSip002(string result) { - Uri parsedUrl; - try - { - parsedUrl = new Uri(result); - } - catch (UriFormatException) - { - return null; - } + var parsedUrl = Utils.TryUri(result); + if (parsedUrl == null) return null; + ProfileItem item = new() { Remarks = parsedUrl.GetComponents(UriComponents.Fragment, UriFormat.Unescaped), diff --git a/v2rayN/ServiceLib/Handler/Fmt/SocksFmt.cs b/v2rayN/ServiceLib/Handler/Fmt/SocksFmt.cs index 1159dfe4..1478d170 100644 --- a/v2rayN/ServiceLib/Handler/Fmt/SocksFmt.cs +++ b/v2rayN/ServiceLib/Handler/Fmt/SocksFmt.cs @@ -93,15 +93,9 @@ private static ProfileItem? ResolveSocksNew(string result) { - Uri parsedUrl; - try - { - parsedUrl = new Uri(result); - } - catch (UriFormatException) - { - return null; - } + var parsedUrl = Utils.TryUri(result); + if (parsedUrl == null) return null; + ProfileItem item = new() { Remarks = parsedUrl.GetComponents(UriComponents.Fragment, UriFormat.Unescaped), diff --git a/v2rayN/ServiceLib/Handler/Fmt/TrojanFmt.cs b/v2rayN/ServiceLib/Handler/Fmt/TrojanFmt.cs index e098a4f6..b2ffe2ad 100644 --- a/v2rayN/ServiceLib/Handler/Fmt/TrojanFmt.cs +++ b/v2rayN/ServiceLib/Handler/Fmt/TrojanFmt.cs @@ -10,8 +10,9 @@ { ConfigType = EConfigType.Trojan }; - - Uri url = new(str); + + var url = Utils.TryUri(str); + if (url == null) return null; item.Address = url.IdnHost; item.Port = url.Port; diff --git a/v2rayN/ServiceLib/Handler/Fmt/TuicFmt.cs b/v2rayN/ServiceLib/Handler/Fmt/TuicFmt.cs index 6e357e40..e5ed4577 100644 --- a/v2rayN/ServiceLib/Handler/Fmt/TuicFmt.cs +++ b/v2rayN/ServiceLib/Handler/Fmt/TuicFmt.cs @@ -11,7 +11,8 @@ ConfigType = EConfigType.TUIC }; - Uri url = new(str); + var url = Utils.TryUri(str); + if (url == null) return null; item.Address = url.IdnHost; item.Port = url.Port; diff --git a/v2rayN/ServiceLib/Handler/Fmt/VLESSFmt.cs b/v2rayN/ServiceLib/Handler/Fmt/VLESSFmt.cs index f699d320..a84145c3 100644 --- a/v2rayN/ServiceLib/Handler/Fmt/VLESSFmt.cs +++ b/v2rayN/ServiceLib/Handler/Fmt/VLESSFmt.cs @@ -12,7 +12,8 @@ Security = Global.None }; - Uri url = new(str); + var url = Utils.TryUri(str); + if (url == null) return null; item.Address = url.IdnHost; item.Port = url.Port; diff --git a/v2rayN/ServiceLib/Handler/Fmt/VmessFmt.cs b/v2rayN/ServiceLib/Handler/Fmt/VmessFmt.cs index fe3e9fa4..a9913a3a 100644 --- a/v2rayN/ServiceLib/Handler/Fmt/VmessFmt.cs +++ b/v2rayN/ServiceLib/Handler/Fmt/VmessFmt.cs @@ -105,7 +105,8 @@ Security = "auto" }; - Uri url = new(str); + var url = Utils.TryUri(str); + if (url == null) return null; item.Address = url.IdnHost; item.Port = url.Port; diff --git a/v2rayN/ServiceLib/Handler/Fmt/WireguardFmt.cs b/v2rayN/ServiceLib/Handler/Fmt/WireguardFmt.cs index 285ddb32..e3d88e8c 100644 --- a/v2rayN/ServiceLib/Handler/Fmt/WireguardFmt.cs +++ b/v2rayN/ServiceLib/Handler/Fmt/WireguardFmt.cs @@ -11,7 +11,8 @@ ConfigType = EConfigType.WireGuard }; - Uri url = new(str); + var url = Utils.TryUri(str); + if (url == null) return null; item.Address = url.IdnHost; item.Port = url.Port; diff --git a/v2rayN/ServiceLib/ViewModels/SubEditViewModel.cs b/v2rayN/ServiceLib/ViewModels/SubEditViewModel.cs index ac7a6472..5ef396cb 100644 --- a/v2rayN/ServiceLib/ViewModels/SubEditViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/SubEditViewModel.cs @@ -33,6 +33,23 @@ namespace ServiceLib.ViewModels return; } + var url = SelectedSource.Url; + if (url.IsNotEmpty()) + { + var uri = Utils.TryUri(url); + if (uri == null) + { + NoticeHandler.Instance.Enqueue(ResUI.LvUrl); + return; + } + //Do not allow http protocol + if (url.StartsWith(Global.HttpProtocol) && !Utils.IsPrivateNetwork(uri.IdnHost)) + { + NoticeHandler.Instance.Enqueue(ResUI.LvUrl); + return; + } + } + if (await ConfigHandler.AddSubItem(_config, SelectedSource) == 0) { NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess);