diff --git a/include/dataStore/RouteEntity.h b/include/dataStore/RouteEntity.h index b2603c4..a6785c3 100644 --- a/include/dataStore/RouteEntity.h +++ b/include/dataStore/RouteEntity.h @@ -5,6 +5,23 @@ #include "include/global/NekoGui.hpp" namespace NekoGui { + enum outboundID {proxyID=-1, directID=-2, blockID=-3, dnsOutID=-4}; + inline QString outboundIDToString(int id) + { + if (id == proxyID) return {"proxy"}; + if (id == directID) return {"direct"}; + if (id == blockID) return {"block"}; + if (id == dnsOutID) return {"dns"}; + return {"unknown"}; + } + inline outboundID stringToOutboundID(const QString& out) + { + if (out == "proxy") return proxyID; + if (out == "direct") return directID; + if (out == "block") return blockID; + if (out == "dns_out") return dnsOutID; + return proxyID; + } enum inputType {trufalse, select, text}; const int IranBypassChainID = 111111111; const int ChinaBypassChainID = 222222222; @@ -57,7 +74,7 @@ namespace NekoGui { QList process_path_regex; QList rule_set; bool invert = false; - int outboundID = -2; // -1 is proxy -2 is direct -3 is block -4 is dns_out + int outboundID = directID; // -1 is proxy -2 is direct -3 is block -4 is dns_out // since sing-box 1.11.0 QString action = "route"; @@ -94,6 +111,7 @@ namespace NekoGui { QString name = ""; QList> Rules; QList castedRules; + int defaultOutboundID = proxyID; RoutingChain(); diff --git a/include/global/NekoGui_DataStore.hpp b/include/global/NekoGui_DataStore.hpp index a5c0f45..c7c6644 100644 --- a/include/global/NekoGui_DataStore.hpp +++ b/include/global/NekoGui_DataStore.hpp @@ -7,7 +7,6 @@ namespace NekoGui { class Routing : public JsonStore { public: int current_route_id = 0; - QString def_outbound = "proxy"; // DNS QString remote_dns = "tls://8.8.8.8"; diff --git a/include/ui/setting/RouteItem.ui b/include/ui/setting/RouteItem.ui index ce8b56f..a899648 100644 --- a/include/ui/setting/RouteItem.ui +++ b/include/ui/setting/RouteItem.ui @@ -34,6 +34,20 @@ + + + + + proxy + + + + + direct + + + + diff --git a/include/ui/setting/dialog_manage_routes.ui b/include/ui/setting/dialog_manage_routes.ui index eaeb841..0f82636 100644 --- a/include/ui/setting/dialog_manage_routes.ui +++ b/include/ui/setting/dialog_manage_routes.ui @@ -27,61 +27,8 @@ - - - - false - - - - - - - false - - - - - - - Routing Profile - - - - - - - - proxy - - - - - direct - - - - - - - - The outbound tag to use when the request is not handled by any rule - - - Default Outbound - - - - - - - inbound.domain_strategy -when used, domain destinations are resolved to IP before routing. - - - Inbound Domain Strategy - - + + @@ -95,8 +42,12 @@ also if the connection cannot be established with the current address family (ip - - + + + + false + + @@ -108,6 +59,17 @@ also if the connection cannot be established with the current address family (ip + + + + inbound.domain_strategy +when used, domain destinations are resolved to IP before routing. + + + Inbound Domain Strategy + + + @@ -127,6 +89,20 @@ also if the connection cannot be established with the current address family (ip + + + + Routing Profile + + + + + + + false + + + diff --git a/src/configs/ConfigBuilder.cpp b/src/configs/ConfigBuilder.cpp index 2636737..a54f38f 100644 --- a/src/configs/ConfigBuilder.cpp +++ b/src/configs/ConfigBuilder.cpp @@ -520,7 +520,7 @@ namespace NekoGui { if (dataStore->vpn_ipv6) tunAddress += "fdfe:dcba:9876::1/96"; inboundObj["address"] = tunAddress; inboundObj["domain_strategy"] = dataStore->routing->domain_strategy; - if (dataStore->enable_tun_routing && dataStore->routing->def_outbound == "proxy") + if (dataStore->enable_tun_routing && routeChain->defaultOutboundID == proxyID) { if (!directIPCIDRs.isEmpty()) inboundObj["route_exclude_address"] = directIPCIDRs; if (!directIPSets.isEmpty()) inboundObj["route_exclude_address_set"] = directIPSets; @@ -592,7 +592,7 @@ namespace NekoGui { { routeObj["find_process"] = true; } - if (!status->forTest) routeObj["final"] = dataStore->routing->def_outbound; + if (!status->forTest) routeObj["final"] = outboundIDToString(routeChain->defaultOutboundID); if (dataStore->routing->sniffing_mode != SniffingMode::DISABLE) { diff --git a/src/dataStore/RouteEntity.cpp b/src/dataStore/RouteEntity.cpp index 1206a8a..ba99cce 100644 --- a/src/dataStore/RouteEntity.cpp +++ b/src/dataStore/RouteEntity.cpp @@ -815,6 +815,7 @@ namespace NekoGui { _add(new configItem("id", &id, itemType::integer)); _add(new configItem("name", &name, itemType::string)); + _add(new configItem("default_outbound", &defaultOutboundID, itemType::integer)); _add(new configItem("rules", &castedRules, itemType::jsonStoreList)); } diff --git a/src/global/NekoGui.cpp b/src/global/NekoGui.cpp index 7943d7a..ab711bc 100644 --- a/src/global/NekoGui.cpp +++ b/src/global/NekoGui.cpp @@ -334,7 +334,6 @@ namespace NekoGui { if (!Preset::SingBox::DomainStrategy.contains(domain_strategy)) domain_strategy = ""; if (!Preset::SingBox::DomainStrategy.contains(outbound_domain_strategy)) outbound_domain_strategy = ""; _add(new configItem("current_route_id", &this->current_route_id, itemType::integer)); - _add(new configItem("default_outbound", &this->def_outbound, itemType::string)); // _add(new configItem("remote_dns", &this->remote_dns, itemType::string)); _add(new configItem("remote_dns_strategy", &this->remote_dns_strategy, itemType::string)); diff --git a/src/ui/setting/RouteItem.cpp b/src/ui/setting/RouteItem.cpp index f27e309..08ca9be 100644 --- a/src/ui/setting/RouteItem.cpp +++ b/src/ui/setting/RouteItem.cpp @@ -121,6 +121,8 @@ RouteItem::RouteItem(QWidget *parent, const std::shared_ptrrule_preview->setReadOnly(true); updateRuleSection(); + ui->def_out->setCurrentText(NekoGui::outboundIDToString(chain->defaultOutboundID)); + // simple rules setup QStringList ruleItems = {"domain:", "suffix:", "regex:", "keyword:", "ip:", "processName:", "processPath:"}; for (const auto& geoIP : geoIpList) { @@ -337,6 +339,7 @@ void RouteItem::accept() { }); return; } + chain->defaultOutboundID = NekoGui::stringToOutboundID(ui->def_out->currentText()); emit settingsChanged(chain); diff --git a/src/ui/setting/dialog_manage_routes.cpp b/src/ui/setting/dialog_manage_routes.cpp index 013dd97..2b565a1 100644 --- a/src/ui/setting/dialog_manage_routes.cpp +++ b/src/ui/setting/dialog_manage_routes.cpp @@ -76,7 +76,6 @@ DialogManageRoutes::DialogManageRoutes(QWidget *parent) : QDialog(parent), ui(ne QStringList qsValue = {""}; QString dnsHelpDocumentUrl; - ui->default_out->setCurrentText(NekoGui::dataStore->routing->def_outbound); 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(" "); @@ -209,7 +208,6 @@ void DialogManageRoutes::accept() { NekoGui::profileManager->UpdateRouteChains(chainList); NekoGui::dataStore->routing->current_route_id = currentRoute->id; - NekoGui::dataStore->routing->def_outbound = ui->default_out->currentText(); NekoGui::dataStore->enable_dns_server = ui->dnshijack_enable->isChecked(); NekoGui::dataStore->dns_server_listen_port = ui->dnshijack_listenport->text().toInt();