From 517ff4c3b3da55c1e8a761df1a36005ef2783f0b Mon Sep 17 00:00:00 2001 From: Space Time Date: Mon, 7 Oct 2024 02:32:10 +0800 Subject: [PATCH] =?UTF-8?q?1.1.1=20->=201.1.2=20=E7=AC=AC47=E6=AC=A1?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Consts/AboutConst.cs | 1 + Consts/MainConst.cs | 12 ++++++++ Preses/MainPres.cs | 14 ++++----- Utils/CommandProc.cs | 3 +- Utils/MihomoProc.cs | 6 ++-- Utils/NginxProc.cs | 16 +++++----- Wins/AboutWin.xaml.cs | 2 +- Wins/MainWin.xaml.cs | 71 +++++++++++++++++++++---------------------- 8 files changed, 70 insertions(+), 55 deletions(-) diff --git a/Consts/AboutConst.cs b/Consts/AboutConst.cs index a904433..af67283 100644 --- a/Consts/AboutConst.cs +++ b/Consts/AboutConst.cs @@ -7,6 +7,7 @@ internal class AboutConst : AboutMultilangConst public static string DeveloperButtonUrl => "https://www.spacetimee.xyz"; public static string VersionButtonVersionContent => Assembly.GetExecutingAssembly().GetName().Version!.ToString().TrimEnd(".0".ToCharArray()); public static string VersionButtonUrl => "https://spacetime.lanzouu.com/b017hp0lc"; + internal static string ReleasePagePassword => "3wnj"; public static string EmailButtonUrl => "Zeus6_6@163.com"; public static string DocumentationButtonUrl => "https://github.com/SpaceTimee/Sheas-Cealer/wiki/Sheas-Cealer-Documentation"; diff --git a/Consts/MainConst.cs b/Consts/MainConst.cs index d62bb13..d6ba6c9 100644 --- a/Consts/MainConst.cs +++ b/Consts/MainConst.cs @@ -14,14 +14,26 @@ internal partial class MainConst : MainMultilangConst public static bool IsAdmin => new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator); internal static string CealingHostPath => Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase!, "Cealing-Host-*.json"); + internal static string LocalHostPath => Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase!, "Cealing-Host-Local.json"); + internal static string UpstreamHostPath => Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase!, "Cealing-Host-Upstream.json"); + internal static string EdgeBrowserRegistryPath => @"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\msedge.exe"; + internal static string ChromeBrowserRegistryPath => @"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\chrome.exe"; + internal static string BraveBrowserRegistryPath => @"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\brave.exe"; + internal static string UncealedBrowserPath => Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase!, "Uncealed-Browser.lnk"); + internal static string UncealedBrowserDescription => "Created By Sheas Cealer"; + internal static string CommandName => "Cmd.exe"; internal static string HostsConfPath => Path.Combine(Registry.LocalMachine.OpenSubKey(@"\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\DataBasePath")?.GetValue("DataBasePath", null)?.ToString() ?? @"C:\Windows\System32\drivers\etc", "hosts"); internal static string HostsConfStartMarker => "# Cealing Nginx Start\n"; internal static string HostsConfEndMarker => "# Cealing Nginx End"; + internal static string NginxPath => Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase!, "Cealing-Nginx.exe"); internal static string NginxConfPath => Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase!, "nginx.conf"); internal static string NginxLogsPath => Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase!, "logs"); internal static string NginxTempPath => Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase!, "Temp"); internal static string NginxCertPath => Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase!, "Cealing-Cert.pem"); + internal static string NginxRootCertSubjectName => "CN=Cealing Cert Root"; + internal static string NginxChildCertSubjectName => "CN=Cealing Cert Child"; internal static string NginxKeyPath => Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase!, "Cealing-Key.pem"); + internal static string MihomoPath => Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase!, "Cealing-Mihomo.exe"); internal static string MihomoConfPath => Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase!, "config.yaml"); internal static string DefaultUpstreamUrl => "https://gitlab.com/SpaceTimee/Cealing-Host/raw/main/Cealing-Host.json"; diff --git a/Preses/MainPres.cs b/Preses/MainPres.cs index 5a473cf..378f892 100644 --- a/Preses/MainPres.cs +++ b/Preses/MainPres.cs @@ -20,9 +20,9 @@ internal partial class MainPres : ObservableObject BrowserPath = browserPathIndex != 0 && browserPathIndex != args.Length ? args[browserPathIndex] : !string.IsNullOrWhiteSpace(Settings.Default.BrowserPath) ? Settings.Default.BrowserPath : - (Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\msedge.exe")?.GetValue(string.Empty, null) ?? - Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\chrome.exe")?.GetValue(string.Empty, null) ?? - Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\brave.exe")?.GetValue(string.Empty, null) ?? + (Registry.LocalMachine.OpenSubKey(MainConst.EdgeBrowserRegistryPath)?.GetValue(string.Empty, null) ?? + Registry.LocalMachine.OpenSubKey(MainConst.ChromeBrowserRegistryPath)?.GetValue(string.Empty, null) ?? + Registry.LocalMachine.OpenSubKey(MainConst.BraveBrowserRegistryPath)?.GetValue(string.Empty, null) ?? string.Empty).ToString()!; UpstreamUrl = upstreamUrlIndex == 0 || upstreamUrlIndex == args.Length ? @@ -82,22 +82,22 @@ internal partial class MainPres : ObservableObject } [ObservableProperty] - private bool isNginxExist = File.Exists(Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase!, "Cealing-Nginx.exe")); + private bool isNginxExist = File.Exists(MainConst.NginxPath); [ObservableProperty] private bool isNginxIniting = false; [ObservableProperty] - private bool isNginxRunning = Process.GetProcessesByName("Cealing-Nginx").Length != 0; + private bool isNginxRunning = Process.GetProcessesByName(Path.GetFileNameWithoutExtension(MainConst.NginxPath)).Length != 0; [ObservableProperty] - private bool isMihomoExist = File.Exists(Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase!, "Cealing-Mihomo.exe")); + private bool isMihomoExist = File.Exists(MainConst.MihomoPath); [ObservableProperty] private bool isMihomoIniting = false; [ObservableProperty] - private bool isMihomoRunning = Process.GetProcessesByName("Cealing-Mihomo").Length != 0; + private bool isMihomoRunning = Process.GetProcessesByName(Path.GetFileNameWithoutExtension(MainConst.MihomoPath)).Length != 0; [ObservableProperty] private bool isFlashing = false; diff --git a/Utils/CommandProc.cs b/Utils/CommandProc.cs index eba3bf8..8dca03f 100644 --- a/Utils/CommandProc.cs +++ b/Utils/CommandProc.cs @@ -1,5 +1,6 @@ using System; using System.Windows; +using Sheas_Cealer.Consts; using SheasCore; namespace Sheas_Cealer.Utils; @@ -8,7 +9,7 @@ internal class CommandProc : Proc { private static bool ShutDownAppOnProcessExit; - internal CommandProc(bool shutDownAppOnProcessExit) : base("Cmd.exe") => ShutDownAppOnProcessExit = shutDownAppOnProcessExit; + internal CommandProc(bool shutDownAppOnProcessExit) : base(MainConst.CommandName) => ShutDownAppOnProcessExit = shutDownAppOnProcessExit; public override void Process_Exited(object sender, EventArgs e) { diff --git a/Utils/MihomoProc.cs b/Utils/MihomoProc.cs index 3000500..1397d66 100644 --- a/Utils/MihomoProc.cs +++ b/Utils/MihomoProc.cs @@ -1,8 +1,10 @@ -using SheasCore; +using System.IO; +using Sheas_Cealer.Consts; +using SheasCore; namespace Sheas_Cealer.Utils; internal class MihomoProc : Proc { - internal MihomoProc() : base("Cealing-Mihomo.exe") { } + internal MihomoProc() : base(Path.GetFileName(MainConst.MihomoPath)) { } } \ No newline at end of file diff --git a/Utils/NginxProc.cs b/Utils/NginxProc.cs index ed48055..d861651 100644 --- a/Utils/NginxProc.cs +++ b/Utils/NginxProc.cs @@ -8,21 +8,21 @@ namespace Sheas_Cealer.Utils; internal class NginxProc : Proc { - internal NginxProc() : base("Cealing-Nginx.exe") { } + internal NginxProc() : base(Path.GetFileName(MainConst.NginxPath)) { } public override void Process_Exited(object sender, EventArgs e) { string hostsContent = File.ReadAllText(MainConst.HostsConfPath); - int cealingNginxStartIndex = hostsContent.IndexOf(MainConst.HostsConfStartMarker); - int cealingNginxEndIndex = hostsContent.LastIndexOf(MainConst.HostsConfEndMarker); + int hostsConfStartIndex = hostsContent.IndexOf(MainConst.HostsConfStartMarker); + int hostsConfEndIndex = hostsContent.LastIndexOf(MainConst.HostsConfEndMarker); - if (cealingNginxStartIndex != -1 && cealingNginxEndIndex != -1) - File.WriteAllText(MainConst.HostsConfPath, hostsContent.Remove(cealingNginxStartIndex, cealingNginxEndIndex - cealingNginxStartIndex + "# Cealing Nginx End".Length)); + if (hostsConfStartIndex != -1 && hostsConfEndIndex != -1) + File.WriteAllText(MainConst.HostsConfPath, hostsContent.Remove(hostsConfStartIndex, hostsConfEndIndex - hostsConfStartIndex + MainConst.HostsConfEndMarker.Length)); using X509Store certStore = new(StoreName.Root, StoreLocation.CurrentUser, OpenFlags.ReadWrite); - foreach (X509Certificate2 cert in certStore.Certificates) - if (cert.Subject == "CN=Cealing Cert Root") - certStore.Remove(cert); + foreach (X509Certificate2 storedCert in certStore.Certificates) + if (storedCert.Subject == MainConst.NginxRootCertSubjectName) + certStore.Remove(storedCert); } } \ No newline at end of file diff --git a/Wins/AboutWin.xaml.cs b/Wins/AboutWin.xaml.cs index c3ba2be..a8425d5 100644 --- a/Wins/AboutWin.xaml.cs +++ b/Wins/AboutWin.xaml.cs @@ -18,7 +18,7 @@ public partial class AboutWin : Window Button? senderButton = sender as Button; if (senderButton == VersionButton) - MessageBox.Show($"{AboutConst._ReleasePagePasswordLabel} 3wnj"); + MessageBox.Show($"{AboutConst._ReleasePagePasswordLabel} {AboutConst.ReleasePagePassword}"); ProcessStartInfo processStartInfo = new(senderButton == EmailButton ? "mailto:" : string.Empty + senderButton!.ToolTip) { UseShellExecute = true }; Process.Start(processStartInfo); diff --git a/Wins/MainWin.xaml.cs b/Wins/MainWin.xaml.cs index 64f23b1..5a2793a 100644 --- a/Wins/MainWin.xaml.cs +++ b/Wins/MainWin.xaml.cs @@ -34,7 +34,7 @@ public partial class MainWin : Window private static readonly HttpClient MainClient = new(new HttpClientHandler() { ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator }); private static DispatcherTimer? HoldButtonTimer; private static readonly DispatcherTimer ProxyTimer = new() { Interval = TimeSpan.FromSeconds(0.1) }; - private static readonly FileSystemWatcher HostWatcher = new(Path.GetDirectoryName(MainConst.CealingHostPath)!, Path.GetFileName(MainConst.CealingHostPath)) { EnableRaisingEvents = true, NotifyFilter = NotifyFilters.LastWrite }; + private static readonly FileSystemWatcher CealingHostWatcher = new(Path.GetDirectoryName(MainConst.CealingHostPath)!, Path.GetFileName(MainConst.CealingHostPath)) { EnableRaisingEvents = true, NotifyFilter = NotifyFilters.LastWrite }; private static readonly FileSystemWatcher NginxConfWatcher = new(Path.GetDirectoryName(MainConst.NginxConfPath)!, Path.GetFileName(MainConst.NginxConfPath)) { EnableRaisingEvents = true, NotifyFilter = NotifyFilters.LastWrite }; private static readonly FileSystemWatcher MihomoConfWatcher = new(Path.GetDirectoryName(MainConst.MihomoConfPath)!, Path.GetFileName(MainConst.MihomoConfPath)) { EnableRaisingEvents = true, NotifyFilter = NotifyFilters.LastWrite }; private static readonly Dictionary hostDomainPairs, string hostSni, string hostIp)>> HostRulesDict = []; @@ -53,7 +53,7 @@ public partial class MainWin : Window DataContext = MainPres = new(args); ProxyTimer.Tick += ProxyTimer_Tick; - HostWatcher.Changed += HostWatcher_Changed; + CealingHostWatcher.Changed += CealingHostWatcher_Changed; NginxConfWatcher.Changed += NginxConfWatcher_Changed; MihomoConfWatcher.Changed += MihomoConfWatcher_Changed; } @@ -67,10 +67,10 @@ public partial class MainWin : Window { ProxyTimer.Start(); - foreach (string hostPath in Directory.GetFiles(HostWatcher.Path, HostWatcher.Filter)) - HostWatcher_Changed(null!, new(new(), Path.GetDirectoryName(hostPath)!, Path.GetFileName(hostPath))); + foreach (string hostPath in Directory.GetFiles(CealingHostWatcher.Path, CealingHostWatcher.Filter)) + CealingHostWatcher_Changed(null!, new(new(), Path.GetDirectoryName(hostPath)!, Path.GetFileName(hostPath))); - MihomoConfWatcher_Changed(null!, new(new(), MihomoConfWatcher.Path, MihomoConfWatcher.Filter)); + MihomoConfWatcher_Changed(null!, null!); }); } private void MainWin_Closing(object sender, CancelEventArgs e) => Application.Current.Shutdown(); @@ -150,9 +150,9 @@ public partial class MainWin : Window if (MessageBox.Show(MainConst._KillBrowserProcessPrompt, string.Empty, MessageBoxButton.YesNo) != MessageBoxResult.Yes) return; - IWshShortcut uncealedBrowserShortcut = (IWshShortcut)new WshShell().CreateShortcut(Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase!, "Uncealed-Browser.lnk")); + IWshShortcut uncealedBrowserShortcut = (IWshShortcut)new WshShell().CreateShortcut(MainConst.UncealedBrowserPath); uncealedBrowserShortcut.TargetPath = MainPres!.BrowserPath; - uncealedBrowserShortcut.Description = "Created By Sheas Cealer"; + uncealedBrowserShortcut.Description = MainConst.UncealedBrowserDescription; uncealedBrowserShortcut.Save(); foreach (Process browserProcess in Process.GetProcessesByName(Path.GetFileNameWithoutExtension(MainPres.BrowserPath))) @@ -194,7 +194,7 @@ public partial class MainWin : Window RSA certKey = RSA.Create(2048); - CertificateRequest rootCertRequest = new("CN=Cealing Cert Root", certKey, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); + CertificateRequest rootCertRequest = new(MainConst.NginxRootCertSubjectName, certKey, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); rootCertRequest.CertificateExtensions.Add(new X509BasicConstraintsExtension(true, false, 0, false)); X509Certificate2 rootCert = rootCertRequest.CreateSelfSigned(DateTimeOffset.UtcNow, DateTimeOffset.UtcNow.AddYears(100)); using X509Store certStore = new(StoreName.Root, StoreLocation.CurrentUser, OpenFlags.ReadWrite); @@ -202,7 +202,7 @@ public partial class MainWin : Window certStore.Add(rootCert); certStore.Close(); - CertificateRequest childCertRequest = new("CN=Cealing Cert Child", certKey, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); + CertificateRequest childCertRequest = new(MainConst.NginxChildCertSubjectName, certKey, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); SubjectAlternativeNameBuilder childCertSanBuilder = new(); string hostsConfAppendContent = MainConst.HostsConfStartMarker; @@ -278,7 +278,7 @@ public partial class MainWin : Window Application.Current.Dispatcher.InvokeShutdown(); } else - foreach (Process nginxProcess in Process.GetProcessesByName("Cealing-Nginx")) + foreach (Process nginxProcess in Process.GetProcessesByName(Path.GetFileNameWithoutExtension(MainConst.NginxPath))) { nginxProcess.Kill(); nginxProcess.WaitForExit(); @@ -351,7 +351,7 @@ public partial class MainWin : Window { Button? senderButton = sender as Button; - string hostPath = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase!, senderButton == EditLocalHostButton ? "Cealing-Host-Local.json" : "Cealing-Host-Upstream.json"); + string hostPath = senderButton == EditLocalHostButton ? MainConst.LocalHostPath : MainConst.UpstreamHostPath; if (!File.Exists(hostPath)) File.Create(hostPath).Dispose(); @@ -373,28 +373,27 @@ public partial class MainWin : Window } private async void UpdateUpstreamHostButton_Click(object sender, RoutedEventArgs e) { - string newUpstreamHostUrl = (MainPres!.UpstreamUrl.StartsWith("http://") || MainPres!.UpstreamUrl.StartsWith("https://") ? string.Empty : "https://") + MainPres!.UpstreamUrl; - string newUpstreamHostString = await Http.GetAsync(newUpstreamHostUrl, MainClient); - string oldUpstreamHostPath = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase!, "Cealing-Host-Upstream.json"); - string oldUpstreamHostString; + string upstreamUpstreamHostUrl = (MainPres!.UpstreamUrl.StartsWith("http://") || MainPres!.UpstreamUrl.StartsWith("https://") ? string.Empty : "https://") + MainPres!.UpstreamUrl; + string upstreamUpstreamHostString = await Http.GetAsync(upstreamUpstreamHostUrl, MainClient); + string localUpstreamHostString; - if (!File.Exists(oldUpstreamHostPath)) - File.Create(oldUpstreamHostPath).Dispose(); + if (!File.Exists(MainConst.UpstreamHostPath)) + File.Create(MainConst.UpstreamHostPath).Dispose(); - oldUpstreamHostString = File.ReadAllText(oldUpstreamHostPath); + localUpstreamHostString = File.ReadAllText(MainConst.UpstreamHostPath); - if (oldUpstreamHostString.Replace("\r", string.Empty) == newUpstreamHostString) + if (localUpstreamHostString.Replace("\r", string.Empty) == upstreamUpstreamHostString) MessageBox.Show(MainConst._UpstreamHostUtdMsg); else { MessageBoxResult overrideOptionResult = MessageBox.Show(MainConst._OverrideUpstreamHostPrompt, string.Empty, MessageBoxButton.YesNoCancel); if (overrideOptionResult == MessageBoxResult.Yes) { - File.WriteAllText(Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase!, "Cealing-Host-Upstream.json"), newUpstreamHostString); + File.WriteAllText(MainConst.UpstreamHostPath, upstreamUpstreamHostString); MessageBox.Show(MainConst._UpdateUpstreamHostSuccessMsg); } else if (overrideOptionResult == MessageBoxResult.No) - Process.Start(new ProcessStartInfo(newUpstreamHostUrl) { UseShellExecute = true }); + Process.Start(new ProcessStartInfo(upstreamUpstreamHostUrl) { UseShellExecute = true }); } } @@ -473,12 +472,12 @@ public partial class MainWin : Window private void ProxyTimer_Tick(object? sender, EventArgs e) { - MainPres!.IsNginxExist = File.Exists(Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase!, "Cealing-Nginx.exe")); - MainPres.IsNginxRunning = Process.GetProcessesByName("Cealing-Nginx").Length != 0; - MainPres.IsMihomoExist = File.Exists(Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase!, "Cealing-Mihomo.exe")); - MainPres.IsMihomoRunning = Process.GetProcessesByName("Cealing-Mihomo").Length != 0; + MainPres!.IsNginxExist = File.Exists(Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase!, Path.GetFileName(MainConst.NginxPath))); + MainPres.IsNginxRunning = Process.GetProcessesByName(Path.GetFileNameWithoutExtension(MainConst.NginxPath)).Length != 0; + MainPres.IsMihomoExist = File.Exists(Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase!, Path.GetFileName(MainConst.MihomoPath))); + MainPres.IsMihomoRunning = Process.GetProcessesByName(Path.GetFileNameWithoutExtension(MainConst.MihomoPath)).Length != 0; } - private void HostWatcher_Changed(object sender, FileSystemEventArgs e) + private void CealingHostWatcher_Changed(object sender, FileSystemEventArgs e) { string hostName = e.Name!.TrimStart("Cealing-Host-".ToCharArray()).TrimEnd(".json".ToCharArray()); @@ -526,9 +525,9 @@ public partial class MainWin : Window cealHostResolverRules += $"MAP {hostSni} {hostIp},"; } - CealArgs = @$"/c @start .\""Uncealed-Browser.lnk"" --host-rules=""{cealHostRules.TrimEnd(',')}"" --host-resolver-rules=""{cealHostResolverRules.TrimEnd(',')}"" --test-type --ignore-certificate-errors"; + CealArgs = @$"/c @start .\""{Path.GetFileName(MainConst.UncealedBrowserPath)}"" --host-rules=""{cealHostRules.TrimEnd(',')}"" --host-resolver-rules=""{cealHostResolverRules.TrimEnd(',')}"" --test-type --ignore-certificate-errors"; - NginxConfWatcher_Changed(null!, new(new(), NginxConfWatcher.Path, NginxConfWatcher.Filter)); + NginxConfWatcher_Changed(null!, null!); } } private void NginxConfWatcher_Changed(object sender, FileSystemEventArgs e) @@ -542,7 +541,7 @@ public partial class MainWin : Window if (!Directory.Exists(MainConst.NginxTempPath)) Directory.CreateDirectory(MainConst.NginxTempPath); - ExtraNginxConfs = File.ReadAllText(e.FullPath); + ExtraNginxConfs = File.ReadAllText(MainConst.NginxConfPath); int ruleIndex = 1; NginxConfs = NginxConfig.Load(ExtraNginxConfs) @@ -580,23 +579,23 @@ public partial class MainWin : Window if (!File.Exists(MainConst.MihomoConfPath)) File.Create(MainConst.MihomoConfPath).Dispose(); - ExtraMihomoConfs = File.ReadAllText(e.FullPath); + ExtraMihomoConfs = File.ReadAllText(MainConst.MihomoConfPath); - Dictionary mihomoConfs = new DeserializerBuilder() + Dictionary mihomoConfDict = new DeserializerBuilder() .WithNamingConvention(HyphenatedNamingConvention.Instance) .IgnoreUnmatchedProperties() .Build() .Deserialize>(ExtraMihomoConfs) ?? []; - mihomoConfs["mixed-port"] = 7880; - mihomoConfs["dns"] = new + mihomoConfDict["mixed-port"] = 7880; + mihomoConfDict["dns"] = new { enable = true, listen = ":53", enhancedMode = "redir-host", - nameserver = new[] { "https://doh.apad.pro/dns-query" } + nameserver = new[] { "https://doh.apad.pro/dns-query", "https://ns.net.kg/dns-query" } }; - mihomoConfs["tun"] = new + mihomoConfDict["tun"] = new { enable = true, stack = "system", @@ -605,7 +604,7 @@ public partial class MainWin : Window dnsHijack = new[] { "any:53", "tcp://any:53" } }; - MihomoConfs = new SerializerBuilder().WithNamingConvention(HyphenatedNamingConvention.Instance).Build().Serialize(mihomoConfs); + MihomoConfs = new SerializerBuilder().WithNamingConvention(HyphenatedNamingConvention.Instance).Build().Serialize(mihomoConfDict); } } private void MainWin_KeyDown(object sender, KeyEventArgs e)