From 0c03e8b4f3f2cb0e94703a76c42378694ef82137 Mon Sep 17 00:00:00 2001 From: jx Date: Wed, 26 Oct 2022 21:36:40 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0PAC=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- clashN/clashN/Handler/ConfigHandler.cs | 5 +++ clashN/clashN/Handler/HttpHandler.cs | 44 +++++++++++++++++++ clashN/clashN/Handler/SysProxyHandle.cs | 11 +++++ clashN/clashN/Mode/Config.cs | 8 +++- clashN/clashN/Mode/ESysProxyType.cs | 3 +- clashN/clashN/Resx/ResUI.Designer.cs | 18 ++++++++ clashN/clashN/Resx/ResUI.resx | 6 +++ clashN/clashN/Resx/ResUI.zh-Hans.resx | 9 ++++ .../clashN/ViewModels/ConnectionsViewModel.cs | 1 - .../clashN/ViewModels/MainWindowViewModel.cs | 7 ++- .../clashN/ViewModels/ProfileEditViewModel.cs | 1 - clashN/clashN/ViewModels/ProfilesViewModel.cs | 1 - clashN/clashN/ViewModels/ProxiesViewModel.cs | 1 - clashN/clashN/ViewModels/SettingsViewModel.cs | 5 ++- clashN/clashN/Views/MainWindow.xaml | 11 +++++ clashN/clashN/Views/MainWindow.xaml.cs | 1 + clashN/clashN/Views/ProxiesView.xaml | 1 + clashN/clashN/Views/SettingsView.xaml | 21 +++++++-- clashN/clashN/clashN.csproj | 1 + 19 files changed, 142 insertions(+), 13 deletions(-) create mode 100644 clashN/clashN/Handler/HttpHandler.cs diff --git a/clashN/clashN/Handler/ConfigHandler.cs b/clashN/clashN/Handler/ConfigHandler.cs index 4aaedef..3029104 100644 --- a/clashN/clashN/Handler/ConfigHandler.cs +++ b/clashN/clashN/Handler/ConfigHandler.cs @@ -67,6 +67,11 @@ namespace clashN.Handler config.APIPort = 9090; } + if (config.PacPort == 0) + { + config.PacPort = 7990; + } + if (config.profileItems == null) { config.profileItems = new List(); diff --git a/clashN/clashN/Handler/HttpHandler.cs b/clashN/clashN/Handler/HttpHandler.cs new file mode 100644 index 0000000..604d093 --- /dev/null +++ b/clashN/clashN/Handler/HttpHandler.cs @@ -0,0 +1,44 @@ +using System.IO; +using System.Windows; +using clashN.Mode; +using TouchSocket.Core.Config; +using TouchSocket.Core.Plugins; +using TouchSocket.Http; +using TouchSocket.Http.Plugins; +using TouchSocket.Sockets; + +namespace clashN.Handler; + +public class HttpHandler : HttpPluginBase +{ + private static HttpService _httpService = new(); + private static string _pacText; + + public static void Start(Config config) + { + if (!File.Exists("./pac.txt")) + { + MessageBox.Show("pac file is not exists", "error", MessageBoxButton.OK, MessageBoxImage.Error); + return; + } + + _pacText = File.ReadAllText("./pac.txt").Replace("__PROXY__", $"PROXY 127.0.0.1:{config.httpPort};DIRECT;"); + Stop(); + _httpService.Setup(config.PacPort).Start(); + _httpService.AddPlugin(); + } + + public static void Stop() + { + if (_httpService.ServerState == ServerState.Running) + { + _httpService.Stop(); + } + } + + protected override void OnGet(ITcpClientBase client, HttpContextEventArgs e) + { + e.Context.Response.FromText(_pacText).Answer(); + base.OnGet(client, e); + } +} \ No newline at end of file diff --git a/clashN/clashN/Handler/SysProxyHandle.cs b/clashN/clashN/Handler/SysProxyHandle.cs index 6139006..fcaef4b 100644 --- a/clashN/clashN/Handler/SysProxyHandle.cs +++ b/clashN/clashN/Handler/SysProxyHandle.cs @@ -75,6 +75,17 @@ namespace clashN.Handler else if (type == ESysProxyType.Unchanged) { } + else if (type == ESysProxyType.Pac) + { + HttpHandler.Start(config); + var strProxy = $"http://127.0.0.1:{config.PacPort}/"; + SetIEProxy(false, strProxy, ""); + } + + if (type != ESysProxyType.Pac) + { + HttpHandler.Stop(); + } } catch (Exception ex) { diff --git a/clashN/clashN/Mode/Config.cs b/clashN/clashN/Mode/Config.cs index e8a6a3a..81563f2 100644 --- a/clashN/clashN/Mode/Config.cs +++ b/clashN/clashN/Mode/Config.cs @@ -1,5 +1,4 @@ -using clashN.Base; -using System.Drawing; +using System.Drawing; using System.Windows.Forms; namespace clashN.Mode @@ -45,6 +44,11 @@ namespace clashN.Mode public bool enableMixinContent { get; set; } + /// + /// Pac监听端口 + /// + public int PacPort { get; set; } + #endregion #region other entities diff --git a/clashN/clashN/Mode/ESysProxyType.cs b/clashN/clashN/Mode/ESysProxyType.cs index dc834eb..ced90e3 100644 --- a/clashN/clashN/Mode/ESysProxyType.cs +++ b/clashN/clashN/Mode/ESysProxyType.cs @@ -5,6 +5,7 @@ namespace clashN.Mode { ForcedClear = 0, ForcedChange = 1, - Unchanged = 2 + Unchanged = 2, + Pac = 3 } } diff --git a/clashN/clashN/Resx/ResUI.Designer.cs b/clashN/clashN/Resx/ResUI.Designer.cs index 61da420..1dabe9d 100644 --- a/clashN/clashN/Resx/ResUI.Designer.cs +++ b/clashN/clashN/Resx/ResUI.Designer.cs @@ -537,6 +537,15 @@ namespace clashN.Resx { } } + /// + /// 查找类似 Pac Mode 的本地化字符串。 + /// + public static string menuSystemProxyPac { + get { + return ResourceManager.GetString("menuSystemProxyPac", resourceCulture); + } + } + /// /// 查找类似 Set system proxy 的本地化字符串。 /// @@ -1420,6 +1429,15 @@ namespace clashN.Resx { } } + /// + /// 查找类似 Pac listen port 的本地化字符串。 + /// + public static string TbSettingsPacListenPort { + get { + return ResourceManager.GetString("TbSettingsPacListenPort", resourceCulture); + } + } + /// /// 查找类似 After modifying the following parameters, click Save to take effect 的本地化字符串。 /// diff --git a/clashN/clashN/Resx/ResUI.resx b/clashN/clashN/Resx/ResUI.resx index 0c4006f..2a32729 100644 --- a/clashN/clashN/Resx/ResUI.resx +++ b/clashN/clashN/Resx/ResUI.resx @@ -640,4 +640,10 @@ Default + + Pac Mode + + + Pac listen port + \ No newline at end of file diff --git a/clashN/clashN/Resx/ResUI.zh-Hans.resx b/clashN/clashN/Resx/ResUI.zh-Hans.resx index 986dbef..f77ba17 100644 --- a/clashN/clashN/Resx/ResUI.zh-Hans.resx +++ b/clashN/clashN/Resx/ResUI.zh-Hans.resx @@ -640,4 +640,13 @@ 默认 + + Pac模式 + + + Pac监听端口号 + + + Pac监听端口号 + \ No newline at end of file diff --git a/clashN/clashN/ViewModels/ConnectionsViewModel.cs b/clashN/clashN/ViewModels/ConnectionsViewModel.cs index 412f189..b4fc5f4 100644 --- a/clashN/clashN/ViewModels/ConnectionsViewModel.cs +++ b/clashN/clashN/ViewModels/ConnectionsViewModel.cs @@ -1,4 +1,3 @@ -using clashN.Base; using clashN.Handler; using clashN.Mode; using DynamicData; diff --git a/clashN/clashN/ViewModels/MainWindowViewModel.cs b/clashN/clashN/ViewModels/MainWindowViewModel.cs index 9e6f800..d5c7b6c 100644 --- a/clashN/clashN/ViewModels/MainWindowViewModel.cs +++ b/clashN/clashN/ViewModels/MainWindowViewModel.cs @@ -1,4 +1,3 @@ -using clashN.Base; using clashN.Handler; using clashN.Mode; using clashN.Views; @@ -53,6 +52,8 @@ namespace clashN.ViewModels public ReactiveCommand SystemProxyClearCmd { get; } public ReactiveCommand SystemProxySetCmd { get; } public ReactiveCommand SystemProxyNothingCmd { get; } + + public ReactiveCommand SystemProxyPacCmd { get; } #endregion #region Rule mode @@ -127,6 +128,10 @@ namespace clashN.ViewModels { SetListenerType(ESysProxyType.Unchanged); });//, this.WhenAnyValue(x => x.BlSystemProxyNothing, y => !y)); + SystemProxyPacCmd = ReactiveCommand.Create(() => + { + SetListenerType(ESysProxyType.Pac); + });//, this.WhenAnyValue(x => x.BlSystemProxyNothing, y => !y)); //Rule mode ModeRuleCmd = ReactiveCommand.Create(() => diff --git a/clashN/clashN/ViewModels/ProfileEditViewModel.cs b/clashN/clashN/ViewModels/ProfileEditViewModel.cs index 5519f87..ad87bd9 100644 --- a/clashN/clashN/ViewModels/ProfileEditViewModel.cs +++ b/clashN/clashN/ViewModels/ProfileEditViewModel.cs @@ -1,4 +1,3 @@ -using clashN.Base; using clashN.Handler; using clashN.Mode; using clashN.Resx; diff --git a/clashN/clashN/ViewModels/ProfilesViewModel.cs b/clashN/clashN/ViewModels/ProfilesViewModel.cs index bbbda04..df91087 100644 --- a/clashN/clashN/ViewModels/ProfilesViewModel.cs +++ b/clashN/clashN/ViewModels/ProfilesViewModel.cs @@ -1,4 +1,3 @@ -using clashN.Base; using clashN.Handler; using clashN.Mode; using clashN.Resx; diff --git a/clashN/clashN/ViewModels/ProxiesViewModel.cs b/clashN/clashN/ViewModels/ProxiesViewModel.cs index 2cc665a..5ed5d46 100644 --- a/clashN/clashN/ViewModels/ProxiesViewModel.cs +++ b/clashN/clashN/ViewModels/ProxiesViewModel.cs @@ -1,4 +1,3 @@ -using clashN.Base; using clashN.Handler; using clashN.Mode; using clashN.Resx; diff --git a/clashN/clashN/ViewModels/SettingsViewModel.cs b/clashN/clashN/ViewModels/SettingsViewModel.cs index efd7993..823a26c 100644 --- a/clashN/clashN/ViewModels/SettingsViewModel.cs +++ b/clashN/clashN/ViewModels/SettingsViewModel.cs @@ -1,4 +1,3 @@ -using clashN.Base; using clashN.Handler; using clashN.Mode; using clashN.Resx; @@ -56,6 +55,8 @@ namespace clashN.ViewModels public string SubConvertUrl { get; set; } public ReactiveCommand SetLoopbackCmd { get; } public ReactiveCommand SetGlobalHotkeyCmd { get; } + [Reactive] + public int PacListenPort { get; set; } #endregion #region System proxy @@ -107,6 +108,7 @@ namespace clashN.ViewModels autoUpdateSubInterval = _config.autoUpdateSubInterval; autoDelayTestInterval = _config.autoDelayTestInterval; SubConvertUrl = _config.constItem.subConvertUrl; + PacListenPort = _config.PacPort; SetLoopbackCmd = ReactiveCommand.Create(() => { Utils.ProcessStart(Utils.GetBinPath("EnableLoopback.exe")); @@ -202,6 +204,7 @@ namespace clashN.ViewModels _config.autoUpdateSubInterval = autoUpdateSubInterval; _config.autoDelayTestInterval = autoDelayTestInterval; _config.constItem.subConvertUrl = SubConvertUrl; + _config.PacPort = PacListenPort; //System proxy _config.systemProxyExceptions = systemProxyExceptions; diff --git a/clashN/clashN/Views/MainWindow.xaml b/clashN/clashN/Views/MainWindow.xaml index 5761df8..3c4b18f 100644 --- a/clashN/clashN/Views/MainWindow.xaml +++ b/clashN/clashN/Views/MainWindow.xaml @@ -242,6 +242,17 @@ + + + + + + + + diff --git a/clashN/clashN/Views/MainWindow.xaml.cs b/clashN/clashN/Views/MainWindow.xaml.cs index a47f94a..af92c20 100644 --- a/clashN/clashN/Views/MainWindow.xaml.cs +++ b/clashN/clashN/Views/MainWindow.xaml.cs @@ -41,6 +41,7 @@ namespace clashN.Views this.OneWayBind(ViewModel, vm => vm.BlSystemProxyNothing, v => v.menuSystemProxyNothing2.Visibility, conversionHint: BooleanToVisibilityHint.UseHidden, vmToViewConverterOverride: new BooleanToVisibilityTypeConverter()).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.SystemProxyClearCmd, v => v.menuSystemProxyClear).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.SystemProxySetCmd, v => v.menuSystemProxySet).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.SystemProxyPacCmd, v => v.menuSystemProxyPac).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.SystemProxyNothingCmd, v => v.menuSystemProxyNothing).DisposeWith(disposables); diff --git a/clashN/clashN/Views/ProxiesView.xaml b/clashN/clashN/Views/ProxiesView.xaml index 4aa0eda..1ca5ae7 100644 --- a/clashN/clashN/Views/ProxiesView.xaml +++ b/clashN/clashN/Views/ProxiesView.xaml @@ -44,6 +44,7 @@ + + @@ -303,17 +304,29 @@ Grid.Column="1" Width="300" Margin="8" /> - + +