diff --git a/v2rayN/ServiceLib/Models/CmdItem.cs b/v2rayN/ServiceLib/Models/CmdItem.cs new file mode 100644 index 00000000..545c9685 --- /dev/null +++ b/v2rayN/ServiceLib/Models/CmdItem.cs @@ -0,0 +1,8 @@ +namespace ServiceLib.Models +{ + public class CmdItem + { + public string? Cmd { get; set; } + public string? Arguments { get; set; } + } +} \ No newline at end of file diff --git a/v2rayN/ServiceLib/ServiceLib.csproj b/v2rayN/ServiceLib/ServiceLib.csproj index ca4e2c75..28d58e22 100644 --- a/v2rayN/ServiceLib/ServiceLib.csproj +++ b/v2rayN/ServiceLib/ServiceLib.csproj @@ -16,6 +16,7 @@ + diff --git a/v2rayN/ServiceLib/ViewModels/CheckUpdateViewModel.cs b/v2rayN/ServiceLib/ViewModels/CheckUpdateViewModel.cs index b0966221..45b1218d 100644 --- a/v2rayN/ServiceLib/ViewModels/CheckUpdateViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/CheckUpdateViewModel.cs @@ -67,12 +67,15 @@ namespace ServiceLib.ViewModels coreType = ECoreType.mihomo.ToString(), remarks = ResUI.menuCheckUpdate, }); - _checkUpdateItem.Add(new CheckUpdateItem() + if (Utils.IsWindows()) { - isSelected = true, - coreType = ECoreType.sing_box.ToString(), - remarks = ResUI.menuCheckUpdate, - }); + _checkUpdateItem.Add(new CheckUpdateItem() + { + isSelected = true, + coreType = ECoreType.sing_box.ToString(), + remarks = ResUI.menuCheckUpdate, + }); + } _checkUpdateItem.Add(new CheckUpdateItem() { isSelected = true, diff --git a/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs b/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs index 07a08f29..8beebd43 100644 --- a/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs @@ -295,7 +295,14 @@ namespace ServiceLib.ViewModels }); OpenTheFileLocationCmd = ReactiveCommand.Create(() => { - Utils.ProcessStart("Explorer", $"/select,{Utils.GetConfigPath()}"); + if (Utils.IsWindows()) + { + Utils.ProcessStart("Explorer", $"/select,{Utils.GetConfigPath()}"); + } + else if (Utils.IsLinux()) + { + Utils.ProcessStart("nautilus", Utils.GetConfigPath()); + } }); ReloadCmd = ReactiveCommand.Create(() => diff --git a/v2rayN/v2rayN.Desktop/Common/ProxySettingLinux.cs b/v2rayN/v2rayN.Desktop/Common/ProxySettingLinux.cs new file mode 100644 index 00000000..5abc9636 --- /dev/null +++ b/v2rayN/v2rayN.Desktop/Common/ProxySettingLinux.cs @@ -0,0 +1,94 @@ +using CliWrap; +using CliWrap.Buffered; + +namespace v2rayN.Desktop.Common +{ + public class ProxySettingLinux + { + public static async Task SetProxy(string host, int port) + { + var lstCmd = GetSetCmds(host, port); + + await ExecCmd(lstCmd); + } + + public static async Task UnsetProxy() + { + var lstCmd = GetUnsetCmds(); + + await ExecCmd(lstCmd); + } + + private static async Task ExecCmd(List lstCmd) + { + foreach (var cmd in lstCmd) + { + if (cmd is null || cmd.Cmd.IsNullOrEmpty() || cmd.Arguments.IsNullOrEmpty()) + { continue; } + + await Task.Delay(10); + var result = await Cli.Wrap(cmd.Cmd) + .WithArguments(cmd.Arguments) + .ExecuteBufferedAsync(); + + if (result.ExitCode != 0) + { + //Logging.SaveLog($"Command failed {cmd.Cmd},{cmd.Arguments}"); + Logging.SaveLog(result.ToString() ?? ""); + } + } + } + + private static List GetSetCmds(string host, int port) + { + //TODO KDE //XDG_CURRENT_DESKTOP + List lstType = ["http", "https", "socks", "ftp"]; + List lstCmd = []; + + lstCmd.Add(new CmdItem() + { + Cmd = "gsettings", + Arguments = "set org.gnome.system.proxy mode manual" + }); + + foreach (string type in lstType) + { + lstCmd.AddRange(GetSetCmdByType(type, host, port)); + } + + return lstCmd; + } + + private static List GetSetCmdByType(string type, string host, int port) + { + List lstCmd = []; + lstCmd.Add(new() + { + Cmd = "gsettings", + Arguments = $"set org.gnome.system.proxy.{type} host {host}", + }); + + lstCmd.Add(new() + { + Cmd = "gsettings", + Arguments = $"set org.gnome.system.proxy.{type} port {port}", + }); + + return lstCmd; + } + + private static List GetUnsetCmds() + { + //TODO KDE + List lstCmd = []; + + lstCmd.Add(new CmdItem() + { + Cmd = "gsettings", + Arguments = "set org.gnome.system.proxy mode none" + }); + + return lstCmd; + } + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN.Desktop/Common/ProxySettingOSX.cs b/v2rayN/v2rayN.Desktop/Common/ProxySettingOSX.cs new file mode 100644 index 00000000..fbe05894 --- /dev/null +++ b/v2rayN/v2rayN.Desktop/Common/ProxySettingOSX.cs @@ -0,0 +1,13 @@ +namespace v2rayN.Desktop.Common +{ + public class ProxySettingOSX + { + public static async Task SetProxy(string host, int port) + { + } + + public static async Task UnsetProxy() + { + } + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN.Desktop/Handler/SysProxyHandler.cs b/v2rayN/v2rayN.Desktop/Handler/SysProxyHandler.cs index 55e2082d..8dc30d19 100644 --- a/v2rayN/v2rayN.Desktop/Handler/SysProxyHandler.cs +++ b/v2rayN/v2rayN.Desktop/Handler/SysProxyHandler.cs @@ -1,4 +1,6 @@ -namespace v2rayN.Desktop.Handler +using v2rayN.Desktop.Common; + +namespace v2rayN.Desktop.Handler { public static class SysProxyHandler { @@ -14,22 +16,50 @@ try { int port = LazyConfig.Instance.GetLocalPort(EInboundProtocol.http); + int portSocks = LazyConfig.Instance.GetLocalPort(EInboundProtocol.socks); + int portPac = LazyConfig.Instance.GetLocalPort(EInboundProtocol.pac); if (port <= 0) { return false; } if (type == ESysProxyType.ForcedChange) { - var strProxy = $"{Global.Loopback}:{port}"; - await SetProxy(strProxy); + if (Utils.IsWindows()) + { + //TODO + } + else if (Utils.IsLinux()) + { + await ProxySettingLinux.SetProxy(Global.Loopback, port); + } + else if (Utils.IsOSX()) + { + await ProxySettingOSX.SetProxy(Global.Loopback, port); + } } else if (type == ESysProxyType.ForcedClear) { - await UnsetProxy(); + if (Utils.IsWindows()) + { + //TODO + } + else if (Utils.IsLinux()) + { + await ProxySettingLinux.UnsetProxy(); + } + else if (Utils.IsOSX()) + { + await ProxySettingOSX.UnsetProxy(); + } } - else if (type == ESysProxyType.Unchanged) + else if (type == ESysProxyType.Pac) { } + + //if (type != ESysProxyType.Pac) + //{ + // PacHandler.Stop(); + //} } catch (Exception ex) { @@ -37,25 +67,5 @@ } return true; } - - private static async Task SetProxy(string? strProxy) - { - await Task.Run(() => - { - var httpProxy = strProxy is null ? null : $"{Global.HttpProtocol}{strProxy}"; - var socksProxy = strProxy is null ? null : $"{Global.SocksProtocol}{strProxy}"; - var noProxy = $"localhost,127.0.0.0/8,::1"; - - Environment.SetEnvironmentVariable("http_proxy", httpProxy, EnvironmentVariableTarget.User); - Environment.SetEnvironmentVariable("https_proxy", httpProxy, EnvironmentVariableTarget.User); - Environment.SetEnvironmentVariable("all_proxy", socksProxy, EnvironmentVariableTarget.User); - Environment.SetEnvironmentVariable("no_proxy", noProxy, EnvironmentVariableTarget.User); - }); - } - - private static async Task UnsetProxy() - { - await SetProxy(null); - } } } \ No newline at end of file diff --git a/v2rayN/v2rayN.Desktop/Views/MainWindow.axaml b/v2rayN/v2rayN.Desktop/Views/MainWindow.axaml index 0f7b40cf..c1d0770e 100644 --- a/v2rayN/v2rayN.Desktop/Views/MainWindow.axaml +++ b/v2rayN/v2rayN.Desktop/Views/MainWindow.axaml @@ -165,7 +165,6 @@ -