diff --git a/db/ConfigBuilder.cpp b/db/ConfigBuilder.cpp index 4dd2a8d..ffaa181 100644 --- a/db/ConfigBuilder.cpp +++ b/db/ConfigBuilder.cpp @@ -131,11 +131,11 @@ namespace NekoRay { #define DOMAIN_USER_RULE \ for (const auto &line: SplitLinesSkipSharp(dataStore->routing->proxy_domain)) { \ - if (dataStore->dns_routing) status->domainListDNSRemote += line; \ + if (dataStore->routing->dns_routing) status->domainListDNSRemote += line; \ status->domainListRemote += line; \ } \ for (const auto &line: SplitLinesSkipSharp(dataStore->routing->direct_domain)) { \ - if (dataStore->dns_routing) status->domainListDNSDirect += line; \ + if (dataStore->routing->dns_routing) status->domainListDNSDirect += line; \ status->domainListDirect += line; \ } \ for (const auto &line: SplitLinesSkipSharp(dataStore->routing->block_domain)) { \ @@ -166,7 +166,7 @@ namespace NekoRay { : QJsonArray{"http", "tls", "quic"}}, {"enabled", true}, {"metadataOnly", false}, - {"routeOnly", dataStore->sniffing_mode == SniffingMode::FOR_ROUTING}, + {"routeOnly", dataStore->routing->sniffing_mode == SniffingMode::FOR_ROUTING}, }; // socks-in @@ -177,7 +177,7 @@ namespace NekoRay { inboundObj["listen"] = dataStore->inbound_address; inboundObj["port"] = dataStore->inbound_socks_port; QJsonObject socksSettings = {{"udp", true}}; - if (dataStore->fake_dns || dataStore->sniffing_mode != SniffingMode::DISABLE) { + if (dataStore->fake_dns || dataStore->routing->sniffing_mode != SniffingMode::DISABLE) { inboundObj["sniffing"] = sniffing; } if (dataStore->inbound_auth->NeedAuth()) { @@ -199,7 +199,7 @@ namespace NekoRay { inboundObj["protocol"] = "http"; inboundObj["listen"] = dataStore->inbound_address; inboundObj["port"] = dataStore->inbound_http_port; - if (dataStore->sniffing_mode != SniffingMode::DISABLE) { + if (dataStore->routing->sniffing_mode != SniffingMode::DISABLE) { inboundObj["sniffing"] = sniffing; } if (dataStore->inbound_auth->NeedAuth()) { @@ -274,13 +274,13 @@ namespace NekoRay { // Remote or FakeDNS QJsonObject dnsServerRemote; - dnsServerRemote["address"] = dataStore->fake_dns ? "fakedns" : dataStore->remote_dns; + dnsServerRemote["address"] = dataStore->fake_dns ? "fakedns" : dataStore->routing->remote_dns; dnsServerRemote["domains"] = QList2QJsonArray(status->domainListDNSRemote); - dnsServerRemote["queryStrategy"] = dataStore->remote_dns_strategy; + dnsServerRemote["queryStrategy"] = dataStore->routing->remote_dns_strategy; if (!status->forTest) dnsServers += dnsServerRemote; // Direct - auto directDnsAddress = dataStore->direct_dns; + auto directDnsAddress = dataStore->routing->direct_dns; if (directDnsAddress.contains("://")) { auto directDnsIp = SubStrBefore(SubStrAfter(directDnsAddress, "://"), "/"); if (IsIpAddress(directDnsIp)) { @@ -306,18 +306,22 @@ namespace NekoRay { dnsServers += QJsonObject{ {"address", directDnsAddress.replace("https://", "https+local://")}, {"fallbackStrategy", "disabled"}, - {"queryStrategy", dataStore->direct_dns_strategy}, + {"queryStrategy", dataStore->routing->direct_dns_strategy}, {"domains", QList2QJsonArray(status->domainListDNSDirect)}, }; dns["fallbackStrategy"] = "disabled_if_any_match"; dns["servers"] = dnsServers; dns["tag"] = "dns"; + + if (dataStore->routing->use_dns_object) { + dns = QString2QJsonObject(dataStore->routing->dns_object); + } status->result->coreConfig.insert("dns", dns); // Routing QJsonObject routing; - routing["domainStrategy"] = dataStore->domain_strategy; + routing["domainStrategy"] = dataStore->routing->domain_strategy; routing["domainMatcher"] = "mph"; if (status->forTest) routing["domainStrategy"] = "AsIs"; @@ -627,7 +631,7 @@ namespace NekoRay { // common if (IS_NEKO_BOX) { // apply domain_strategy - outbound["domain_strategy"] = dataStore->outbound_domain_strategy; + outbound["domain_strategy"] = dataStore->routing->outbound_domain_strategy; // apply mux if (!muxApplied && needMux) { auto muxObj = QJsonObject{ @@ -640,7 +644,7 @@ namespace NekoRay { } } else { // apply domain_strategy - if (!status->forTest) outbound["domainStrategy"] = dataStore->outbound_domain_strategy; + if (!status->forTest) outbound["domainStrategy"] = dataStore->routing->outbound_domain_strategy; // apply mux if (!muxApplied && needMux) { auto muxObj = QJsonObject{ @@ -695,9 +699,9 @@ namespace NekoRay { inboundObj["type"] = "mixed"; inboundObj["listen"] = dataStore->inbound_address; inboundObj["listen_port"] = dataStore->inbound_socks_port; - if (dataStore->sniffing_mode != SniffingMode::DISABLE) { + if (dataStore->routing->sniffing_mode != SniffingMode::DISABLE) { inboundObj["sniff"] = true; - inboundObj["sniff_override_destination"] = dataStore->sniffing_mode == SniffingMode::FOR_DESTINATION; + inboundObj["sniff_override_destination"] = dataStore->routing->sniffing_mode == SniffingMode::FOR_DESTINATION; } if (dataStore->inbound_auth->NeedAuth()) { inboundObj["users"] = QJsonArray{ @@ -707,7 +711,7 @@ namespace NekoRay { }, }; } - inboundObj["domain_strategy"] = dataStore->domain_strategy; + inboundObj["domain_strategy"] = dataStore->routing->domain_strategy; status->inbounds += inboundObj; } @@ -724,11 +728,11 @@ namespace NekoRay { inboundObj["strict_route"] = dataStore->vpn_strict_route; inboundObj["inet4_address"] = "172.19.0.1/28"; if (dataStore->vpn_ipv6) inboundObj["inet4_address"] = "fdfe:dcba:9876::1/126"; - if (dataStore->sniffing_mode != SniffingMode::DISABLE) { + if (dataStore->routing->sniffing_mode != SniffingMode::DISABLE) { inboundObj["sniff"] = true; - inboundObj["sniff_override_destination"] = dataStore->sniffing_mode == SniffingMode::FOR_DESTINATION; + inboundObj["sniff_override_destination"] = dataStore->routing->sniffing_mode == SniffingMode::FOR_DESTINATION; } - inboundObj["domain_strategy"] = dataStore->domain_strategy; + inboundObj["domain_strategy"] = dataStore->routing->domain_strategy; status->inbounds += inboundObj; } @@ -831,19 +835,19 @@ namespace NekoRay { dnsServers += QJsonObject{ {"tag", "dns-remote"}, {"address_resolver", "dns-local"}, - {"strategy", dataStore->remote_dns_strategy}, - {"address", dataStore->remote_dns}, + {"strategy", dataStore->routing->remote_dns_strategy}, + {"address", dataStore->routing->remote_dns}, {"detour", tagProxy}, }; // Direct - auto directDNSAddress = dataStore->direct_dns; + auto directDNSAddress = dataStore->routing->direct_dns; if (directDNSAddress == "localhost") directDNSAddress = BOX_UNDERLYING_DNS_EXPORT; if (!status->forTest) dnsServers += QJsonObject{ {"tag", "dns-direct"}, {"address_resolver", "dns-local"}, - {"strategy", dataStore->direct_dns_strategy}, + {"strategy", dataStore->routing->direct_dns_strategy}, {"address", directDNSAddress.replace("+local://", "://")}, {"detour", "direct"}, }; @@ -868,6 +872,10 @@ namespace NekoRay { dns["servers"] = dnsServers; dns["rules"] = dnsRules; + + if (dataStore->routing->use_dns_object) { + dns = QString2QJsonObject(dataStore->routing->dns_object); + } status->result->coreConfig.insert("dns", dns); // Routing diff --git a/main/NekoRay.cpp b/main/NekoRay.cpp index 9e9077e..9c14e41 100644 --- a/main/NekoRay.cpp +++ b/main/NekoRay.cpp @@ -32,17 +32,9 @@ namespace NekoRay { _add(new configItem("inbound_socks_port", &inbound_socks_port, itemType::integer)); _add(new configItem("inbound_http_port", &inbound_http_port, itemType::integer)); _add(new configItem("log_level", &log_level, itemType::string)); - _add(new configItem("remote_dns", &remote_dns, itemType::string)); - _add(new configItem("remote_dns_strategy", &remote_dns_strategy, itemType::string)); - _add(new configItem("direct_dns", &direct_dns, itemType::string)); - _add(new configItem("direct_dns_strategy", &direct_dns_strategy, itemType::string)); - _add(new configItem("domain_strategy", &domain_strategy, itemType::string)); - _add(new configItem("outbound_domain_strategy", &outbound_domain_strategy, itemType::string)); - _add(new configItem("sniffing_mode", &sniffing_mode, itemType::integer)); _add(new configItem("mux_protocol", &mux_protocol, itemType::string)); _add(new configItem("mux_concurrency", &mux_concurrency, itemType::integer)); _add(new configItem("traffic_loop_interval", &traffic_loop_interval, itemType::integer)); - _add(new configItem("dns_routing", &dns_routing, itemType::boolean)); _add(new configItem("test_concurrent", &test_concurrent, itemType::integer)); _add(new configItem("theme", &theme, itemType::string)); _add(new configItem("custom_inbound", &custom_inbound, itemType::string)); @@ -127,16 +119,29 @@ namespace NekoRay { _add(new configItem("block_domain", &this->block_domain, itemType::string)); _add(new configItem("def_outbound", &this->def_outbound, itemType::string)); _add(new configItem("custom", &this->custom, itemType::string)); + // + _add(new configItem("remote_dns", &this->remote_dns, itemType::string)); + _add(new configItem("remote_dns_strategy", &this->remote_dns_strategy, itemType::string)); + _add(new configItem("direct_dns", &this->direct_dns, itemType::string)); + _add(new configItem("direct_dns_strategy", &this->direct_dns_strategy, itemType::string)); + _add(new configItem("domain_strategy", &this->domain_strategy, itemType::string)); + _add(new configItem("outbound_domain_strategy", &this->outbound_domain_strategy, itemType::string)); + _add(new configItem("dns_routing", &this->dns_routing, itemType::boolean)); + _add(new configItem("sniffing_mode", &this->sniffing_mode, itemType::integer)); + _add(new configItem("use_dns_object", &this->use_dns_object, itemType::boolean)); + _add(new configItem("dns_object", &this->dns_object, itemType::string)); } QString Routing::DisplayRouting() const { - return QString("[Proxy] %1\n[Proxy] %2\n[Direct] %3\n[Direct] %4\n[Block] %5\n[Block] %6") + return QString("[Proxy] %1\n[Proxy] %2\n[Direct] %3\n[Direct] %4\n[Block] %5\n[Block] %6\n[Default Outbound] %7\n[DNS] %8") .arg(SplitLinesSkipSharp(proxy_domain).join(",")) .arg(SplitLinesSkipSharp(proxy_ip).join(",")) .arg(SplitLinesSkipSharp(direct_domain).join(",")) .arg(SplitLinesSkipSharp(direct_ip).join(",")) .arg(SplitLinesSkipSharp(block_domain).join(",")) - .arg(SplitLinesSkipSharp(block_ip).join(",")); + .arg(SplitLinesSkipSharp(block_ip).join(",")) + .arg(def_outbound) + .arg(use_dns_object ? "DNS Object" : "Simple DNS"); } QStringList Routing::List() { diff --git a/main/NekoRay_DataStore.hpp b/main/NekoRay_DataStore.hpp index 1325faa..6ca68df 100644 --- a/main/NekoRay_DataStore.hpp +++ b/main/NekoRay_DataStore.hpp @@ -13,6 +13,20 @@ namespace NekoRay { QString def_outbound = "proxy"; QString custom = "{\"rules\": []}"; + // DNS + QString remote_dns = "https://8.8.8.8/dns-query"; + QString remote_dns_strategy = ""; + QString direct_dns = "localhost"; + QString direct_dns_strategy = ""; + bool dns_routing = true; + bool use_dns_object = false; + QString dns_object = ""; + + // Misc + QString domain_strategy = "AsIs"; + QString outbound_domain_strategy = "AsIs"; + int sniffing_mode = SniffingMode::FOR_ROUTING; + explicit Routing(int preset = 0); [[nodiscard]] QString DisplayRouting() const; @@ -118,22 +132,12 @@ namespace NekoRay { InboundAuthorization *inbound_auth = new InboundAuthorization; QString custom_inbound = "{\"inbounds\": []}"; - // DNS - QString remote_dns = "https://8.8.8.8/dns-query"; - QString remote_dns_strategy = ""; - QString direct_dns = "localhost"; - QString direct_dns_strategy = ""; - bool dns_routing = true; - // Routing - bool fake_dns = false; - QString domain_strategy = "AsIs"; - QString outbound_domain_strategy = "AsIs"; - int sniffing_mode = SniffingMode::FOR_ROUTING; QString custom_route_global = "{\"rules\": []}"; QString active_routing = "Default"; // VPN + bool fake_dns = false; bool vpn_internal_tun = true; int vpn_implementation = 0; int vpn_mtu = 9000; diff --git a/translations/fa_IR.ts b/translations/fa_IR.ts index 66c4e5e..e5fc85b 100644 --- a/translations/fa_IR.ts +++ b/translations/fa_IR.ts @@ -527,14 +527,6 @@ These settings can be changed later. Preset پیشفرض - - Custom - سفارشی - - - Custom (global) - - Mange route set @@ -579,14 +571,6 @@ These settings can be changed later. Default Outbound - - Remote - - - - DNS Query Strategy - - Domain Strategy @@ -603,6 +587,58 @@ These settings can be changed later. Sniff result for destination + + Common + متداول + + + DNS + + + + Simple DNS Settings + + + + Use DNS Object + + + + DNS Object Settings + + + + Simple Route + + + + Custom Route + + + + Custom Route (global) + + + + Note: Other settings are independent for each route set. + + + + Route sets + + + + Query Strategy + + + + Document + اسناد + + + Format + + DialogVPNSettings diff --git a/translations/zh_CN.ts b/translations/zh_CN.ts index caa2474..f67d1c4 100644 --- a/translations/zh_CN.ts +++ b/translations/zh_CN.ts @@ -541,10 +541,6 @@ These settings can be changed later. IP - - Custom - 自定义 - Save 保存 @@ -577,22 +573,10 @@ These settings can be changed later. Mange route set 管理路由规则 - - Custom (global) - 自定义 (全局) - Default Outbound 默认出站 - - Remote - 远程 - - - DNS Query Strategy - DNS 查询策略 - Domain Strategy 域名策略 @@ -601,6 +585,58 @@ These settings can be changed later. Server Address Strategy 服务器地址策略 + + Common + 通用 + + + DNS + + + + Simple DNS Settings + 简易 DNS 设置 + + + Use DNS Object + 使用 DNS Object + + + DNS Object Settings + DNS Object 设置 + + + Simple Route + 简易路由 + + + Custom Route + 自定义路由 + + + Custom Route (global) + 自定义路由(全局) + + + Note: Other settings are independent for each route set. + 注意:其他设置对于每个路由集都是独立的。 + + + Route sets + 路由集 + + + Query Strategy + 查询策略 + + + Document + 文档 + + + Format + 格式化 + DialogVPNSettings diff --git a/ui/dialog_manage_routes.cpp b/ui/dialog_manage_routes.cpp index dd1d495..901a694 100644 --- a/ui/dialog_manage_routes.cpp +++ b/ui/dialog_manage_routes.cpp @@ -12,40 +12,51 @@ #define REFRESH_ACTIVE_ROUTING(name, obj) \ this->active_routing = name; \ - ui->active_routing->setText(name); \ setWindowTitle(title_base + " [" + name + "]"); \ - SetRouteConfig(*obj); - -#define SAVE_TO_ROUTING(r) \ - r->direct_ip = directIPTxt->toPlainText(); \ - r->direct_domain = directDomainTxt->toPlainText(); \ - r->proxy_ip = proxyIPTxt->toPlainText(); \ - r->proxy_domain = proxyDomainTxt->toPlainText(); \ - r->block_ip = blockIPTxt->toPlainText(); \ - r->block_domain = blockDomainTxt->toPlainText(); \ - r->def_outbound = ui->def_outbound->currentText(); \ - r->custom = CACHE.custom_route; + UpdateDisplayRouting(obj, false); DialogManageRoutes::DialogManageRoutes(QWidget *parent) : QDialog(parent), ui(new Ui::DialogManageRoutes) { ui->setupUi(this); title_base = windowTitle(); + QStringList qsValue = {""}; + QString dnsHelpDocumentUrl; if (IS_NEKO_BOX) { ui->outbound_domain_strategy->addItems(Preset::SingBox::DomainStrategy); ui->domainStrategyCombo->addItems(Preset::SingBox::DomainStrategy); + qsValue += QString("prefer_ipv4 prefer_ipv6 ipv4_only ipv6_only").split(" "); + ui->dns_object->setPlaceholderText(DecodeB64IfValid("ewogICJzZXJ2ZXJzIjogW10sCiAgInJ1bGVzIjogW10sCiAgImZpbmFsIjogIiIsCiAgInN0cmF0ZWd5IjogIiIsCiAgImRpc2FibGVfY2FjaGUiOiBmYWxzZSwKICAiZGlzYWJsZV9leHBpcmUiOiBmYWxzZSwKICAiaW5kZXBlbmRlbnRfY2FjaGUiOiBmYWxzZSwKICAicmV2ZXJzZV9tYXBwaW5nIjogZmFsc2UsCiAgImZha2VpcCI6IHt9Cn0=")); + dnsHelpDocumentUrl = "https://sing-box.sagernet.org/configuration/dns/"; } else { ui->outbound_domain_strategy->addItems({"AsIs", "UseIPv4", "UseIPv6", "PreferIPv4", "PreferIPv6"}); ui->domainStrategyCombo->addItems({"AsIs", "IPIfNonMatch", "IPOnDemand"}); + qsValue += QString("use_ip use_ip4 use_ip6").split(" "); + ui->dns_object->setPlaceholderText(DecodeB64IfValid("ewogICJzZXJ2ZXJzIjogW10sCiAgInJ1bGVzIjogW10sCiAgImZpbmFsIjogIiIsCiAgInN0cmF0ZWd5IjogIiIsCiAgImRpc2FibGVfY2FjaGUiOiBmYWxzZSwKICAiZGlzYWJsZV9leHBpcmUiOiBmYWxzZSwKICAiaW5kZXBlbmRlbnRfY2FjaGUiOiBmYWxzZSwKICAicmV2ZXJzZV9tYXBwaW5nIjogZmFsc2UsCiAgImZha2VpcCI6IHt9Cn0=")); + dnsHelpDocumentUrl = "https://www.v2fly.org/config/dns.html"; } + ui->direct_dns_strategy->addItems(qsValue); + ui->remote_dns_strategy->addItems(qsValue); // - ui->sniffing_mode->setCurrentIndex(NekoRay::dataStore->sniffing_mode); - ui->outbound_domain_strategy->setCurrentText(NekoRay::dataStore->outbound_domain_strategy); - ui->domainStrategyCombo->setCurrentText(NekoRay::dataStore->domain_strategy); - ui->dns_routing->setChecked(NekoRay::dataStore->dns_routing); - ui->dns_remote->setText(NekoRay::dataStore->remote_dns); - ui->dns_direct->setText(NekoRay::dataStore->direct_dns); D_C_LOAD_STRING(custom_route_global) // + connect(ui->use_dns_object, &QCheckBox::stateChanged, this, [=](int state) { + auto useDNSObject = state == Qt::Checked; + ui->simple_dns_box->setDisabled(useDNSObject); + ui->dns_object->setDisabled(!useDNSObject); + }); + ui->use_dns_object->stateChanged(Qt::Unchecked); // uncheck to uncheck + connect(ui->dns_document, &QPushButton::clicked, this, [=] { + MessageBoxInfo("DNS", dnsHelpDocumentUrl); + }); + connect(ui->format_dns_object, &QPushButton::clicked, this, [=] { + auto obj = QString2QJsonObject(ui->dns_object->toPlainText()); + if (obj.isEmpty()) { + MessageBoxInfo("DNS", "invaild json"); + } else { + ui->dns_object->setPlainText(QJsonObject2QString(obj, false)); + } + }); + // connect(ui->custom_route_edit, &QPushButton::clicked, this, [=] { C_EDIT_JSON_ALLOW_EMPTY(custom_route) }); @@ -88,16 +99,10 @@ DialogManageRoutes::~DialogManageRoutes() { } void DialogManageRoutes::accept() { - NekoRay::dataStore->sniffing_mode = ui->sniffing_mode->currentIndex(); - NekoRay::dataStore->domain_strategy = ui->domainStrategyCombo->currentText(); - NekoRay::dataStore->outbound_domain_strategy = ui->outbound_domain_strategy->currentText(); - NekoRay::dataStore->dns_routing = ui->dns_routing->isChecked(); - NekoRay::dataStore->remote_dns = ui->dns_remote->text(); - NekoRay::dataStore->direct_dns = ui->dns_direct->text(); D_C_SAVE_STRING(custom_route_global) bool routeChanged = false; if (NekoRay::dataStore->active_routing != active_routing) routeChanged = true; - SAVE_TO_ROUTING(NekoRay::dataStore->routing) + SaveDisplayRouting(NekoRay::dataStore->routing); NekoRay::dataStore->active_routing = active_routing; NekoRay::dataStore->routing->fn = ROUTES_PREFIX + NekoRay::dataStore->active_routing; if (NekoRay::dataStore->routing->Save()) routeChanged = true; @@ -120,22 +125,57 @@ QList DialogManageRoutes::getBuiltInSchemes() { QAction *DialogManageRoutes::schemeToAction(const QString &name, const NekoRay::Routing &scheme) { auto *action = new QAction(this); action->setText(name); - connect(action, &QAction::triggered, [this, &scheme] { this->SetRouteConfig(scheme); }); + connect(action, &QAction::triggered, [this, &scheme] { this->UpdateDisplayRouting((NekoRay::Routing *) &scheme, true); }); return action; } -void DialogManageRoutes::SetRouteConfig(const NekoRay::Routing &conf) { +void DialogManageRoutes::UpdateDisplayRouting(NekoRay::Routing *conf, bool qv) { // - directDomainTxt->setPlainText(conf.direct_domain); - proxyDomainTxt->setPlainText(conf.proxy_domain); - blockDomainTxt->setPlainText(conf.block_domain); + directDomainTxt->setPlainText(conf->direct_domain); + proxyDomainTxt->setPlainText(conf->proxy_domain); + blockDomainTxt->setPlainText(conf->block_domain); // - blockIPTxt->setPlainText(conf.block_ip); - directIPTxt->setPlainText(conf.direct_ip); - proxyIPTxt->setPlainText(conf.proxy_ip); + blockIPTxt->setPlainText(conf->block_ip); + directIPTxt->setPlainText(conf->direct_ip); + proxyIPTxt->setPlainText(conf->proxy_ip); // - CACHE.custom_route = conf.custom; - ui->def_outbound->setCurrentText(conf.def_outbound); + CACHE.custom_route = conf->custom; + ui->def_outbound->setCurrentText(conf->def_outbound); + // + if (qv) return; + // + ui->sniffing_mode->setCurrentIndex(conf->sniffing_mode); + ui->outbound_domain_strategy->setCurrentText(conf->outbound_domain_strategy); + ui->domainStrategyCombo->setCurrentText(conf->outbound_domain_strategy); + ui->use_dns_object->setChecked(conf->use_dns_object); + ui->dns_object->setPlainText(conf->dns_object); + ui->dns_routing->setChecked(conf->dns_routing); + ui->remote_dns->setText(conf->remote_dns); + ui->remote_dns_strategy->setCurrentText(conf->remote_dns_strategy); + ui->direct_dns->setText(conf->direct_dns); + ui->direct_dns_strategy->setCurrentText(conf->direct_dns_strategy); +} + +void DialogManageRoutes::SaveDisplayRouting(NekoRay::Routing *conf) { + conf->direct_ip = directIPTxt->toPlainText(); + conf->direct_domain = directDomainTxt->toPlainText(); + conf->proxy_ip = proxyIPTxt->toPlainText(); + conf->proxy_domain = proxyDomainTxt->toPlainText(); + conf->block_ip = blockIPTxt->toPlainText(); + conf->block_domain = blockDomainTxt->toPlainText(); + conf->def_outbound = ui->def_outbound->currentText(); + conf->custom = CACHE.custom_route; + // + conf->sniffing_mode = ui->sniffing_mode->currentIndex(); + conf->domain_strategy = ui->domainStrategyCombo->currentText(); + conf->outbound_domain_strategy = ui->outbound_domain_strategy->currentText(); + conf->use_dns_object = ui->use_dns_object->isChecked(); + conf->dns_object = ui->dns_object->toPlainText(); + conf->dns_routing = ui->dns_routing->isChecked(); + conf->remote_dns = ui->remote_dns->text(); + conf->remote_dns_strategy = ui->remote_dns_strategy->currentText(); + conf->direct_dns = ui->direct_dns->text(); + conf->direct_dns_strategy = ui->direct_dns_strategy->currentText(); } void DialogManageRoutes::on_load_save_clicked() { @@ -172,7 +212,7 @@ void DialogManageRoutes::on_load_save_clicked() { r->fn = ROUTES_PREFIX + fn; if (r->Load()) { if (QMessageBox::question(nullptr, software_name, tr("Load routing: %1").arg(fn) + "\n" + r->DisplayRouting()) == QMessageBox::Yes) { - REFRESH_ACTIVE_ROUTING(fn, r) + REFRESH_ACTIVE_ROUTING(fn, r.get()) w->accept(); } } @@ -182,11 +222,11 @@ void DialogManageRoutes::on_load_save_clicked() { auto fn = lineEdit->text(); if (!fn.isEmpty()) { auto r = std::make_unique(); - SAVE_TO_ROUTING(r) + SaveDisplayRouting(r.get()); r->fn = ROUTES_PREFIX + fn; if (QMessageBox::question(nullptr, software_name, tr("Save routing: %1").arg(fn) + "\n" + r->DisplayRouting()) == QMessageBox::Yes) { r->Save(); - REFRESH_ACTIVE_ROUTING(fn, r) + REFRESH_ACTIVE_ROUTING(fn, r.get()) w->accept(); } } @@ -213,46 +253,3 @@ void DialogManageRoutes::on_load_save_clicked() { w->exec(); w->deleteLater(); } -void DialogManageRoutes::on_queryStrategy_clicked() { - auto w = new QDialog(this); - w->setWindowTitle("DNS Query Strategy"); - auto layout = new QGridLayout; - w->setLayout(layout); - // - QStringList qsValue{""}; - if (IS_NEKO_BOX) { - qsValue += QString("prefer_ipv4 prefer_ipv6 ipv4_only ipv6_only").split(" "); - } else { - qsValue += QString("use_ip use_ip4 use_ip6").split(" "); - } - // - auto remote_l = new QLabel(tr("Remote")); - auto direct_l = new QLabel(tr("Direct")); - auto remote = new QComboBox; - auto direct = new QComboBox; - remote->setEditable(true); - remote->addItems(qsValue); - remote->setCurrentText(NekoRay::dataStore->remote_dns_strategy); - direct->setEditable(true); - direct->addItems(qsValue); - direct->setCurrentText(NekoRay::dataStore->direct_dns_strategy); - // - layout->addWidget(remote_l, 0, 0); - layout->addWidget(remote, 0, 1); - layout->addWidget(direct_l, 1, 0); - layout->addWidget(direct, 1, 1); - auto box = new QDialogButtonBox; - box->setOrientation(Qt::Horizontal); - box->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Ok); - connect(box, &QDialogButtonBox::accepted, w, [=] { - NekoRay::dataStore->remote_dns_strategy = remote->currentText(); - NekoRay::dataStore->direct_dns_strategy = direct->currentText(); - NekoRay::dataStore->Save(); - w->accept(); - }); - connect(box, &QDialogButtonBox::rejected, w, &QDialog::reject); - layout->addWidget(box, 2, 1); - // - w->exec(); - w->deleteLater(); -} diff --git a/ui/dialog_manage_routes.h b/ui/dialog_manage_routes.h index 949c8af..4765b65 100644 --- a/ui/dialog_manage_routes.h +++ b/ui/dialog_manage_routes.h @@ -51,9 +51,9 @@ public slots: QAction *schemeToAction(const QString &name, const NekoRay::Routing &scheme); - void SetRouteConfig(const NekoRay::Routing &conf); + void UpdateDisplayRouting(NekoRay::Routing *conf, bool qv); + + void SaveDisplayRouting(NekoRay::Routing *conf); void on_load_save_clicked(); - - void on_queryStrategy_clicked(); }; diff --git a/ui/dialog_manage_routes.ui b/ui/dialog_manage_routes.ui index 93b56e8..6ced505 100644 --- a/ui/dialog_manage_routes.ui +++ b/ui/dialog_manage_routes.ui @@ -15,364 +15,458 @@ - - - - - - - - Sniffing Mode - - - - - - - - Disable - + + + 0 + + + + Common + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + - - - Sniff result for routing - + + + + Route sets + + + + + + Mange route set + + + + + + + Custom Route (global) + + + + + + + Note: Other settings are independent for each route set. + + + + + - - - Sniff result for destination - - - - - - - - For V2Ray, it sets routing.domainStrategy + + + + For V2Ray, it sets routing.domainStrategy For sing-box, it sets inbound.domain_strategy - - - Domain Strategy - - - - - - - false - - - - - - - Server Address Strategy - - - - - - - false - - - - - - - - - - - Remote DNS - - - - - - - - - - Direct DNS - - - - - - - - - - Qt::Vertical - - - - - - - Enable DNS Routing - - - - - - - - 0 - 0 - - - - DNS Query Strategy - - - - - - - - - - - - - - - - - Block - - - Qt::AlignCenter - - - - - - - - - - Direct - - - Qt::AlignCenter - - - - - - - Domain - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - - - - - - Proxy - - - Qt::AlignCenter - - - - - - - - - - - - - IP - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - + + + Domain Strategy + + + + + + + false + + + + + + - Preset + Disable - - QToolButton::InstantPopup - - - Qt::ToolButtonTextBesideIcon - - - - - + + - Custom + Sniff result for routing - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - QFrame::Box - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - + + - Default Outbound + Sniff result for destination - - - - - + + + + + + + Sniffing Mode + + + + + + + Server Address Strategy + + + + + + + false + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + DNS + + + + + + Simple DNS Settings + + + + + + Direct DNS + + + + + + + + + + - proxy + Query Strategy - - + + + + + + + + + + + Remote DNS + + + widget + + + + + + + - bypass + Enable DNS Routing - - + + + + + + + + + + + - block + Query Strategy - - - - - - - - - + + + + + + + + + + + + + + DNS Object Settings + + + + + + + + Use DNS Object + + + + + + + + 0 + 0 + + + + Format + + + + + + + + 0 + 0 + + + + Document + + + + + + + + + + + + + + + + Simple Route + + + + + + + + + + + Block + + + Qt::AlignCenter + + + + + + + + + + Direct + + + Qt::AlignCenter + + + + + + + Domain + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + Proxy + + + Qt::AlignCenter + + + + + + + + + + + + + IP + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + Preset + + + QToolButton::InstantPopup + + + Qt::ToolButtonTextBesideIcon + + + + + + + Custom Route + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Default Outbound + + + + + + + + proxy + + + + + bypass + + + + + block + + + + + + + + + + + + + + - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Mange route set - - - - - - - Custom (global) - - - - - - @@ -391,14 +485,24 @@ For sing-box, it sets inbound.domain_strategy + tabWidget sniffing_mode - dns_remote - dns_direct + domainStrategyCombo + outbound_domain_strategy + load_save + custom_route_global_edit + remote_dns + remote_dns_strategy + direct_dns + direct_dns_strategy + dns_routing + use_dns_object + format_dns_object + dns_document + dns_object preset custom_route_edit def_outbound - load_save - custom_route_global_edit diff --git a/ui/mainwindow.cpp b/ui/mainwindow.cpp index 80966dd..f02208b 100644 --- a/ui/mainwindow.cpp +++ b/ui/mainwindow.cpp @@ -95,8 +95,8 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi software_core_name = "sing-box"; // replace default values if (NekoRay::dataStore->log_level == "warning") NekoRay::dataStore->log_level = "info"; - if (!Preset::SingBox::DomainStrategy.contains(NekoRay::dataStore->domain_strategy)) NekoRay::dataStore->domain_strategy = ""; - if (!Preset::SingBox::DomainStrategy.contains(NekoRay::dataStore->outbound_domain_strategy)) NekoRay::dataStore->outbound_domain_strategy = ""; + if (!Preset::SingBox::DomainStrategy.contains(NekoRay::dataStore->routing->domain_strategy)) NekoRay::dataStore->routing->domain_strategy = ""; + if (!Preset::SingBox::DomainStrategy.contains(NekoRay::dataStore->routing->outbound_domain_strategy)) NekoRay::dataStore->routing->outbound_domain_strategy = ""; // if (QDir("dashboard").isEmpty()) { QDir().mkdir("dashboard");