mirror of
https://github.com/2dust/v2rayN.git
synced 2026-08-15 11:42:05 +03:00
CoreManager.RunProcess decided sudo elevation from the live mutable
_config.TunModeItem.EnableTun while the launched config was generated
from the immutable CoreConfigContext snapshot. If the TUN state changed
while a reload was in flight, a core whose config contains a TUN
inbound could launch without elevation and die within the 100ms health
check ("Failed to run core"), with no stderr shown.
The elevation decision now follows context.IsTunEnabled /
preContext.IsTunEnabled, so the generated config and the launch mode
always agree. With legacy TUN protect, the sing-box pre-core hosting
TUN is elevated and the main core no longer runs as root needlessly.
45 lines
1.6 KiB
C#
45 lines
1.6 KiB
C#
using AwesomeAssertions;
|
|
using ServiceLib.Enums;
|
|
using ServiceLib.Manager;
|
|
using Xunit;
|
|
|
|
namespace ServiceLib.Tests.Manager;
|
|
|
|
public class CoreManagerTests
|
|
{
|
|
[Theory]
|
|
[InlineData(ECoreType.sing_box)]
|
|
[InlineData(ECoreType.mihomo)]
|
|
[InlineData(ECoreType.Xray)]
|
|
public void ShouldRunAsSudo_TunLaunchOnNonWindows_RequiresElevation(ECoreType coreType)
|
|
{
|
|
CoreManager.ShouldRunAsSudo(isTunLaunch: true, coreType, isNonWindows: true).Should().BeTrue();
|
|
}
|
|
|
|
[Fact]
|
|
public void ShouldRunAsSudo_NonTunLaunch_ShouldNotElevate()
|
|
{
|
|
// Regression guard for the macOS TUN failure: the elevation decision must follow
|
|
// the context snapshot that generated the config. A launch whose snapshot has TUN
|
|
// disabled must never elevate, and a launch whose snapshot has TUN enabled must
|
|
// elevate regardless of later changes to the live config.
|
|
CoreManager.ShouldRunAsSudo(isTunLaunch: false, ECoreType.sing_box, isNonWindows: true).Should().BeFalse();
|
|
CoreManager.ShouldRunAsSudo(isTunLaunch: false, ECoreType.Xray, isNonWindows: true).Should().BeFalse();
|
|
}
|
|
|
|
[Fact]
|
|
public void ShouldRunAsSudo_OnWindows_ShouldNotElevate()
|
|
{
|
|
CoreManager.ShouldRunAsSudo(isTunLaunch: true, ECoreType.sing_box, isNonWindows: false).Should().BeFalse();
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData(ECoreType.v2fly)]
|
|
[InlineData(ECoreType.hysteria)]
|
|
[InlineData(null)]
|
|
public void ShouldRunAsSudo_UnsupportedCoreType_ShouldNotElevate(ECoreType? coreType)
|
|
{
|
|
CoreManager.ShouldRunAsSudo(isTunLaunch: true, coreType, isNonWindows: true).Should().BeFalse();
|
|
}
|
|
}
|