Fix process path &&

Some more fixes
This commit is contained in:
Nova 2025-11-17 18:22:26 +03:30
parent 6bacd1c7a3
commit 70c0ecd926
9 changed files with 67 additions and 15 deletions

View File

@ -137,7 +137,7 @@ func BatchURLTest(ctx context.Context, i *boxbox.Box, outboundTags []string, url
}
client := &http.Client{
Transport: &http.Transport{
DialContext: func(ctx context.Context, network string, addr string) (net.Conn, error) {
DialContext: func(_ context.Context, network string, addr string) (net.Conn, error) {
return outbound.DialContext(ctx, "tcp", metadata.ParseSocksaddr(addr))
},
},

View File

@ -1,5 +1,6 @@
#pragma once
#include <QHostInfo>
#include <utility>
#include "DialFields.h"
#include "multiplex.h"
#include "TLS.h"
@ -27,18 +28,23 @@ namespace Configs
void ResolveDomainToIP(const std::function<void()> &onFinished) {
bool noResolve = false;
if (IsIpAddress(server) || server.isEmpty()) noResolve = true;
auto serverAddr = GetAddress();
if (IsIpAddress(serverAddr) || serverAddr.isEmpty()) noResolve = true;
if (noResolve) {
onFinished();
return;
}
QHostInfo::lookupHost(server, QApplication::instance(), [=, this](const QHostInfo &host) {
QHostInfo::lookupHost(serverAddr, QApplication::instance(), [=, this](const QHostInfo &host) {
auto addrs = host.addresses();
if (!addrs.isEmpty()) server = addrs.first().toString();
if (!addrs.isEmpty()) SetAddress(addrs.first().toString());
onFinished();
});
}
virtual void SetAddress(QString newAddr) {
server = std::move(newAddr);
}
virtual QString GetAddress()
{
return server;

View File

@ -40,6 +40,8 @@ namespace Configs
QJsonObject ExportToJson() override;
BuildResult Build() override;
void SetAddress(QString newAddr) override;
QString GetAddress() override;
QString DisplayAddress() override;
QString DisplayType() override;
bool IsEndpoint() override;

View File

@ -83,6 +83,8 @@ namespace Configs
QJsonObject ExportToJson() override;
BuildResult Build() override;
void SetAddress(QString newAddr) override;
QString GetAddress() override;
QString DisplayAddress() override;
QString DisplayType() override;
bool IsEndpoint() override;

View File

@ -529,7 +529,7 @@ namespace Configs {
ctx->buildConfigResult->coreConfig["inbounds"] = inbounds;
}
void unwrapChain(const QList<int>& entIDs, QList<std::shared_ptr<ProxyEntity>> &ents, QString& error)
void entIDListtoEntList(const QList<int>& entIDs, QList<std::shared_ptr<ProxyEntity>> &ents, QString& error)
{
bool hasExtracore = false;
bool hasCustom = false;
@ -556,10 +556,24 @@ namespace Configs {
}
}
QList<int> unwrapChain(int entID) {
auto ent = profileManager->GetProfile(entID);
if (ent == nullptr)
{
return {};
}
if (ent->type == "chain") {
auto chain = ent->Chain();
if (chain == nullptr) return {};
return chain->list;
}
return {entID};
}
void buildOutboundChain(std::shared_ptr<BuildSingBoxConfigContext> &ctx, const QList<int>& entIDs, const QString& prefix, bool includeProxy, bool link)
{
QList<std::shared_ptr<ProxyEntity>> ents;
unwrapChain(entIDs, ents, ctx->error);
entIDListtoEntList(entIDs, ents, ctx->error);
for (int idx = 0; idx < ents.size(); idx++)
{
auto tag = prefix + "-" + Int2String(idx);
@ -898,6 +912,7 @@ namespace Configs {
QList<int> entIDs;
for (const auto& proxy : profiles) entIDs << proxy->id;
ctx->buildPrerequisities->dnsDeps->directDomains = QListStr2QJsonArray(getEntDomains(entIDs, ctx->error));
if (!ctx->buildPrerequisities->dnsDeps->directDomains.isEmpty()) ctx->buildPrerequisities->dnsDeps->needDirectDnsRules = true;
buildDNSSection(ctx);
if (!ctx->error.isEmpty())
{
@ -942,7 +957,11 @@ namespace Configs {
continue;
}
}
buildOutboundChain(ctx, {item->id}, "proxy-" + Int2String(suffix), false, true);
buildOutboundChain(ctx, unwrapChain(item->id), "proxy-" + Int2String(suffix), false, true);
if (!ctx->error.isEmpty()) {
res->error = ctx->error;
return res;
}
auto tag = "proxy-" + Int2String(suffix) + "-0";
res->outboundTags << tag;
res->tag2entID.insert(tag, item->id);

View File

@ -114,6 +114,14 @@ namespace Configs {
return {object, ""};
}
void tailscale::SetAddress(QString newAddr) {
control_url = newAddr;
}
QString tailscale::GetAddress() {
return control_url;
}
QString tailscale::DisplayAddress()
{
return control_url;

View File

@ -261,9 +261,18 @@ namespace Configs {
return {object, ""};
}
void wireguard::SetAddress(QString newAddr) {
peer->address = newAddr;
}
QString wireguard::GetAddress() {
return peer->address;
}
QString wireguard::DisplayAddress()
{
return ::DisplayAddress(peer->address, peer->port > 0);
return ::DisplayAddress(peer->address, peer->port);
}
QString wireguard::DisplayType()

View File

@ -784,17 +784,15 @@ namespace Configs {
bool RoutingChain::add_simple_process_rule(const QString& content, const std::shared_ptr<RouteRule>& rule, ruleType type)
{
auto sp = content.split(":");
if (sp.size() < 2) return false;
const QString& subType = sp[0];
if (subType == "processPath" && type == simpleProcessPath)
if (!content.contains(":")) return false;
auto prefix = content.first(content.indexOf(':'));
const QString& address = content.section(':', 1);
if (prefix == "processPath" && type == simpleProcessPath)
{
const QString& address = content.section(':', 1);
if (!rule->process_path.contains(address)) rule->process_path.append(address);
return true;
} else if (subType == "processName" && type == simpleProcessName && sp.size() == 2)
} else if (prefix == "processName" && type == simpleProcessName)
{
const QString& address = sp[1];
if (!rule->process_name.contains(address)) rule->process_name.append(address);
return true;
} else

View File

@ -1789,10 +1789,18 @@ void MainWindow::on_menu_export_config_triggered() {
msg.exec();
if (msg.clickedButton() == button_1) {
result = BuildSingBoxConfig(ent);
if (!result->error.isEmpty()) {
MessageBoxWarning("Build config error", result->error);
return;
}
config_core = QJsonObject2QString(result->coreConfig, true);
QApplication::clipboard()->setText(config_core);
} else if (msg.clickedButton() == button_2) {
auto res = Configs::BuildTestConfig({ent});
if (!res->error.isEmpty()) {
MessageBoxWarning("Build Test config error", res->error);
return;
}
config_core = QJsonObject2QString(res->coreConfig, true);
QApplication::clipboard()->setText(config_core);
}