mirror of
https://github.com/MatsuriDayo/nekoray.git
synced 2025-12-17 12:34:37 +03:00
fix: url test rule
This commit is contained in:
@@ -72,8 +72,6 @@ namespace NekoRay {
|
|||||||
return chainTagOut;
|
return chainTagOut;
|
||||||
}
|
}
|
||||||
|
|
||||||
// V2Ray
|
|
||||||
|
|
||||||
void ApplyCustomOutboundJsonSettings(const QJsonObject &custom, QJsonObject &outbound) {
|
void ApplyCustomOutboundJsonSettings(const QJsonObject &custom, QJsonObject &outbound) {
|
||||||
// 合并
|
// 合并
|
||||||
if (custom.isEmpty()) return;
|
if (custom.isEmpty()) return;
|
||||||
@@ -95,6 +93,38 @@ namespace NekoRay {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define DOMAIN_USER_RULE \
|
||||||
|
for (const auto &line: SplitLines(dataStore->routing->proxy_domain)) { \
|
||||||
|
if (line.startsWith("#")) continue; \
|
||||||
|
if (dataStore->dns_routing) status->domainListDNSRemote += line; \
|
||||||
|
status->domainListRemote += line; \
|
||||||
|
} \
|
||||||
|
for (const auto &line: SplitLines(dataStore->routing->direct_domain)) { \
|
||||||
|
if (line.startsWith("#")) continue; \
|
||||||
|
if (dataStore->dns_routing) status->domainListDNSDirect += line; \
|
||||||
|
status->domainListDirect += line; \
|
||||||
|
} \
|
||||||
|
for (const auto &line: SplitLines(dataStore->routing->block_domain)) { \
|
||||||
|
if (line.startsWith("#")) continue; \
|
||||||
|
status->domainListBlock += line; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define IP_USER_RULE \
|
||||||
|
for (const auto &line: SplitLines(dataStore->routing->block_ip)) { \
|
||||||
|
if (line.startsWith("#")) continue; \
|
||||||
|
status->ipListBlock += line; \
|
||||||
|
} \
|
||||||
|
for (const auto &line: SplitLines(dataStore->routing->proxy_ip)) { \
|
||||||
|
if (line.startsWith("#")) continue; \
|
||||||
|
status->ipListRemote += line; \
|
||||||
|
} \
|
||||||
|
for (const auto &line: SplitLines(dataStore->routing->direct_ip)) { \
|
||||||
|
if (line.startsWith("#")) continue; \
|
||||||
|
status->ipListDirect += line; \
|
||||||
|
}
|
||||||
|
|
||||||
|
// V2Ray
|
||||||
|
|
||||||
QSharedPointer<BuildConfigResult> BuildConfigV2Ray(const QSharedPointer<ProxyEntity> &ent, bool forTest, bool forExport) {
|
QSharedPointer<BuildConfigResult> BuildConfigV2Ray(const QSharedPointer<ProxyEntity> &ent, bool forTest, bool forExport) {
|
||||||
auto result = QSharedPointer<BuildConfigResult>(new BuildConfigResult);
|
auto result = QSharedPointer<BuildConfigResult>(new BuildConfigResult);
|
||||||
auto status = QSharedPointer<BuildConfigStatus>(new BuildConfigStatus);
|
auto status = QSharedPointer<BuildConfigStatus>(new BuildConfigStatus);
|
||||||
@@ -215,20 +245,10 @@ namespace NekoRay {
|
|||||||
result->coreConfig.insert("inbounds", status->inbounds);
|
result->coreConfig.insert("inbounds", status->inbounds);
|
||||||
result->coreConfig.insert("outbounds", status->outbounds);
|
result->coreConfig.insert("outbounds", status->outbounds);
|
||||||
|
|
||||||
// dns domain user rule
|
// user rule
|
||||||
for (const auto &line: SplitLines(dataStore->routing->proxy_domain)) {
|
if (!forTest) {
|
||||||
if (line.startsWith("#")) continue;
|
DOMAIN_USER_RULE
|
||||||
if (dataStore->dns_routing) status->domainListDNSRemote += line;
|
IP_USER_RULE
|
||||||
status->domainListRemote += line;
|
|
||||||
}
|
|
||||||
for (const auto &line: SplitLines(dataStore->routing->direct_domain)) {
|
|
||||||
if (line.startsWith("#")) continue;
|
|
||||||
if (dataStore->dns_routing) status->domainListDNSDirect += line;
|
|
||||||
status->domainListDirect += line;
|
|
||||||
}
|
|
||||||
for (const auto &line: SplitLines(dataStore->routing->block_domain)) {
|
|
||||||
if (line.startsWith("#")) continue;
|
|
||||||
status->domainListBlock += line;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// final add DNS
|
// final add DNS
|
||||||
@@ -281,17 +301,10 @@ namespace NekoRay {
|
|||||||
routing["domainStrategy"] = dataStore->domain_strategy;
|
routing["domainStrategy"] = dataStore->domain_strategy;
|
||||||
routing["domainMatcher"] = dataStore->domain_matcher == DomainMatcher::MPH ? "mph" : "linear";
|
routing["domainMatcher"] = dataStore->domain_matcher == DomainMatcher::MPH ? "mph" : "linear";
|
||||||
|
|
||||||
// ip user rule
|
// final add block route
|
||||||
QJsonObject routingRule_tmp;
|
QJsonObject routingRule_tmp;
|
||||||
routingRule_tmp["type"] = "field";
|
routingRule_tmp["type"] = "field";
|
||||||
|
|
||||||
// block
|
|
||||||
routingRule_tmp["outboundTag"] = "block";
|
routingRule_tmp["outboundTag"] = "block";
|
||||||
for (const auto &line: SplitLines(dataStore->routing->block_ip)) {
|
|
||||||
if (line.startsWith("#")) continue;
|
|
||||||
status->ipListBlock += line;
|
|
||||||
}
|
|
||||||
// final add block route
|
|
||||||
if (!status->ipListBlock.isEmpty()) {
|
if (!status->ipListBlock.isEmpty()) {
|
||||||
auto tmp = routingRule_tmp;
|
auto tmp = routingRule_tmp;
|
||||||
tmp["ip"] = status->ipListBlock;
|
tmp["ip"] = status->ipListBlock;
|
||||||
@@ -303,13 +316,8 @@ namespace NekoRay {
|
|||||||
status->routingRules += tmp;
|
status->routingRules += tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
// proxy
|
|
||||||
routingRule_tmp["outboundTag"] = tagProxy;
|
|
||||||
for (const auto &line: SplitLines(dataStore->routing->proxy_ip)) {
|
|
||||||
if (line.startsWith("#")) continue;
|
|
||||||
status->ipListRemote += line;
|
|
||||||
}
|
|
||||||
// final add proxy route
|
// final add proxy route
|
||||||
|
routingRule_tmp["outboundTag"] = "proxy";
|
||||||
if (!status->ipListRemote.isEmpty()) {
|
if (!status->ipListRemote.isEmpty()) {
|
||||||
auto tmp = routingRule_tmp;
|
auto tmp = routingRule_tmp;
|
||||||
tmp["ip"] = status->ipListRemote;
|
tmp["ip"] = status->ipListRemote;
|
||||||
@@ -321,13 +329,8 @@ namespace NekoRay {
|
|||||||
status->routingRules += tmp;
|
status->routingRules += tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
// bypass
|
|
||||||
routingRule_tmp["outboundTag"] = "bypass";
|
|
||||||
for (const auto &line: SplitLines(dataStore->routing->direct_ip)) {
|
|
||||||
if (line.startsWith("#")) continue;
|
|
||||||
status->ipListDirect += line;
|
|
||||||
}
|
|
||||||
// final add bypass route
|
// final add bypass route
|
||||||
|
routingRule_tmp["outboundTag"] = "bypass";
|
||||||
if (!status->ipListDirect.isEmpty()) {
|
if (!status->ipListDirect.isEmpty()) {
|
||||||
auto tmp = routingRule_tmp;
|
auto tmp = routingRule_tmp;
|
||||||
tmp["ip"] = status->ipListDirect;
|
tmp["ip"] = status->ipListDirect;
|
||||||
@@ -655,10 +658,12 @@ namespace NekoRay {
|
|||||||
{"type", "block"},
|
{"type", "block"},
|
||||||
{"tag", "block"},
|
{"tag", "block"},
|
||||||
};
|
};
|
||||||
status->outbounds += QJsonObject{
|
if (!forTest) {
|
||||||
{"type", "dns"},
|
status->outbounds += QJsonObject{
|
||||||
{"tag", "dns-out"},
|
{"type", "dns"},
|
||||||
};
|
{"tag", "dns-out"},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
// custom inbound
|
// custom inbound
|
||||||
QJSONARRAY_ADD(status->inbounds, QString2QJsonObject(dataStore->custom_inbound)["inbounds"].toArray())
|
QJSONARRAY_ADD(status->inbounds, QString2QJsonObject(dataStore->custom_inbound)["inbounds"].toArray())
|
||||||
@@ -666,23 +671,13 @@ namespace NekoRay {
|
|||||||
result->coreConfig.insert("inbounds", status->inbounds);
|
result->coreConfig.insert("inbounds", status->inbounds);
|
||||||
result->coreConfig.insert("outbounds", status->outbounds);
|
result->coreConfig.insert("outbounds", status->outbounds);
|
||||||
|
|
||||||
// dns domain user rule
|
// user rule
|
||||||
for (const auto &line: SplitLines(dataStore->routing->proxy_domain)) {
|
if (!forTest) {
|
||||||
if (line.startsWith("#")) continue;
|
DOMAIN_USER_RULE
|
||||||
status->domainListDNSRemote += line;
|
IP_USER_RULE
|
||||||
status->domainListRemote += line;
|
|
||||||
}
|
|
||||||
for (const auto &line: SplitLines(dataStore->routing->direct_domain)) {
|
|
||||||
if (line.startsWith("#")) continue;
|
|
||||||
status->domainListDNSDirect += line;
|
|
||||||
status->domainListDirect += line;
|
|
||||||
}
|
|
||||||
for (const auto &line: SplitLines(dataStore->routing->block_domain)) {
|
|
||||||
if (line.startsWith("#")) continue;
|
|
||||||
status->domainListBlock += line;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
// sing-box common rule object
|
||||||
auto make_rule = [&](const QJsonArray &arr, bool isIP = false) {
|
auto make_rule = [&](const QJsonArray &arr, bool isIP = false) {
|
||||||
QJsonObject rule;
|
QJsonObject rule;
|
||||||
QJsonArray ips;
|
QJsonArray ips;
|
||||||
@@ -763,7 +758,7 @@ namespace NekoRay {
|
|||||||
{"detour", "direct"},
|
{"detour", "direct"},
|
||||||
};
|
};
|
||||||
|
|
||||||
// DNS rules
|
// sing-box dns rule object
|
||||||
auto add_rule_dns = [&](const QJsonArray &arr, const QString &server) {
|
auto add_rule_dns = [&](const QJsonArray &arr, const QString &server) {
|
||||||
auto rule = make_rule(arr, false);
|
auto rule = make_rule(arr, false);
|
||||||
if (rule.isEmpty()) return;
|
if (rule.isEmpty()) return;
|
||||||
@@ -784,9 +779,9 @@ namespace NekoRay {
|
|||||||
auto routingRules = QString2QJsonObject(dataStore->routing->custom)["rules"].toArray();
|
auto routingRules = QString2QJsonObject(dataStore->routing->custom)["rules"].toArray();
|
||||||
|
|
||||||
// dns hijack
|
// dns hijack
|
||||||
routingRules += QJsonObject{{"protocol", "dns"},
|
if (!forTest) routingRules += QJsonObject{{"protocol", "dns"}, {"outbound", "dns-out"}};
|
||||||
{"outbound", "dns-out"}};
|
|
||||||
|
|
||||||
|
// sing-box routing rule object
|
||||||
auto add_rule_route = [&](const QJsonArray &arr, bool isIP, const QString &out) {
|
auto add_rule_route = [&](const QJsonArray &arr, bool isIP, const QString &out) {
|
||||||
auto rule = make_rule(arr, isIP);
|
auto rule = make_rule(arr, isIP);
|
||||||
if (rule.isEmpty()) return;
|
if (rule.isEmpty()) return;
|
||||||
@@ -794,24 +789,10 @@ namespace NekoRay {
|
|||||||
routingRules += rule;
|
routingRules += rule;
|
||||||
};
|
};
|
||||||
|
|
||||||
// ip user rule
|
// final add routing rule
|
||||||
for (const auto &line: SplitLines(dataStore->routing->block_ip)) {
|
|
||||||
if (line.startsWith("#")) continue;
|
|
||||||
status->ipListBlock += line;
|
|
||||||
}
|
|
||||||
for (const auto &line: SplitLines(dataStore->routing->proxy_ip)) {
|
|
||||||
if (line.startsWith("#")) continue;
|
|
||||||
status->ipListRemote += line;
|
|
||||||
}
|
|
||||||
for (const auto &line: SplitLines(dataStore->routing->direct_ip)) {
|
|
||||||
if (line.startsWith("#")) continue;
|
|
||||||
status->ipListDirect += line;
|
|
||||||
}
|
|
||||||
add_rule_route(status->ipListBlock, true, "block");
|
add_rule_route(status->ipListBlock, true, "block");
|
||||||
add_rule_route(status->ipListRemote, true, tagProxy);
|
add_rule_route(status->ipListRemote, true, tagProxy);
|
||||||
add_rule_route(status->ipListDirect, true, "bypass");
|
add_rule_route(status->ipListDirect, true, "bypass");
|
||||||
|
|
||||||
// domain user rule
|
|
||||||
add_rule_route(status->domainListBlock, false, "block");
|
add_rule_route(status->domainListBlock, false, "block");
|
||||||
add_rule_route(status->domainListRemote, false, tagProxy);
|
add_rule_route(status->domainListRemote, false, tagProxy);
|
||||||
add_rule_route(status->domainListDirect, false, "bypass");
|
add_rule_route(status->domainListDirect, false, "bypass");
|
||||||
|
|||||||
@@ -40,7 +40,11 @@ func main() {
|
|||||||
// 1. update files
|
// 1. update files
|
||||||
Updater()
|
Updater()
|
||||||
// 2. start
|
// 2. start
|
||||||
Launcher()
|
if os.Getenv("NKR_FROM_LAUNCHER") == "1" {
|
||||||
|
Launcher()
|
||||||
|
} else {
|
||||||
|
exec.Command("./nekoray").Start()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
} else if strings.HasPrefix(strings.ToLower(exe), "launcher") {
|
} else if strings.HasPrefix(strings.ToLower(exe), "launcher") {
|
||||||
|
|||||||
@@ -558,7 +558,7 @@ void MainWindow::on_menu_exit_triggered() {
|
|||||||
QProcess::startDetached("./updater", QStringList{});
|
QProcess::startDetached("./updater", QStringList{});
|
||||||
} else if (exit_reason == 2) {
|
} else if (exit_reason == 2) {
|
||||||
QDir::setCurrent(QApplication::applicationDirPath());
|
QDir::setCurrent(QApplication::applicationDirPath());
|
||||||
QProcess::startDetached("./nekoray", QStringList{});
|
QProcess::startDetached(qEnvironmentVariable("NKR_FROM_LAUNCHER") == "1" ? "./launcher" : "./nekoray", QStringList{});
|
||||||
}
|
}
|
||||||
tray->hide();
|
tray->hide();
|
||||||
QCoreApplication::quit();
|
QCoreApplication::quit();
|
||||||
@@ -1013,13 +1013,19 @@ void MainWindow::on_menu_export_config_triggered() {
|
|||||||
|
|
||||||
QMessageBox msg(QMessageBox::Information, tr("Config copied"), config_core);
|
QMessageBox msg(QMessageBox::Information, tr("Config copied"), config_core);
|
||||||
msg.addButton("Copy core config", QMessageBox::YesRole);
|
msg.addButton("Copy core config", QMessageBox::YesRole);
|
||||||
|
msg.addButton("Copy test config", QMessageBox::YesRole);
|
||||||
msg.addButton(QMessageBox::Ok);
|
msg.addButton(QMessageBox::Ok);
|
||||||
|
msg.setEscapeButton(QMessageBox::Ok);
|
||||||
msg.setDefaultButton(QMessageBox::Ok);
|
msg.setDefaultButton(QMessageBox::Ok);
|
||||||
auto ret = msg.exec();
|
auto ret = msg.exec();
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
result = NekoRay::BuildConfig(ent, false, false);
|
result = NekoRay::BuildConfig(ent, false, false);
|
||||||
config_core = QJsonObject2QString(result->coreConfig, true);
|
config_core = QJsonObject2QString(result->coreConfig, true);
|
||||||
QApplication::clipboard()->setText(config_core);
|
QApplication::clipboard()->setText(config_core);
|
||||||
|
} else if (ret == 1) {
|
||||||
|
result = NekoRay::BuildConfig(ent, true, false);
|
||||||
|
config_core = QJsonObject2QString(result->coreConfig, true);
|
||||||
|
QApplication::clipboard()->setText(config_core);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user