Support group config type

This commit is contained in:
DHR60 2026-01-07 16:21:20 +08:00
parent 6174e93ad6
commit 48d549fd14
3 changed files with 90 additions and 4 deletions

View file

@ -316,5 +316,72 @@ public class ProfileGroupItemManager
return childAddresses; return childAddresses;
} }
public static async Task<HashSet<string>> GetAllChildEchQuerySni(string indexId)
{
// include grand children
var childAddresses = new HashSet<string>();
if (!Instance.TryGet(indexId, out var groupItem) || groupItem == null)
{
return childAddresses;
}
if (groupItem.SubChildItems.IsNotEmpty())
{
var subItems = await GetSubChildProfileItems(groupItem);
foreach (var childNode in subItems)
{
if (childNode.EchConfigList.IsNullOrEmpty())
{
continue;
}
if (childNode.StreamSecurity == Global.StreamSecurity
&& childNode.EchConfigList?.Contains("://") == true)
{
var idx = childNode.EchConfigList.IndexOf('+');
childAddresses.Add(idx > 0 ? childNode.EchConfigList[..idx] : childNode.Sni);
}
else
{
childAddresses.Add(childNode.Sni);
}
}
}
var childIds = Utils.String2List(groupItem.ChildItems) ?? [];
foreach (var childId in childIds)
{
var childNode = await AppManager.Instance.GetProfileItem(childId);
if (childNode == null)
{
continue;
}
if (!childNode.IsComplex() && !childNode.EchConfigList.IsNullOrEmpty())
{
if (childNode.StreamSecurity == Global.StreamSecurity
&& childNode.EchConfigList?.Contains("://") == true)
{
var idx = childNode.EchConfigList.IndexOf('+');
childAddresses.Add(idx > 0 ? childNode.EchConfigList[..idx] : childNode.Sni);
}
else
{
childAddresses.Add(childNode.Sni);
}
}
else if (childNode.ConfigType.IsGroupType())
{
var subAddresses = await GetAllChildDomainAddresses(childNode.IndexId);
foreach (var addr in subAddresses)
{
childAddresses.Add(addr);
}
}
}
return childAddresses;
}
#endregion Helper #endregion Helper
} }

View file

@ -371,7 +371,7 @@ public partial class CoreConfigSingboxService(Config config)
await GenRouting(singboxConfig); await GenRouting(singboxConfig);
await GenExperimental(singboxConfig); await GenExperimental(singboxConfig);
await GenDns(null, singboxConfig); await GenDns(parentNode, singboxConfig);
await ConvertGeo2Ruleset(singboxConfig); await ConvertGeo2Ruleset(singboxConfig);
ret.Success = true; ret.Success = true;
@ -428,7 +428,7 @@ public partial class CoreConfigSingboxService(Config config)
await GenRouting(singboxConfig); await GenRouting(singboxConfig);
await GenExperimental(singboxConfig); await GenExperimental(singboxConfig);
await GenDns(null, singboxConfig); await GenDns(parentNode, singboxConfig);
await ConvertGeo2Ruleset(singboxConfig); await ConvertGeo2Ruleset(singboxConfig);
ret.Success = true; ret.Success = true;

View file

@ -153,6 +153,12 @@ public partial class CoreConfigSingboxService
} }
singboxConfig.dns.servers.Add(echDnsObject); singboxConfig.dns.servers.Add(echDnsObject);
} }
else if (node?.ConfigType.IsGroupType() == true)
{
var echDnsObject = JsonUtils.DeepCopy(directDns);
echDnsObject.tag = Global.SingboxEchDNSTag;
singboxConfig.dns.servers.Add(echDnsObject);
}
return await Task.FromResult(0); return await Task.FromResult(0);
} }
@ -193,14 +199,27 @@ public partial class CoreConfigSingboxService
&& node?.EchConfigList?.Contains("://") == true) && node?.EchConfigList?.Contains("://") == true)
{ {
var idx = node.EchConfigList.IndexOf('+'); var idx = node.EchConfigList.IndexOf('+');
var queryServerName = idx > 0 ? node.EchConfigList[..idx] : node.Sni; List<string> queryServerNames = [(idx > 0 ? node.EchConfigList[..idx] : node.Sni)];
singboxConfig.dns.rules.Add(new() singboxConfig.dns.rules.Add(new()
{ {
query_type = new List<int> { 64, 65 }, query_type = new List<int> { 64, 65 },
server = Global.SingboxEchDNSTag, server = Global.SingboxEchDNSTag,
domain = [queryServerName], domain = queryServerNames,
}); });
} }
else if (node?.ConfigType.IsGroupType() == true)
{
var queryServerNames = (await ProfileGroupItemManager.GetAllChildEchQuerySni(node.IndexId)).ToList();
if (queryServerNames.Count > 0)
{
singboxConfig.dns.rules.Add(new()
{
query_type = new List<int> { 64, 65 },
server = Global.SingboxEchDNSTag,
domain = queryServerNames,
});
}
}
if (simpleDNSItem.BlockBindingQuery == true) if (simpleDNSItem.BlockBindingQuery == true)
{ {