From 1b8bddabc8c8c3a5b9ec33e2e1a2e7fcd7f8e506 Mon Sep 17 00:00:00 2001 From: John Gross Date: Thu, 29 Oct 2020 13:25:23 -0700 Subject: [PATCH 1/5] Add event to override Torch command permission checker --- Torch/Commands/CommandManager.cs | 25 +++++++++++++++++++------ docs/_config.yml | 1 - docs/index.md | 1 - 3 files changed, 19 insertions(+), 8 deletions(-) delete mode 100644 docs/_config.yml delete mode 100644 docs/index.md diff --git a/Torch/Commands/CommandManager.cs b/Torch/Commands/CommandManager.cs index d3020d1..2ec6d8f 100644 --- a/Torch/Commands/CommandManager.cs +++ b/Torch/Commands/CommandManager.cs @@ -17,11 +17,13 @@ using VRage.Network; namespace Torch.Commands { + public delegate void CommandExecutingDel(Command command, IMyPlayer player, bool hasPermission, ref bool? hasPermissionOverride); + public class CommandManager : Manager { public char Prefix { get; set; } - public CommandTree Commands { get; set; } = new CommandTree(); + public event CommandExecutingDel OnCommandExecuting; private Logger _log = LogManager.GetCurrentClassLogger(); [Dependency] private IChatManagerServer _chatManager; @@ -124,7 +126,6 @@ namespace Torch.Commands public void HandleCommand(string message, ulong steamId, ref bool consumed, bool serverConsole = false) { - if (message.Length < 1 || message[0] != Prefix) return; @@ -144,11 +145,23 @@ namespace Torch.Commands { var cmdPath = string.Join(".", command.Path); - if (!HasPermission(steamId, command)) + var defaultPermission = HasPermission(steamId, command); + bool? cancel = null; + OnCommandExecuting?.Invoke(command, player, defaultPermission, ref cancel); + + if (cancel.HasValue) { - _log.Info($"{player.DisplayName} tried to use command {cmdPath} without permission"); - _chatManager.SendMessageAsOther(null, $"You need to be a {command.MinimumPromoteLevel} or higher to use that command.", targetSteamId: steamId); - return; + if (cancel.Value) + return; + } + else + { + if (!defaultPermission) + { + _log.Info($"{player.DisplayName} tried to use command {cmdPath} without permission"); + _chatManager.SendMessageAsOther(null, $"You need to be a {command.MinimumPromoteLevel} or higher to use that command.", targetSteamId: steamId); + return; + } } var splitArgs = Regex.Matches(argText, "(\"[^\"]+\"|\\S+)").Cast().Select(x => x.ToString().Replace("\"", "")).ToList(); diff --git a/docs/_config.yml b/docs/_config.yml deleted file mode 100644 index 75e2535..0000000 --- a/docs/_config.yml +++ /dev/null @@ -1 +0,0 @@ -theme: jekyll-theme-modernist diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index d50dffe..0000000 --- a/docs/index.md +++ /dev/null @@ -1 +0,0 @@ -# Torch From fb9dbf40daf7fcff8d05affdf1ead854315a40b1 Mon Sep 17 00:00:00 2001 From: John Gross Date: Thu, 29 Oct 2020 13:27:35 -0700 Subject: [PATCH 2/5] Correct permission override condition --- Torch/Commands/CommandManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Torch/Commands/CommandManager.cs b/Torch/Commands/CommandManager.cs index 2ec6d8f..80fcdb4 100644 --- a/Torch/Commands/CommandManager.cs +++ b/Torch/Commands/CommandManager.cs @@ -151,7 +151,7 @@ namespace Torch.Commands if (cancel.HasValue) { - if (cancel.Value) + if (!cancel.Value) return; } else From b12acddab3dc0a6d88da1b9f08cb8f97b656d43c Mon Sep 17 00:00:00 2001 From: Jimmacle Date: Thu, 29 Oct 2020 14:04:30 -0700 Subject: [PATCH 3/5] Command perms (#408) * Add event to override Torch command permission checker * Correct permission override condition --- Torch/Commands/CommandManager.cs | 25 +++++++++++++++++++------ docs/_config.yml | 1 - docs/index.md | 1 - 3 files changed, 19 insertions(+), 8 deletions(-) delete mode 100644 docs/_config.yml delete mode 100644 docs/index.md diff --git a/Torch/Commands/CommandManager.cs b/Torch/Commands/CommandManager.cs index d3020d1..80fcdb4 100644 --- a/Torch/Commands/CommandManager.cs +++ b/Torch/Commands/CommandManager.cs @@ -17,11 +17,13 @@ using VRage.Network; namespace Torch.Commands { + public delegate void CommandExecutingDel(Command command, IMyPlayer player, bool hasPermission, ref bool? hasPermissionOverride); + public class CommandManager : Manager { public char Prefix { get; set; } - public CommandTree Commands { get; set; } = new CommandTree(); + public event CommandExecutingDel OnCommandExecuting; private Logger _log = LogManager.GetCurrentClassLogger(); [Dependency] private IChatManagerServer _chatManager; @@ -124,7 +126,6 @@ namespace Torch.Commands public void HandleCommand(string message, ulong steamId, ref bool consumed, bool serverConsole = false) { - if (message.Length < 1 || message[0] != Prefix) return; @@ -144,11 +145,23 @@ namespace Torch.Commands { var cmdPath = string.Join(".", command.Path); - if (!HasPermission(steamId, command)) + var defaultPermission = HasPermission(steamId, command); + bool? cancel = null; + OnCommandExecuting?.Invoke(command, player, defaultPermission, ref cancel); + + if (cancel.HasValue) { - _log.Info($"{player.DisplayName} tried to use command {cmdPath} without permission"); - _chatManager.SendMessageAsOther(null, $"You need to be a {command.MinimumPromoteLevel} or higher to use that command.", targetSteamId: steamId); - return; + if (!cancel.Value) + return; + } + else + { + if (!defaultPermission) + { + _log.Info($"{player.DisplayName} tried to use command {cmdPath} without permission"); + _chatManager.SendMessageAsOther(null, $"You need to be a {command.MinimumPromoteLevel} or higher to use that command.", targetSteamId: steamId); + return; + } } var splitArgs = Regex.Matches(argText, "(\"[^\"]+\"|\\S+)").Cast().Select(x => x.ToString().Replace("\"", "")).ToList(); diff --git a/docs/_config.yml b/docs/_config.yml deleted file mode 100644 index 75e2535..0000000 --- a/docs/_config.yml +++ /dev/null @@ -1 +0,0 @@ -theme: jekyll-theme-modernist diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index d50dffe..0000000 --- a/docs/index.md +++ /dev/null @@ -1 +0,0 @@ -# Torch From 93167f349d2149bfb7e8ef70930acde0d6383036 Mon Sep 17 00:00:00 2001 From: Bishbash777 <50243964+Bishbash777@users.noreply.github.com> Date: Tue, 3 Nov 2020 22:04:17 +0000 Subject: [PATCH 4/5] new chat event to allow access to msg properties (#411) * new chat event to allow access to msg properties * Naming conventions reee Co-authored-by: Jimmacle --- Torch/Managers/ChatManager/ChatManagerServer.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Torch/Managers/ChatManager/ChatManagerServer.cs b/Torch/Managers/ChatManager/ChatManagerServer.cs index 7505985..866feaf 100644 --- a/Torch/Managers/ChatManager/ChatManagerServer.cs +++ b/Torch/Managers/ChatManager/ChatManagerServer.cs @@ -24,10 +24,12 @@ using VRageMath; namespace Torch.Managers.ChatManager { + public delegate void ChatReceivedDel(ref ChatMsg msg); [PatchShim] internal static class ChatInterceptPatch { private static ChatManagerServer _chatManager; + public static event ChatReceivedDel OnChatRecvAccess; private static ChatManagerServer ChatManager => _chatManager ?? (_chatManager = TorchBase.Instance.CurrentSession.Managers.GetManager()); internal static void Patch(PatchContext context) @@ -40,6 +42,7 @@ namespace Torch.Managers.ChatManager private static bool PrefixMessageProcessing(ref ChatMsg msg) { var consumed = false; + OnChatRecvAccess?.Invoke(ref msg); ChatManager.RaiseMessageRecieved(msg, ref consumed); return !consumed; } From c3e65a5bdd05ff38887f4f14d3b7b38fa71dc23a Mon Sep 17 00:00:00 2001 From: John Gross Date: Wed, 25 Nov 2020 11:32:05 -0800 Subject: [PATCH 5/5] Tentative fix for 2020-11-25 update --- .../Managers/MultiplayerManagerDedicated.cs | 13 +++++++------ Torch.Server/ViewModels/CheckpointViewModel.cs | 8 -------- Torch/Commands/TorchCommands.cs | 15 ++++++++------- .../Reflected/ReflectedEventReplaceAttribute.cs | 9 +++++++++ Torch/VRageGame.cs | 8 +++++--- 5 files changed, 29 insertions(+), 24 deletions(-) diff --git a/Torch.Server/Managers/MultiplayerManagerDedicated.cs b/Torch.Server/Managers/MultiplayerManagerDedicated.cs index d89e500..5573d55 100644 --- a/Torch.Server/Managers/MultiplayerManagerDedicated.cs +++ b/Torch.Server/Managers/MultiplayerManagerDedicated.cs @@ -156,11 +156,11 @@ namespace Torch.Server.Managers #pragma warning disable 649 - [ReflectedEventReplace(typeof(MySteamGameServer), nameof(MySteamGameServer.ValidateAuthTicketResponse), + [ReflectedEventReplace("VRage.Steam.MySteamGameServer, VRage.Steam", "ValidateAuthTicketResponse", typeof(MyDedicatedServerBase), "GameServer_ValidateAuthTicketResponse")] private static Func _gameServerValidateAuthTicketFactory; - [ReflectedEventReplace(typeof(MySteamGameServer), nameof(MySteamGameServer.UserGroupStatusResponse), + [ReflectedEventReplace("VRage.Steam.MySteamGameServer, VRage.Steam", "UserGroupStatusResponse", typeof(MyDedicatedServerBase), "GameServer_UserGroupStatus")] private static Func _gameServerUserGroupStatusFactory; @@ -216,15 +216,16 @@ namespace Torch.Server.Managers //Largely copied from SE private void ValidateAuthTicketResponse(ulong steamId, JoinResult response, ulong steamOwner) { - var state = new MyP2PSessionState(); - MySteamServiceWrapper.Static.Peer2Peer.GetSessionState(steamId, ref state); - var ip = new IPAddress(BitConverter.GetBytes(state.RemoteIP).Reverse().ToArray()); + // TODO: Find another way to do this + //var state = new MyP2PSessionState(); + //MySteamServiceWrapper.Static.Peer2Peer.GetSessionState(steamId, ref state); + //var ip = new IPAddress(BitConverter.GetBytes(state.RemoteIP).Reverse().ToArray()); Torch.CurrentSession.KeenSession.PromotedUsers.TryGetValue(steamId, out MyPromoteLevel promoteLevel); _log.Debug($"ValidateAuthTicketResponse(user={steamId}, response={response}, owner={steamOwner}, permissions={promoteLevel})"); - _log.Info($"Connection attempt by {steamId} from {ip}"); + _log.Info($"Connection attempt by {steamId}"); if (IsProfiling(steamId)) { diff --git a/Torch.Server/ViewModels/CheckpointViewModel.cs b/Torch.Server/ViewModels/CheckpointViewModel.cs index d1882b6..b058e69 100644 --- a/Torch.Server/ViewModels/CheckpointViewModel.cs +++ b/Torch.Server/ViewModels/CheckpointViewModel.cs @@ -115,14 +115,6 @@ namespace Torch.Server.ViewModels public DateTime InGameTime { get => _checkpoint.InGameTime; set => SetValue(ref _checkpoint.InGameTime, value); } - public MyObjectBuilder_SessionComponentMission MissionTriggers { get => _checkpoint.MissionTriggers; set => SetValue(ref _checkpoint.MissionTriggers, value); } - - public string Briefing { get => _checkpoint.Briefing; set => SetValue(ref _checkpoint.Briefing, value); } - - public string BriefingVideo { get => _checkpoint.BriefingVideo; set => SetValue(ref _checkpoint.BriefingVideo, value); } - - public string CustomLoadingScreenImage { get => _checkpoint.CustomLoadingScreenImage; set => SetValue(ref _checkpoint.BriefingVideo, value); } - public string CustomLoadingScreenText { get => _checkpoint.CustomLoadingScreenText; set => SetValue(ref _checkpoint.CustomLoadingScreenText, value); } public string CustomSkybox { get => _checkpoint.CustomSkybox; set => SetValue(ref _checkpoint.CustomSkybox, value); } diff --git a/Torch/Commands/TorchCommands.cs b/Torch/Commands/TorchCommands.cs index 2e4ee66..f393a5a 100644 --- a/Torch/Commands/TorchCommands.cs +++ b/Torch/Commands/TorchCommands.cs @@ -37,13 +37,14 @@ namespace Torch.Commands [Permission(MyPromoteLevel.None)] public void GetIP(ulong steamId = 0) { - if (steamId == 0) - steamId = Context.Player.SteamUserId; - - VRage.GameServices.MyP2PSessionState statehack = new VRage.GameServices.MyP2PSessionState(); - MySteamServiceWrapper.Static.Peer2Peer.GetSessionState(steamId, ref statehack); - var ip = new IPAddress(BitConverter.GetBytes(statehack.RemoteIP).Reverse().ToArray()); - Context.Respond($"Your IP is {ip}"); + Context.Respond("Command no longer working!"); + //if (steamId == 0) + // steamId = Context.Player.SteamUserId; + // + //VRage.GameServices.MyP2PSessionState statehack = new VRage.GameServices.MyP2PSessionState(); + //MySteamServiceWrapper.Static.Peer2Peer.GetSessionState(steamId, ref statehack); + //var ip = new IPAddress(BitConverter.GetBytes(statehack.RemoteIP).Reverse().ToArray()); + //Context.Respond($"Your IP is {ip}"); } [Command("help", "Displays help for a command")] diff --git a/Torch/Utils/Reflected/ReflectedEventReplaceAttribute.cs b/Torch/Utils/Reflected/ReflectedEventReplaceAttribute.cs index 948614d..2eca09f 100644 --- a/Torch/Utils/Reflected/ReflectedEventReplaceAttribute.cs +++ b/Torch/Utils/Reflected/ReflectedEventReplaceAttribute.cs @@ -47,5 +47,14 @@ namespace Torch.Utils TargetDeclaringType = targetDeclaringType; TargetName = targetName; } + + public ReflectedEventReplaceAttribute(string eventDeclaringType, string eventName, Type targetDeclaringType, + string targetName) + { + EventDeclaringType = Type.GetType(eventDeclaringType); + EventName = eventName; + TargetDeclaringType = targetDeclaringType; + TargetName = targetName; + } } } \ No newline at end of file diff --git a/Torch/VRageGame.cs b/Torch/VRageGame.cs index d0a0547..ce83452 100644 --- a/Torch/VRageGame.cs +++ b/Torch/VRageGame.cs @@ -135,13 +135,15 @@ namespace Torch private void Create() { - bool dedicated = Sandbox.Engine.Platform.Game.IsDedicated; + bool dedicated = true; Environment.SetEnvironmentVariable("SteamAppId", _appSteamId.ToString()); - var service = MySteamServiceWrapper.Init(dedicated, _appSteamId); + var service = MySteamGameService.Create(true, _appSteamId); MyServiceManager.Instance.AddService(service); var serviceInstance = MySteamUgcService.Create(_appSteamId, service); MyServiceManager.Instance.AddService(serviceInstance); - if (dedicated && !MyGameService.HasGameServer) + MyServiceManager.Instance.AddService(new MyNullMicrophone()); + MySteamGameService.InitNetworking(dedicated, service); + if (!MyGameService.HasGameServer) { _log.Warn("Steam service is not running! Please reinstall dedicated server."); return;