apply chat flood prevention in games next to rooms (#4387)

* apply chat flood prevention in games next to rooms

* add limit to private messages as well
This commit is contained in:
ebbit1q 2021-06-28 07:57:46 +02:00 committed by GitHub
parent a65ce8694c
commit 0280fea3e6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 46 additions and 23 deletions

View file

@ -38,6 +38,7 @@ public:
}
virtual int getLastCommandTime() const = 0;
virtual bool addSaidMessageSize(int size) = 0;
void playerRemovedFromGame(Server_Game *game);
void playerAddedToGame(int gameId, int roomId, int playerId);

View file

@ -945,6 +945,9 @@ Server_Player::cmdGameSay(const Command_GameSay &cmd, ResponseContainer & /*rc*/
}
}
if (!userInterface->addSaidMessageSize(cmd.message().size())) {
return Response::RespChatFlood;
}
Event_GameSay event;
event.set_message(cmd.message());
ges.enqueueGameEvent(event, playerId);

View file

@ -555,10 +555,15 @@ Response::ResponseCode Server_ProtocolHandler::cmdMessage(const Command_Message
QString receiver = QString::fromStdString(cmd.user_name());
Server_AbstractUserInterface *userInterface = server->findUser(receiver);
if (!userInterface)
if (!userInterface) {
return Response::RespNameNotFound;
if (databaseInterface->isInIgnoreList(receiver, QString::fromStdString(userInfo->name())))
}
if (databaseInterface->isInIgnoreList(receiver, QString::fromStdString(userInfo->name()))) {
return Response::RespInIgnoreList;
}
if (!addSaidMessageSize(cmd.message().size())) {
return Response::RespChatFlood;
}
Event_UserMessage event;
event.set_sender_name(userInfo->name());
@ -719,33 +724,42 @@ Server_ProtocolHandler::cmdLeaveRoom(const Command_LeaveRoom & /*cmd*/, Server_R
return Response::RespOk;
}
bool Server_ProtocolHandler::addSaidMessageSize(int size)
{
if (server->getMessageCountingInterval() <= 0) {
return true;
}
int totalSize = 0, totalCount = 0;
if (messageSizeOverTime.isEmpty()) {
messageSizeOverTime.prepend(0);
}
messageSizeOverTime[0] += size;
for (int messageSize : messageSizeOverTime) {
totalSize += messageSize;
}
if (messageCountOverTime.isEmpty()) {
messageCountOverTime.prepend(0);
}
messageCountOverTime[0] += 1;
for (int messageCount : messageCountOverTime) {
totalCount += messageCount;
}
return totalSize <= server->getMaxMessageSizePerInterval() && totalCount <= server->getMaxMessageCountPerInterval();
}
Response::ResponseCode
Server_ProtocolHandler::cmdRoomSay(const Command_RoomSay &cmd, Server_Room *room, ResponseContainer & /*rc*/)
{
QString msg = QString::fromStdString(cmd.message());
if (server->getMessageCountingInterval() > 0) {
int totalSize = 0, totalCount = 0;
if (messageSizeOverTime.isEmpty())
messageSizeOverTime.prepend(0);
messageSizeOverTime[0] += msg.size();
for (int i = 0; i < messageSizeOverTime.size(); ++i)
totalSize += messageSizeOverTime[i];
if (messageCountOverTime.isEmpty())
messageCountOverTime.prepend(0);
++messageCountOverTime[0];
for (int i = 0; i < messageCountOverTime.size(); ++i) {
totalCount += messageCountOverTime[i];
}
int maxMessageSizePerInterval = server->getMaxMessageSizePerInterval();
int maxMessageCountPerInterval = server->getMaxMessageCountPerInterval();
if ((maxMessageSizePerInterval > 0 && totalSize > maxMessageSizePerInterval) ||
(maxMessageCountPerInterval > 0 && totalCount > maxMessageCountPerInterval)) {
if (!addSaidMessageSize(msg.size())) {
return Response::RespChatFlood;
}
}
msg.replace(QChar('\n'), QChar(' '));
room->say(QString::fromStdString(userInfo->name()), msg);

View file

@ -129,6 +129,7 @@ public:
{
return timeRunning - lastDataReceived;
}
bool addSaidMessageSize(int size);
void processCommandContainer(const CommandContainer &cont);
void sendProtocolItem(const Response &item);

View file

@ -15,6 +15,10 @@ public:
{
return 0;
}
bool addSaidMessageSize(int /*size*/)
{
return true;
}
void sendProtocolItem(const Response &item);
void sendProtocolItem(const SessionEvent &item);