mirror of
https://github.com/minetest/minetest.git
synced 2024-12-24 15:12:23 +01:00
Block spam messages before calling on_chatmessage callbacks (#4805)
Fixes #4799
This commit is contained in:
parent
33e0eedbfb
commit
08911160aa
@ -2790,40 +2790,41 @@ std::wstring Server::handleChat(const std::string &name, const std::wstring &wna
|
|||||||
RollbackScopeActor rollback_scope(m_rollback,
|
RollbackScopeActor rollback_scope(m_rollback,
|
||||||
std::string("player:") + name);
|
std::string("player:") + name);
|
||||||
|
|
||||||
// Line to send
|
|
||||||
std::wstring line;
|
|
||||||
// Whether to send line to the player that sent the message, or to all players
|
|
||||||
bool broadcast_line = true;
|
|
||||||
|
|
||||||
// Run script hook
|
|
||||||
bool ate = m_script->on_chat_message(name,
|
|
||||||
wide_to_utf8(wmessage));
|
|
||||||
// If script ate the message, don't proceed
|
|
||||||
if (ate)
|
|
||||||
return L"";
|
|
||||||
|
|
||||||
if (player) {
|
if (player) {
|
||||||
switch (player->canSendChatMessage()) {
|
switch (player->canSendChatMessage()) {
|
||||||
case RPLAYER_CHATRESULT_FLOODING: {
|
case RPLAYER_CHATRESULT_FLOODING: {
|
||||||
std::wstringstream ws;
|
std::wstringstream ws;
|
||||||
ws << L"You cannot send more messages. You are limited to "
|
ws << L"You cannot send more messages. You are limited to "
|
||||||
<< g_settings->getFloat("chat_message_limit_per_10sec")
|
<< g_settings->getFloat("chat_message_limit_per_10sec")
|
||||||
<< L" messages per 10 seconds.";
|
<< L" messages per 10 seconds.";
|
||||||
return ws.str();
|
return ws.str();
|
||||||
}
|
}
|
||||||
case RPLAYER_CHATRESULT_KICK:
|
case RPLAYER_CHATRESULT_KICK:
|
||||||
DenyAccess_Legacy(player->peer_id, L"You have been kicked due to message flooding.");
|
DenyAccess_Legacy(player->peer_id,
|
||||||
|
L"You have been kicked due to message flooding.");
|
||||||
return L"";
|
return L"";
|
||||||
case RPLAYER_CHATRESULT_OK: break;
|
case RPLAYER_CHATRESULT_OK:
|
||||||
default: FATAL_ERROR("Unhandled chat filtering result found.");
|
break;
|
||||||
|
default:
|
||||||
|
FATAL_ERROR("Unhandled chat filtering result found.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_max_chatmessage_length > 0 && wmessage.length() > m_max_chatmessage_length) {
|
if (m_max_chatmessage_length > 0
|
||||||
|
&& wmessage.length() > m_max_chatmessage_length) {
|
||||||
return L"Your message exceed the maximum chat message limit set on the server. "
|
return L"Your message exceed the maximum chat message limit set on the server. "
|
||||||
L"It was refused. Send a shorter message";
|
L"It was refused. Send a shorter message";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Run script hook, exit if script ate the chat message
|
||||||
|
if (m_script->on_chat_message(name, wide_to_utf8(wmessage)))
|
||||||
|
return L"";
|
||||||
|
|
||||||
|
// Line to send
|
||||||
|
std::wstring line;
|
||||||
|
// Whether to send line to the player that sent the message, or to all players
|
||||||
|
bool broadcast_line = true;
|
||||||
|
|
||||||
// Commands are implemented in Lua, so only catch invalid
|
// Commands are implemented in Lua, so only catch invalid
|
||||||
// commands that were not "eaten" and send an error back
|
// commands that were not "eaten" and send an error back
|
||||||
if (wmessage[0] == L'/') {
|
if (wmessage[0] == L'/') {
|
||||||
|
Loading…
Reference in New Issue
Block a user