From dedd5b197c11607c28cffaabbb231fd85e21db6e Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 24 Apr 2023 11:55:26 +0800 Subject: [PATCH] DNS independent setting, V2ray and Sing-box --- v2rayN/v2rayN/App.xaml | 2 +- v2rayN/v2rayN/Handler/ConfigHandler.cs | 44 +++++++ v2rayN/v2rayN/Handler/CoreConfigSingbox.cs | 15 ++- v2rayN/v2rayN/Handler/CoreConfigV2ray.cs | 13 +- v2rayN/v2rayN/Handler/LazyConfig.cs | 11 ++ v2rayN/v2rayN/Mode/Config.cs | 8 -- v2rayN/v2rayN/Mode/DNSItem.cs | 19 +++ v2rayN/v2rayN/Mode/SingboxConfig.cs | 2 +- v2rayN/v2rayN/Resx/ResUI.Designer.cs | 49 ++++--- v2rayN/v2rayN/Resx/ResUI.fa-Ir.resx | 8 +- v2rayN/v2rayN/Resx/ResUI.resx | 19 +-- v2rayN/v2rayN/Resx/ResUI.ru.resx | 8 +- v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 19 +-- .../v2rayN/ViewModels/DNSSettingViewModel.cs | 85 +++++++++++++ .../v2rayN/ViewModels/MainWindowViewModel.cs | 17 ++- .../ViewModels/OptionSettingViewModel.cs | 31 ----- v2rayN/v2rayN/Views/DNSSettingWindow.xaml | 120 ++++++++++++++++++ v2rayN/v2rayN/Views/DNSSettingWindow.xaml.cs | 52 ++++++++ v2rayN/v2rayN/Views/MainWindow.xaml | 4 + v2rayN/v2rayN/Views/MainWindow.xaml.cs | 1 + v2rayN/v2rayN/Views/OptionSettingWindow.xaml | 42 ------ .../v2rayN/Views/OptionSettingWindow.xaml.cs | 15 +-- 22 files changed, 429 insertions(+), 155 deletions(-) create mode 100644 v2rayN/v2rayN/Mode/DNSItem.cs create mode 100644 v2rayN/v2rayN/ViewModels/DNSSettingViewModel.cs create mode 100644 v2rayN/v2rayN/Views/DNSSettingWindow.xaml create mode 100644 v2rayN/v2rayN/Views/DNSSettingWindow.xaml.cs diff --git a/v2rayN/v2rayN/App.xaml b/v2rayN/v2rayN/App.xaml index ad8f5d4a..a5bafb0d 100644 --- a/v2rayN/v2rayN/App.xaml +++ b/v2rayN/v2rayN/App.xaml @@ -1,9 +1,9 @@  diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index c931f317..b2ce318e 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -1553,5 +1553,49 @@ namespace v2rayN.Handler } #endregion Routing + + #region DNS + + public static int InitBuiltinDNS(Config config) + { + var items = LazyConfig.Instance.DNSItems(); + if (items.Count <= 0) + { + var item = new DNSItem() + { + remarks = "V2ray", + coreType = ECoreType.Xray, + }; + SaveDNSItems(config, item); + + var item2 = new DNSItem() + { + remarks = "sing-box", + coreType = ECoreType.sing_box, + }; + SaveDNSItems(config, item2); + } + + return 0; + } + + public static int SaveDNSItems(Config config, DNSItem item) + { + if (Utils.IsNullOrEmpty(item.id)) + { + item.id = Utils.GetGUID(false); + } + + if (SqliteHelper.Instance.Replace(item) > 0) + { + return 0; + } + else + { + return -1; + } + } + + #endregion DNS } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Handler/CoreConfigSingbox.cs b/v2rayN/v2rayN/Handler/CoreConfigSingbox.cs index 08a5a7ea..adb5d522 100644 --- a/v2rayN/v2rayN/Handler/CoreConfigSingbox.cs +++ b/v2rayN/v2rayN/Handler/CoreConfigSingbox.cs @@ -50,7 +50,7 @@ namespace v2rayN.Handler routing(singboxConfig); - //dns(singboxConfig); + dns(singboxConfig); //statistic(singboxConfig); @@ -497,7 +497,18 @@ namespace v2rayN.Handler { try { - //singboxConfig.dns = new(); + var item = LazyConfig.Instance.GetDNSItem(ECoreType.sing_box); + var normalDNS = item?.normalDNS; + if (string.IsNullOrWhiteSpace(normalDNS)) + { + return 0; + } + + var obj = Utils.ParseJson(normalDNS); + if (obj?.ContainsKey("servers") == true) + { + singboxConfig.dns = obj; + } } catch (Exception ex) { diff --git a/v2rayN/v2rayN/Handler/CoreConfigV2ray.cs b/v2rayN/v2rayN/Handler/CoreConfigV2ray.cs index 57815f05..8a8d452f 100644 --- a/v2rayN/v2rayN/Handler/CoreConfigV2ray.cs +++ b/v2rayN/v2rayN/Handler/CoreConfigV2ray.cs @@ -684,20 +684,23 @@ namespace v2rayN.Handler { try { - if (string.IsNullOrWhiteSpace(_config.remoteDNS)) + var item = LazyConfig.Instance.GetDNSItem(ECoreType.Xray); + var normalDNS = item?.normalDNS; + var domainStrategy4Freedom = item?.domainStrategy4Freedom; + if (string.IsNullOrWhiteSpace(normalDNS)) { return 0; } //Outbound Freedom domainStrategy - if (!string.IsNullOrWhiteSpace(_config.domainStrategy4Freedom)) + if (!string.IsNullOrWhiteSpace(domainStrategy4Freedom)) { var outbound = v2rayConfig.outbounds[1]; - outbound.settings.domainStrategy = _config.domainStrategy4Freedom; + outbound.settings.domainStrategy = domainStrategy4Freedom; outbound.settings.userLevel = 0; } - var obj = Utils.ParseJson(_config.remoteDNS); + var obj = Utils.ParseJson(normalDNS); if (obj?.ContainsKey("servers") == true) { v2rayConfig.dns = obj; @@ -706,7 +709,7 @@ namespace v2rayN.Handler { List servers = new(); - string[] arrDNS = _config.remoteDNS.Split(','); + string[] arrDNS = normalDNS.Split(','); foreach (string str in arrDNS) { //if (Utils.IsIP(str)) diff --git a/v2rayN/v2rayN/Handler/LazyConfig.cs b/v2rayN/v2rayN/Handler/LazyConfig.cs index 41f78b75..6c7e124a 100644 --- a/v2rayN/v2rayN/Handler/LazyConfig.cs +++ b/v2rayN/v2rayN/Handler/LazyConfig.cs @@ -18,6 +18,7 @@ namespace v2rayN.Handler SqliteHelper.Instance.CreateTable(); SqliteHelper.Instance.CreateTable(); SqliteHelper.Instance.CreateTable(); + SqliteHelper.Instance.CreateTable(); } #region Config @@ -138,6 +139,16 @@ namespace v2rayN.Handler return SqliteHelper.Instance.Table().FirstOrDefault(it => it.locked == false && it.id == id); } + public List DNSItems() + { + return SqliteHelper.Instance.Table().ToList(); + } + + public DNSItem GetDNSItem(ECoreType eCoreType) + { + return SqliteHelper.Instance.Table().FirstOrDefault(it => it.coreType == eCoreType); + } + #endregion Config #region Core Type diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index 0381ab53..978508e8 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -10,14 +10,6 @@ public string indexId { get; set; } public string subIndexId { get; set; } - - public string remoteDNS { get; set; } - - /// - /// Outbound Freedom domainStrategy - /// - public string domainStrategy4Freedom { get; set; } - public ESysProxyType sysProxyType { get; set; } public string systemProxyExceptions { get; set; } public string systemProxyAdvancedProtocol { get; set; } diff --git a/v2rayN/v2rayN/Mode/DNSItem.cs b/v2rayN/v2rayN/Mode/DNSItem.cs new file mode 100644 index 00000000..bf21822b --- /dev/null +++ b/v2rayN/v2rayN/Mode/DNSItem.cs @@ -0,0 +1,19 @@ +using SQLite; + +namespace v2rayN.Mode +{ + [Serializable] + public class DNSItem + { + [PrimaryKey] + public string id { get; set; } + + public string remarks { get; set; } + public bool enabled { get; set; } = true; + public ECoreType coreType { get; set; } + public string? normalDNS { get; set; } + public string? directDNS { get; set; } + public string? proxyDNS { get; set; } + public string? domainStrategy4Freedom { get; set; } + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Mode/SingboxConfig.cs b/v2rayN/v2rayN/Mode/SingboxConfig.cs index e82b8e6d..0ed7852a 100644 --- a/v2rayN/v2rayN/Mode/SingboxConfig.cs +++ b/v2rayN/v2rayN/Mode/SingboxConfig.cs @@ -3,7 +3,7 @@ public class SingboxConfig { public Log4Sbox log { get; set; } - public Dns4Sbox dns { get; set; } + public object dns { get; set; } public List inbounds { get; set; } public List outbounds { get; set; } public Route4Sbox route { get; set; } diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index d4c1acf9..8b4bb1cb 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -690,6 +690,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 DNS Settings 的本地化字符串。 + /// + public static string menuDNSSetting { + get { + return ResourceManager.GetString("menuDNSSetting", resourceCulture); + } + } + /// /// 查找类似 Edit Server (Ctrl+D) 的本地化字符串。 /// @@ -717,15 +726,6 @@ namespace v2rayN.Resx { } } - /// - /// 查找类似 Export selected server for server configuration 的本地化字符串。 - /// - public static string menuExport2ServerConfig { - get { - return ResourceManager.GetString("menuExport2ServerConfig", resourceCulture); - } - } - /// /// 查找类似 Export share URLs to clipboard (Ctrl+C) 的本地化字符串。 /// @@ -1698,15 +1698,6 @@ namespace v2rayN.Resx { } } - /// - /// 查找类似 The server configuration file is saved at: {0} 的本地化字符串。 - /// - public static string SaveServerConfigurationIn { - get { - return ResourceManager.GetString("SaveServerConfigurationIn", resourceCulture); - } - } - /// /// 查找类似 {0}:{1}/s↑ | {2}/s↓ 的本地化字符串。 /// @@ -1934,7 +1925,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Support DnsObject 的本地化字符串。 + /// 查找类似 Support DnsObject, Click to view the document 的本地化字符串。 /// public static string TbDnsObjectDoc { get { @@ -1942,6 +1933,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Please fill in DNS Structure, Click to view the document 的本地化字符串。 + /// + public static string TbDnsSingboxObjectDoc { + get { + return ResourceManager.GetString("TbDnsSingboxObjectDoc", resourceCulture); + } + } + /// /// 查找类似 Domain Matcher 的本地化字符串。 /// @@ -2321,7 +2321,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Core: DNS settings 的本地化字符串。 + /// 查找类似 V2ray DNS settings 的本地化字符串。 /// public static string TbSettingsCoreDns { get { @@ -2329,6 +2329,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Sing-box DNS settings 的本地化字符串。 + /// + public static string TbSettingsCoreDnsSingbox { + get { + return ResourceManager.GetString("TbSettingsCoreDnsSingbox", resourceCulture); + } + } + /// /// 查找类似 Core: KCP settings 的本地化字符串。 /// diff --git a/v2rayN/v2rayN/Resx/ResUI.fa-Ir.resx b/v2rayN/v2rayN/Resx/ResUI.fa-Ir.resx index eff32dc3..6e5d989e 100644 --- a/v2rayN/v2rayN/Resx/ResUI.fa-Ir.resx +++ b/v2rayN/v2rayN/Resx/ResUI.fa-Ir.resx @@ -300,9 +300,6 @@ The client configuration file is saved at: {0} - - The server configuration file is saved at: {0} - Start service ({0})... @@ -553,9 +550,6 @@ سرور انتخابی را برای پیکربندی کلاینت صادر کنید - - سرور انتخاب شده را برای پیکربندی سرور صادر کنید - URL های اشتراک گذاری را به کلیپ بورد صادر کنید (Ctrl+C) @@ -731,7 +725,7 @@ هسته: تنظیمات اولیه - هسته: تنظیمات DNS + V2ray DNS settings هسته: تنظیمات KCP diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index 23bcb084..51dccee8 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -300,9 +300,6 @@ The client configuration file is saved at: {0} - - The server configuration file is saved at: {0} - Start service ({0})... @@ -553,9 +550,6 @@ Export selected server for client configuration - - Export selected server for server configuration - Export share URLs to clipboard (Ctrl+C) @@ -731,7 +725,7 @@ Core: basic settings - Core: DNS settings + V2ray DNS settings Core: KCP settings @@ -953,7 +947,7 @@ Ruleobject Doc - Support DnsObject + Support DnsObject, Click to view the document Group please leave blank here @@ -1120,4 +1114,13 @@ Please leave blank if no conversion is required + + DNS Settings + + + Sing-box DNS settings + + + Please fill in DNS Structure, Click to view the document + \ No newline at end of file diff --git a/v2rayN/v2rayN/Resx/ResUI.ru.resx b/v2rayN/v2rayN/Resx/ResUI.ru.resx index 654071af..c6ef7309 100644 --- a/v2rayN/v2rayN/Resx/ResUI.ru.resx +++ b/v2rayN/v2rayN/Resx/ResUI.ru.resx @@ -300,9 +300,6 @@ Файл конфигурации клиента сохранен по адресу: {0} - - Файл конфигурации сервера сохранен по адресу: {0} - Запуск сервиса ({0})... @@ -553,9 +550,6 @@ Экспортировать выбранный сервер для клиента - - Экспортировать выбранный сервер для сервера - Экспорт URL-адресов общего доступа в буфер обмена (Ctrl+C) @@ -731,7 +725,7 @@ Ядро: базовые настройки - Ядро: настройки DNS + V2ray DNS settings Ядро: настройки KCP diff --git a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx index bcd876e0..bf0dec58 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -300,9 +300,6 @@ 客户端配置文件保存在:{0} - - 服务端配置文件保存在:{0} - 启动服务({0})... @@ -553,9 +550,6 @@ 导出所选服务器为客户端配置 - - 导出所选服务器为服务端配置 - 批量导出分享URL至剪贴板(多选) (Ctrl+C) @@ -731,7 +725,7 @@ Core: 基础设置 - Core: DNS设置 + V2ray DNS设置 Core: KCP设置 @@ -953,7 +947,7 @@ 规则详细说明文档 - 支持填写DnsObject,JSON格式 + 支持填写DnsObject,JSON格式,点击查看文档 普通分组此处请留空 @@ -1117,4 +1111,13 @@ 不需要转换时请留空 + + DNS设置 + + + Sing-box DNS设置 + + + 请填写 DNS JSON 结构,点击查看文档 + \ No newline at end of file diff --git a/v2rayN/v2rayN/ViewModels/DNSSettingViewModel.cs b/v2rayN/v2rayN/ViewModels/DNSSettingViewModel.cs new file mode 100644 index 00000000..2ada5dbc --- /dev/null +++ b/v2rayN/v2rayN/ViewModels/DNSSettingViewModel.cs @@ -0,0 +1,85 @@ +using ReactiveUI; +using ReactiveUI.Fody.Helpers; +using Splat; +using System.Reactive; +using System.Windows; +using v2rayN.Handler; +using v2rayN.Mode; +using v2rayN.Resx; + +namespace v2rayN.ViewModels +{ + public class DNSSettingViewModel : ReactiveObject + { + private static Config _config; + private NoticeHandler? _noticeHandler; + private Window _view; + + [Reactive] public string domainStrategy4Freedom { get; set; } + [Reactive] public string normalDNS { get; set; } + [Reactive] public string normalDNS2 { get; set; } + + public ReactiveCommand SaveCmd { get; } + + public DNSSettingViewModel(Window view) + { + _config = LazyConfig.Instance.GetConfig(); + _noticeHandler = Locator.Current.GetService(); + _view = view; + + var item = LazyConfig.Instance.GetDNSItem(ECoreType.Xray); + domainStrategy4Freedom = item?.domainStrategy4Freedom!; + normalDNS = item?.normalDNS!; + + var item2 = LazyConfig.Instance.GetDNSItem(ECoreType.sing_box); + normalDNS2 = item2?.normalDNS!; + + SaveCmd = ReactiveCommand.Create(() => + { + SaveSetting(); + }); + + Utils.SetDarkBorder(view, _config.uiItem.colorModeDark); + } + + private void SaveSetting() + { + if (!Utils.IsNullOrEmpty(normalDNS)) + { + var obj = Utils.ParseJson(normalDNS); + if (obj != null && obj.ContainsKey("servers") == true) + { + } + else + { + if (normalDNS.Contains("{") || normalDNS.Contains("}")) + { + UI.Show(ResUI.FillCorrectDNSText); + return; + } + } + } + if (!Utils.IsNullOrEmpty(normalDNS2)) + { + var obj2 = Utils.ParseJson(normalDNS2); + if (obj2 == null || obj2.ContainsKey("servers") == false) + { + UI.Show(ResUI.FillCorrectDNSText); + return; + } + } + + var item = LazyConfig.Instance.GetDNSItem(ECoreType.Xray); + item.domainStrategy4Freedom = domainStrategy4Freedom; + item.normalDNS = normalDNS; + ConfigHandler.SaveDNSItems(_config, item); + + var item2 = LazyConfig.Instance.GetDNSItem(ECoreType.sing_box); + item2.normalDNS = Utils.ToJson(Utils.ParseJson(normalDNS2)); + ConfigHandler.SaveDNSItems(_config, item2); + + _noticeHandler?.Enqueue(ResUI.OperationSuccess); + _view.DialogResult = true; + } + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs b/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs index 58d04456..df67105c 100644 --- a/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs +++ b/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs @@ -137,6 +137,7 @@ namespace v2rayN.ViewModels public ReactiveCommand OptionSettingCmd { get; } public ReactiveCommand RoutingSettingCmd { get; } + public ReactiveCommand DNSSettingCmd { get; } public ReactiveCommand GlobalHotkeySettingCmd { get; } public ReactiveCommand RebootAsAdminCmd { get; } public ReactiveCommand ClearServerStatisticsCmd { get; } @@ -417,7 +418,7 @@ namespace v2rayN.ViewModels Export2ClientConfigCmd = ReactiveCommand.Create(() => { Export2ClientConfig(); - }, canEditRemove); + }, canEditRemove); Export2ShareUrlCmd = ReactiveCommand.Create(() => { Export2ShareUrl(); @@ -462,6 +463,10 @@ namespace v2rayN.ViewModels { RoutingSetting(); }); + DNSSettingCmd = ReactiveCommand.Create(() => + { + DNSSetting(); + }); GlobalHotkeySettingCmd = ReactiveCommand.Create(() => { if ((new GlobalHotkeySettingWindow()).ShowDialog() == true) @@ -551,7 +556,7 @@ namespace v2rayN.ViewModels private void Init() { ConfigHandler.InitBuiltinRouting(ref _config); - //MainFormHandler.Instance.BackupGuiNConfig(_config, true); + ConfigHandler.InitBuiltinDNS(_config); _coreHandler = new CoreHandler(UpdateHandler); if (_config.guiItem.enableStatistics) @@ -1347,6 +1352,14 @@ namespace v2rayN.ViewModels Reload(); } } + private void DNSSetting() + { + var ret = (new DNSSettingWindow()).ShowDialog(); + if (ret == true) + { + Reload(); + } + } private void RebootAsAdmin() { diff --git a/v2rayN/v2rayN/ViewModels/OptionSettingViewModel.cs b/v2rayN/v2rayN/ViewModels/OptionSettingViewModel.cs index e6d5cfac..2c763d46 100644 --- a/v2rayN/v2rayN/ViewModels/OptionSettingViewModel.cs +++ b/v2rayN/v2rayN/ViewModels/OptionSettingViewModel.cs @@ -34,13 +34,6 @@ namespace v2rayN.ViewModels #endregion Core - #region Core DNS - - [Reactive] public string domainStrategy4Freedom { get; set; } - [Reactive] public string remoteDNS { get; set; } - - #endregion Core DNS - #region Core KCP //[Reactive] public int Kcpmtu { get; set; } @@ -141,13 +134,6 @@ namespace v2rayN.ViewModels #endregion Core - #region Core DNS - - domainStrategy4Freedom = _config.domainStrategy4Freedom; - remoteDNS = _config.remoteDNS; - - #endregion Core DNS - #region Core KCP //Kcpmtu = _config.kcpItem.mtu; @@ -282,19 +268,6 @@ namespace v2rayN.ViewModels return; } - var obj = Utils.ParseJson(remoteDNS); - if (obj?.ContainsKey("servers") == true) - { - } - else - { - if (remoteDNS.Contains("{") || remoteDNS.Contains("}")) - { - UI.Show(ResUI.FillCorrectDNSText); - return; - } - } - //if (Utils.IsNullOrEmpty(Kcpmtu.ToString()) || !Utils.IsNumberic(Kcpmtu.ToString()) // || Utils.IsNullOrEmpty(Kcptti.ToString()) || !Utils.IsNumberic(Kcptti.ToString()) // || Utils.IsNullOrEmpty(KcpuplinkCapacity.ToString()) || !Utils.IsNumberic(KcpuplinkCapacity.ToString()) @@ -326,10 +299,6 @@ namespace v2rayN.ViewModels _config.coreBasicItem.defFingerprint = defFingerprint; _config.coreBasicItem.defUserAgent = defUserAgent; - //DNS - _config.remoteDNS = remoteDNS; - _config.domainStrategy4Freedom = domainStrategy4Freedom; - //Kcp //_config.kcpItem.mtu = Kcpmtu; //_config.kcpItem.tti = Kcptti; diff --git a/v2rayN/v2rayN/Views/DNSSettingWindow.xaml b/v2rayN/v2rayN/Views/DNSSettingWindow.xaml new file mode 100644 index 00000000..d098a60d --- /dev/null +++ b/v2rayN/v2rayN/Views/DNSSettingWindow.xaml @@ -0,0 +1,120 @@ + + + + + + + +