fix: preserve inner KCP mask when adding a header (#10577)

This commit is contained in:
shizukunacho
2026-11-13 14:16:55 +08:00
committed by GitHub
parent e57e122770
commit 750f2fa7db
2 changed files with 37 additions and 8 deletions
@@ -2,6 +2,38 @@ namespace ServiceLib.Tests.CoreConfig.V2ray;
public class CoreConfigV2rayServiceTests public class CoreConfigV2rayServiceTests
{ {
[Test]
[Arguments("demo-seed", "srtp", 2)]
[Arguments(null, "srtp", 2)]
[Arguments("demo-seed", "none", 1)]
[Arguments(null, "none", 1)]
public async Task GenerateClientConfigContent_KcpHeader_ShouldPreserveInnerMask(string? seed, string header, int expectedCount)
{
var config = CoreConfigTestFactory.CreateConfig(ECoreType.Xray);
CoreConfigTestFactory.BindAppManagerConfig(config);
var node = CoreConfigTestFactory.CreateVmessNode(ECoreType.Xray);
node.Network = nameof(ETransport.kcp);
node.SetTransportExtra(new TransportExtraItem { KcpSeed = seed, KcpHeaderType = header });
var context = CoreConfigTestFactory.CreateContext(config, node, ECoreType.Xray);
var result = new CoreConfigV2rayService(context).GenerateClientConfigContent();
await result.Success.Should().BeTrue();
var generatedConfig = JsonNode.Parse(result.Data!.ToString()!)!;
var proxy = generatedConfig["outbounds"]!.AsArray()
.First(outbound => outbound!["tag"]!.GetValue<string>() == Global.ProxyTag)!;
var masks = proxy["streamSettings"]!["finalmask"]!["udp"]!.AsArray();
await masks.Count.Should().BeEqualTo(expectedCount);
await masks[0]!["type"]!.GetValue<string>().Should().BeEqualTo("mkcp-legacy");
await (masks[0]!["settings"]?["value"]?.GetValue<string>()).Should().BeEqualTo(seed);
await (masks[0]!["settings"]?["header"]?.GetValue<string>()).Should().BeNull();
if (expectedCount == 2)
{
await masks[1]!["type"]!.GetValue<string>().Should().BeEqualTo("mkcp-legacy");
await masks[1]!["settings"]!["header"]!.GetValue<string>().Should().BeEqualTo(header);
}
}
[Test] [Test]
[Arguments(null)] [Arguments(null)]
[Arguments("")] [Arguments("")]
@@ -412,14 +412,11 @@ public partial class CoreConfigV2rayService
} }
if (Global.KcpHeaderMaskMap.TryGetValue(headerType, out var header)) if (Global.KcpHeaderMaskMap.TryGetValue(headerType, out var header))
{ {
kcpFinalmask.udp = kcpFinalmask.udp.Add(new Mask4Ray
[ {
new Mask4Ray type = "mkcp-legacy",
{ settings = new MaskSettings4Ray { header = header },
type = "mkcp-legacy", });
settings = new MaskSettings4Ray { header = header },
},
];
} }
streamSettings.kcpSettings = kcpSettings; streamSettings.kcpSettings = kcpSettings;
streamSettings.finalmask = (JsonObject)JsonUtils.SerializeToNode(kcpFinalmask); streamSettings.finalmask = (JsonObject)JsonUtils.SerializeToNode(kcpFinalmask);