diff --git a/Subsurface/Source/DebugConsole.cs b/Subsurface/Source/DebugConsole.cs index d18889d4e..2e3947bc7 100644 --- a/Subsurface/Source/DebugConsole.cs +++ b/Subsurface/Source/DebugConsole.cs @@ -6,6 +6,7 @@ using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Barotrauma.Networking; using Barotrauma.Items.Components; +using System.Text; namespace Barotrauma { @@ -123,7 +124,6 @@ namespace Barotrauma if (PlayerInput.KeyDown(Keys.Enter) && textBox.Text != "") { - NewMessage(textBox.Text, Color.White); ExecuteCommand(textBox.Text, game); textBox.Text = ""; @@ -165,6 +165,7 @@ namespace Barotrauma case "netstats": case "help": case "dumpids": + case "admin": return true; default: return false; @@ -175,7 +176,11 @@ namespace Barotrauma { if (string.IsNullOrWhiteSpace(command)) return; string[] commands = command.Split(' '); - + + if (!commands[0].ToLowerInvariant().Equals("admin")) + { + NewMessage(textBox.Text, Color.White); + } #if !DEBUG if (GameMain.Client != null && !IsCommandPermitted(commands[0].ToLowerInvariant(), GameMain.Client)) @@ -370,6 +375,17 @@ namespace Barotrauma case "enablecrewai": HumanAIController.DisableCrewAI = false; break; + case "admin": + if (GameMain.Server != null) + { + GameMain.Server.AdminAuthPass = commands[1]; + + } + else if (GameMain.Client != null) + { + GameMain.Client.RequestAdminAuth(commands[1]); + } + break; case "kick": if (GameMain.NetworkMember == null || commands.Length < 2) break; GameMain.NetworkMember.KickPlayer(string.Join(" ", commands.Skip(1)), false); diff --git a/Subsurface/Source/Networking/Client.cs b/Subsurface/Source/Networking/Client.cs index 8ddece05c..5d3e6ee96 100644 --- a/Subsurface/Source/Networking/Client.cs +++ b/Subsurface/Source/Networking/Client.cs @@ -52,13 +52,13 @@ namespace Barotrauma.Networking public float deleteDisconnectedTimer; - public ClientPermissions Permissions; + public ClientPermissions Permissions = ClientPermissions.None; public int KickVoteCount { get { return kickVoters.Count; } } - + public Client(NetPeer server, string name, byte ID) : this(name, ID) { @@ -129,7 +129,7 @@ namespace Barotrauma.Networking public bool HasPermission(ClientPermissions permission) { - return false; //Permissions.HasFlag(permission); + return this.Permissions.HasFlag(permission); } public T GetVote(VoteType voteType) diff --git a/Subsurface/Source/Networking/GameClient.cs b/Subsurface/Source/Networking/GameClient.cs index 10d3a03ed..887b7854b 100644 --- a/Subsurface/Source/Networking/GameClient.cs +++ b/Subsurface/Source/Networking/GameClient.cs @@ -26,7 +26,7 @@ namespace Barotrauma.Networking private GUIButton endRoundButton; private GUITickBox endVoteTickBox; - private ClientPermissions permissions; + private ClientPermissions permissions = ClientPermissions.None; private bool connected; @@ -839,7 +839,7 @@ namespace Barotrauma.Networking public bool HasPermission(ClientPermissions permission) { - return false;// permissions.HasFlag(permission); + return permissions.HasFlag(permission); } public override void Draw(Microsoft.Xna.Framework.Graphics.SpriteBatch spriteBatch) @@ -1026,6 +1026,15 @@ namespace Barotrauma.Networking client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered); } + public void RequestAdminAuth(string pass) + { + NetOutgoingMessage msg = client.CreateMessage(); + msg.Write((byte)PacketTypes.RequestAdminAuth); + msg.Write(Encoding.UTF8.GetString(NetUtility.ComputeSHAHash(Encoding.UTF8.GetBytes(pass)))); + + client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered); + } + public override void KickPlayer(string kickedName, bool ban, bool range = false) { if (!permissions.HasFlag(ClientPermissions.Kick) && !ban) return; @@ -1036,7 +1045,7 @@ namespace Barotrauma.Networking msg.Write(ban); msg.Write(kickedName); - client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered); + client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered); } public bool VoteForKick(GUIButton button, object userdata) diff --git a/Subsurface/Source/Networking/GameServer.cs b/Subsurface/Source/Networking/GameServer.cs index 19907eeb1..0ec6463da 100644 --- a/Subsurface/Source/Networking/GameServer.cs +++ b/Subsurface/Source/Networking/GameServer.cs @@ -55,6 +55,8 @@ namespace Barotrauma.Networking name = name.Replace(":", ""); name = name.Replace(";", ""); + AdminAuthPass = ""; + this.name = name; this.password = ""; if (password.Length>0) @@ -551,6 +553,32 @@ namespace Barotrauma.Networking EndGame(); } break; + case (byte)PacketTypes.RequestAdminAuth: + string pass = inc.ReadString(); + if (adminAuthPass.Length == 0) + { + Log(sender.name + " tried to become admin!", Color.Red); + return; + } + if (adminAuthPass==pass) + { + if (sender.Permissions == ClientPermissions.None) + { + Log(sender.name + " is now an admin.", Color.Yellow); + sender.SetPermissions(ClientPermissions.Kick | ClientPermissions.Ban | ClientPermissions.EndRound); + } + else + { + Log(sender.name + " is no longer an admin.", Color.Yellow); + sender.SetPermissions(ClientPermissions.None); + } + UpdateClientPermissions(sender); + } + else + { + Log(sender.name + " has failed admin authentication!", Color.Red); + } + break; case (byte)PacketTypes.KickPlayer: bool ban = inc.ReadBoolean(); string kickedName = inc.ReadString(); @@ -561,7 +589,6 @@ namespace Barotrauma.Networking if (ban && !sender.HasPermission(ClientPermissions.Ban)) { Log(sender.name + " attempted to ban " + kickedClient.name + " (insufficient permissions)", Color.Red); - } else if (!sender.HasPermission(ClientPermissions.Kick)) { diff --git a/Subsurface/Source/Networking/GameServerLogin.cs b/Subsurface/Source/Networking/GameServerLogin.cs index adf3d3de5..66ab12f7c 100644 --- a/Subsurface/Source/Networking/GameServerLogin.cs +++ b/Subsurface/Source/Networking/GameServerLogin.cs @@ -198,6 +198,10 @@ namespace Barotrauma.Networking { newClient.SetPermissions(savedPermissions.Permissions); } + else + { + newClient.SetPermissions(ClientPermissions.None); + } connectedClients.Add(newClient); diff --git a/Subsurface/Source/Networking/GameServerSettings.cs b/Subsurface/Source/Networking/GameServerSettings.cs index 41432ee04..b89738ede 100644 --- a/Subsurface/Source/Networking/GameServerSettings.cs +++ b/Subsurface/Source/Networking/GameServerSettings.cs @@ -63,6 +63,20 @@ namespace Barotrauma.Networking private string password; + private string adminAuthPass = ""; + public string AdminAuthPass + { + set + { + DebugConsole.NewMessage("Admin auth pass changed!",Color.Yellow); + adminAuthPass = ""; + if (value.Length > 0) + { + adminAuthPass = Encoding.UTF8.GetString(Lidgren.Network.NetUtility.ComputeSHAHash(Encoding.UTF8.GetBytes(value))); + } + } + } + private GUIFrame settingsFrame; private GUIFrame[] settingsTabs; private int settingsTabIndex; diff --git a/Subsurface/Source/Networking/NetworkMember.cs b/Subsurface/Source/Networking/NetworkMember.cs index 21edefb26..8ff348815 100644 --- a/Subsurface/Source/Networking/NetworkMember.cs +++ b/Subsurface/Source/Networking/NetworkMember.cs @@ -19,6 +19,8 @@ namespace Barotrauma.Networking KickPlayer, + RequestAdminAuth, + Permissions, RequestNetLobbyUpdate,