Clients can execute permitted console commands server-side now. The console commands have three different actions: the default action, one that's executed client-side when a client uses it, and one that's executed server-side when a clients requests it. If the client-side action is omitted, the client relays the command to the server as-is. If the third action is omitted, the server executes the default action.

This commit is contained in:
Joonas Rikkonen
2017-12-06 19:52:57 +02:00
parent 91a8e6d0c6
commit 9bc0931be5
8 changed files with 551 additions and 175 deletions
@@ -157,9 +157,10 @@ namespace Barotrauma.Networking
return rName;
}
public void SetPermissions(ClientPermissions permissions)
public void SetPermissions(ClientPermissions permissions, List<DebugConsole.Command> permittedConsoleCommands)
{
this.Permissions = permissions;
this.PermittedConsoleCommands = permittedConsoleCommands;
}
public void GivePermission(ClientPermissions permission)
@@ -795,6 +795,11 @@ namespace Barotrauma.Networking
campaign.ServerRead(inc, sender);
}
break;
case ClientPermissions.ConsoleCommands:
string consoleCommand = inc.ReadString();
Vector2 clientCursorPos = new Vector2(inc.ReadSingle(), inc.ReadSingle());
DebugConsole.ExecuteClientCommand(sender, clientCursorPos, consoleCommand);
break;
}
inc.ReadPadBits();
@@ -853,7 +858,7 @@ namespace Barotrauma.Networking
outmsg.Write(GameStarted);
outmsg.Write(AllowSpectating);
outmsg.Write((byte)c.Permissions);
WritePermissions(outmsg, c);
}
private void ClientWriteIngame(Client c)
@@ -1622,6 +1627,12 @@ namespace Barotrauma.Networking
}
}
public void SendChatMessage(string txt, Client recipient)
{
ChatMessage msg = ChatMessage.Create("", txt, ChatMessageType.Server, null);
SendChatMessage(msg, recipient);
}
public void SendChatMessage(ChatMessage msg, Client recipient)
{
msg.NetStateID = recipient.ChatMsgQueue.Count > 0 ?
@@ -1928,6 +1939,15 @@ namespace Barotrauma.Networking
var msg = server.CreateMessage();
msg.Write((byte)ServerPacketHeader.PERMISSIONS);
WritePermissions(msg, client);
server.SendMessage(msg, client.Connection, NetDeliveryMethod.ReliableUnordered);
SaveClientPermissions();
}
private void WritePermissions(NetBuffer msg, Client client)
{
msg.Write((byte)client.Permissions);
if (client.Permissions.HasFlag(ClientPermissions.ConsoleCommands))
{
@@ -1940,10 +1960,6 @@ namespace Barotrauma.Networking
}
}
}
server.SendMessage(msg, client.Connection, NetDeliveryMethod.ReliableUnordered);
SaveClientPermissions();
}
public void SetClientCharacter(Client client, Character newCharacter)
@@ -218,11 +218,11 @@ namespace Barotrauma.Networking
var savedPermissions = clientPermissions.Find(cp => cp.IP == newClient.Connection.RemoteEndPoint.Address.ToString());
if (savedPermissions != null)
{
newClient.SetPermissions(savedPermissions.Permissions);
newClient.SetPermissions(savedPermissions.Permissions, savedPermissions.PermittedCommands);
}
else
{
newClient.SetPermissions(ClientPermissions.None);
newClient.SetPermissions(ClientPermissions.None, new List<DebugConsole.Command>());
}
}
@@ -364,14 +364,13 @@ namespace Barotrauma.Networking
}
}
new SavedClientPermission(clientName, clientIP, permissions, permittedCommands);
clientPermissions.Add(new SavedClientPermission(clientName, clientIP, permissions, permittedCommands));
}
}
/// <summary>
/// Method for loading old .txt client permission files to provide backwards compatibility
/// </summary>
/// <param name="file"></param>
private void LoadClientPermissionsOld(string file)
{
if (!File.Exists(file)) return;
@@ -407,6 +406,12 @@ namespace Barotrauma.Networking
public void SaveClientPermissions()
{
//delete old client permission file
if (File.Exists("Data/clientpermissions.txt"))
{
File.Delete("Data/clientpermissions.txt");
}
Log("Saving client permissions", ServerLog.MessageType.ServerMessage);
XDocument doc = new XDocument(new XElement("ClientPermissions"));