From 6f56e1acaf4138c943758db427d5d28ce9d590ab Mon Sep 17 00:00:00 2001 From: miniduikboot Date: Sun, 28 Apr 2024 17:00:30 +0200 Subject: [PATCH 1/3] Move remaining Color checks to ColorLimits Some mods add custom colors and still use the standard vanilla SetColor RPC, which leads to issues with this check. --- src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs index 9cfe0374..37dffe57 100644 --- a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs +++ b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs @@ -688,7 +688,7 @@ namespace Impostor.Server.Net.Inner.Objects if ((byte)color > ColorsCount) { - if (await sender.Client.ReportCheatAsync(RpcCalls.CheckColor, CheatCategory.ProtocolExtension, "Client sent invalid color")) + if (await sender.Client.ReportCheatAsync(RpcCalls.CheckColor, CheatCategory.ColorLimits, "Client sent invalid color")) { return false; } @@ -736,7 +736,7 @@ namespace Impostor.Server.Net.Inner.Objects if (colorOffset == ColorsCount) { - if (await sender.Client.ReportCheatAsync(RpcCalls.SetColor, CheatCategory.GameFlow, "Client sent SetColor but all colors are already in use")) + if (await sender.Client.ReportCheatAsync(RpcCalls.SetColor, CheatCategory.ColorLimits, "Client sent SetColor but all colors are already in use")) { await SetColorAsync(expected); return false; @@ -746,7 +746,7 @@ namespace Impostor.Server.Net.Inner.Objects if (color != expected) { - if (await sender.Client.ReportCheatAsync(RpcCalls.SetColor, CheatCategory.GameFlow, "Client sent SetColor with incorrect color")) + if (await sender.Client.ReportCheatAsync(RpcCalls.SetColor, CheatCategory.ColorLimits, "Client sent SetColor with incorrect color")) { await SetColorAsync(expected); return false; From be39c9facfd6e691ff365c3a333c70f699ac4ff7 Mon Sep 17 00:00:00 2001 From: miniduikboot Date: Sun, 28 Apr 2024 17:45:23 +0200 Subject: [PATCH 2/3] Move Name checks to NameLimits --- .../Net/Inner/Objects/InnerPlayerControl.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs index 37dffe57..863d961a 100644 --- a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs +++ b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs @@ -591,7 +591,7 @@ namespace Impostor.Server.Net.Inner.Objects if (sender.Client.Name != name) { - if (await sender.Client.ReportCheatAsync(RpcCalls.CheckName, CheatCategory.GameFlow, "Client sent name not matching his name from handshake")) + if (await sender.Client.ReportCheatAsync(RpcCalls.CheckName, CheatCategory.NameLimits, "Client sent name not matching his name from handshake")) { return false; } @@ -606,7 +606,7 @@ namespace Impostor.Server.Net.Inner.Objects { if (Game.GameState == GameStates.Started) { - if (await sender.Client.ReportCheatAsync(RpcCalls.SetColor, CheatCategory.GameFlow, "Client tried to set a name midgame")) + if (await sender.Client.ReportCheatAsync(RpcCalls.SetName, CheatCategory.GameFlow, "Client tried to set a name midgame")) { return false; } @@ -624,7 +624,7 @@ namespace Impostor.Server.Net.Inner.Objects if (sender.Client.Name != name) { - if (await sender.Client.ReportCheatAsync(RpcCalls.SetName, CheatCategory.GameFlow, "Client sent name not matching his name from handshake")) + if (await sender.Client.ReportCheatAsync(RpcCalls.SetName, CheatCategory.NameLimits, "Client sent name not matching his name from handshake")) { return false; } @@ -655,7 +655,7 @@ namespace Impostor.Server.Net.Inner.Objects if (name != expected) { - if (await sender.Client.ReportCheatAsync(RpcCalls.SetName, CheatCategory.GameFlow, "Client sent SetName with incorrect name")) + if (await sender.Client.ReportCheatAsync(RpcCalls.SetName, CheatCategory.NameLimits, "Client sent SetName with incorrect name")) { await SetNameAsync(expected); return false; @@ -664,7 +664,7 @@ namespace Impostor.Server.Net.Inner.Objects } else { - if (await sender.Client.ReportCheatAsync(RpcCalls.SetName, CheatCategory.GameFlow, $"Client sent {nameof(RpcCalls.SetName)} for a player that didn't request it")) + if (await sender.Client.ReportCheatAsync(RpcCalls.SetName, CheatCategory.NameLimits, $"Client sent {nameof(RpcCalls.SetName)} for a player that didn't request it")) { return false; } From ddd701320dea00bd6491f23035739e6e7c0c1436 Mon Sep 17 00:00:00 2001 From: miniduikboot Date: Sun, 28 Apr 2024 18:01:59 +0200 Subject: [PATCH 3/3] Add similar AC check to HandleSetName --- .../Net/Inner/Objects/InnerPlayerControl.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs index 863d961a..441205af 100644 --- a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs +++ b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs @@ -573,6 +573,14 @@ namespace Impostor.Server.Net.Inner.Objects private async ValueTask HandleCheckName(ClientPlayer sender, string name) { + if (Game.GameState == GameStates.Started) + { + if (await sender.Client.ReportCheatAsync(RpcCalls.CheckName, CheatCategory.GameFlow, "Client tried to set a name midgame")) + { + return false; + } + } + if (name.Length > 10) { if (await sender.Client.ReportCheatAsync(RpcCalls.CheckName, CheatCategory.NameLimits, "Client sent name exceeding 10 characters"))