mirror of
https://github.com/2dust/v2rayN.git
synced 2026-01-18 13:17:05 +00:00
Add process matching rules support
This commit is contained in:
parent
fe183798b6
commit
2297338003
4 changed files with 63 additions and 4 deletions
|
|
@ -68,6 +68,7 @@ public class Rule4Sbox
|
|||
public List<string>? ip_cidr { get; set; }
|
||||
public List<string>? source_ip_cidr { get; set; }
|
||||
public List<string>? process_name { get; set; }
|
||||
public List<string>? process_path { get; set; }
|
||||
public List<string>? rule_set { get; set; }
|
||||
public List<Rule4Sbox>? rules { get; set; }
|
||||
public string? action { get; set; }
|
||||
|
|
|
|||
|
|
@ -256,6 +256,8 @@ public class RulesItem4Ray
|
|||
public List<string>? domain { get; set; }
|
||||
|
||||
public List<string>? protocol { get; set; }
|
||||
|
||||
public List<string>? process { get; set; }
|
||||
}
|
||||
|
||||
public class BalancersItem4Ray
|
||||
|
|
|
|||
|
|
@ -278,11 +278,51 @@ public partial class CoreConfigSingboxService
|
|||
}
|
||||
}
|
||||
|
||||
if (_config.TunModeItem.EnableTun && item.Process?.Count > 0)
|
||||
if (item.Process?.Count > 0)
|
||||
{
|
||||
rule3.process_name = item.Process;
|
||||
rules.Add(rule3);
|
||||
hasDomainIp = true;
|
||||
var ruleProcName = JsonUtils.DeepCopy(rule3);
|
||||
var ruleProcPath = JsonUtils.DeepCopy(rule3);
|
||||
foreach (var process in item.Process)
|
||||
{
|
||||
// sing-box doesn't support this, fall back to process name match
|
||||
if (process is "self/" or "xray/")
|
||||
{
|
||||
ruleProcName.process_name.Add(Utils.GetExeName("sing-box"));
|
||||
continue;
|
||||
}
|
||||
|
||||
if (process.Contains('/') || process.Contains('\\'))
|
||||
{
|
||||
var procPath = process;
|
||||
if (Utils.IsWindows())
|
||||
{
|
||||
procPath = procPath.Replace('/', '\\');
|
||||
}
|
||||
ruleProcPath.process_path.Add(procPath);
|
||||
continue;
|
||||
}
|
||||
|
||||
// sing-box strictly matches the exe suffix on Windows
|
||||
var procName = process;
|
||||
if (Utils.IsWindows() && !procName.EndsWith(".exe", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
procName += ".exe";
|
||||
}
|
||||
|
||||
ruleProcName.process_name.Add(procName);
|
||||
}
|
||||
|
||||
if (ruleProcName.process_name.Count > 0)
|
||||
{
|
||||
rules.Add(ruleProcName);
|
||||
hasDomainIp = true;
|
||||
}
|
||||
|
||||
if (ruleProcPath.process_path.Count > 0)
|
||||
{
|
||||
rules.Add(ruleProcPath);
|
||||
hasDomainIp = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!hasDomainIp
|
||||
|
|
|
|||
|
|
@ -77,12 +77,17 @@ public partial class CoreConfigV2rayService
|
|||
{
|
||||
rule.inboundTag = null;
|
||||
}
|
||||
if (rule.process?.Count == 0)
|
||||
{
|
||||
rule.process = null;
|
||||
}
|
||||
|
||||
var hasDomainIp = false;
|
||||
if (rule.domain?.Count > 0)
|
||||
{
|
||||
var it = JsonUtils.DeepCopy(rule);
|
||||
it.ip = null;
|
||||
it.process = null;
|
||||
it.type = "field";
|
||||
for (var k = it.domain.Count - 1; k >= 0; k--)
|
||||
{
|
||||
|
|
@ -99,6 +104,17 @@ public partial class CoreConfigV2rayService
|
|||
{
|
||||
var it = JsonUtils.DeepCopy(rule);
|
||||
it.domain = null;
|
||||
it.process = null;
|
||||
it.type = "field";
|
||||
v2rayConfig.routing.rules.Add(it);
|
||||
hasDomainIp = true;
|
||||
}
|
||||
|
||||
if (rule.process?.Count > 0)
|
||||
{
|
||||
var it = JsonUtils.DeepCopy(rule);
|
||||
it.domain = null;
|
||||
it.ip = null;
|
||||
it.type = "field";
|
||||
v2rayConfig.routing.rules.Add(it);
|
||||
hasDomainIp = true;
|
||||
|
|
|
|||
Loading…
Reference in a new issue