Block spam messages before calling on_chatmessage callbacks (#4805)

Fixes #4799
This commit is contained in:
rubenwardy 2017-01-25 09:57:33 +00:00 committed by Loïc Blot
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'/') {