mirror of
https://github.com/2dust/v2rayN.git
synced 2026-04-14 19:45:45 +00:00
Merge 935d9e0aa3 into e19b000081
This commit is contained in:
commit
e183ad35bf
4 changed files with 58 additions and 19 deletions
|
|
@ -46,7 +46,7 @@ public static class ProcUtils
|
|||
return null;
|
||||
}
|
||||
|
||||
public static void RebootAsAdmin(bool blAdmin = true)
|
||||
public static bool RebootAsAdmin(bool blAdmin = true)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
|
@ -58,11 +58,12 @@ public static class ProcUtils
|
|||
FileName = Utils.GetExePath().AppendQuotes(),
|
||||
Verb = blAdmin ? "runas" : null,
|
||||
};
|
||||
_ = Process.Start(startInfo);
|
||||
return Process.Start(startInfo) != null;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logging.SaveLog(_tag, ex);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -144,10 +144,16 @@ public sealed class AppManager
|
|||
AppEvents.ShutdownRequested.Publish(byUser);
|
||||
}
|
||||
|
||||
public async Task RebootAsAdmin()
|
||||
public async Task<bool> RebootAsAdmin()
|
||||
{
|
||||
ProcUtils.RebootAsAdmin();
|
||||
var started = ProcUtils.RebootAsAdmin();
|
||||
if (!started)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
await AppManager.Instance.AppExitAsync(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
#endregion App
|
||||
|
|
|
|||
|
|
@ -345,6 +345,14 @@ public partial class CoreConfigSingboxService
|
|||
{
|
||||
try
|
||||
{
|
||||
// The synthetic TUN relay outbound talks to the local Xray shadowsocks relay.
|
||||
// Xray cannot terminate sing-box h2mux, so muxing here turns local relay traffic
|
||||
// into sp.mux.sing-box.arpa pseudo-destinations and breaks DNS over TUN.
|
||||
if (IsTunRelayProxyOutbound())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var muxEnabled = _node.MuxEnabled ?? _config.CoreBasicItem.MuxEnabled;
|
||||
if (muxEnabled && _config.Mux4SboxItem.Protocol.IsNotEmpty())
|
||||
{
|
||||
|
|
@ -364,6 +372,21 @@ public partial class CoreConfigSingboxService
|
|||
}
|
||||
}
|
||||
|
||||
private bool IsTunRelayProxyOutbound()
|
||||
{
|
||||
if (!context.IsTunEnabled
|
||||
|| _node.ConfigType != EConfigType.Shadowsocks
|
||||
|| _node.Address != Global.Loopback
|
||||
|| _node.Port != context.ProxyRelaySsPort
|
||||
|| _node.Password != Global.None)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
var protocolExtra = _node.GetProtocolExtra();
|
||||
return protocolExtra.SsMethod == Global.None;
|
||||
}
|
||||
|
||||
private void FillOutboundTls(Outbound4Sbox outbound)
|
||||
{
|
||||
try
|
||||
|
|
|
|||
|
|
@ -469,18 +469,21 @@ public class StatusBarViewModel : MyReactiveObject
|
|||
return;
|
||||
}
|
||||
|
||||
_config.TunModeItem.EnableTun = EnableTun;
|
||||
|
||||
if (EnableTun && AllowEnableTun() == false)
|
||||
var allowEnableTun = AllowEnableTun();
|
||||
if (PrepareTunConfigForPrivilegeEscalation(_config, EnableTun, allowEnableTun, Utils.IsWindows()))
|
||||
{
|
||||
// When running as a non-administrator, reboot to administrator mode
|
||||
if (Utils.IsWindows())
|
||||
await ConfigHandler.SaveConfig(_config);
|
||||
if (!await AppManager.Instance.RebootAsAdmin())
|
||||
{
|
||||
_config.TunModeItem.EnableTun = false;
|
||||
await AppManager.Instance.RebootAsAdmin();
|
||||
EnableTun = false;
|
||||
await ConfigHandler.SaveConfig(_config);
|
||||
NoticeManager.Instance.SendMessageEx(ResUI.OperationFailed);
|
||||
}
|
||||
return;
|
||||
}
|
||||
else
|
||||
|
||||
if (EnableTun && !allowEnableTun)
|
||||
{
|
||||
bool? passwordResult = await _updateView?.Invoke(EViewAction.PasswordInput, null);
|
||||
if (passwordResult == false)
|
||||
|
|
@ -489,11 +492,17 @@ public class StatusBarViewModel : MyReactiveObject
|
|||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
await ConfigHandler.SaveConfig(_config);
|
||||
AppEvents.ReloadRequested.Publish();
|
||||
}
|
||||
|
||||
private static bool PrepareTunConfigForPrivilegeEscalation(Config config, bool enableTun, bool allowEnableTun, bool isWindows)
|
||||
{
|
||||
config.TunModeItem.EnableTun = enableTun;
|
||||
return enableTun && !allowEnableTun && isWindows;
|
||||
}
|
||||
|
||||
private bool AllowEnableTun()
|
||||
{
|
||||
if (Utils.IsWindows())
|
||||
|
|
|
|||
Loading…
Reference in a new issue