diff options
Diffstat (limited to 'src/server/game/Handlers/ChatHandler.cpp')
-rw-r--r-- | src/server/game/Handlers/ChatHandler.cpp | 109 |
1 files changed, 101 insertions, 8 deletions
diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index 847197352b6..f6a39ea12e8 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -29,6 +29,7 @@ #include "Group.h" #include "Guild.h" #include "GuildMgr.h" +#include "Hyperlinks.h" #include "Language.h" #include "LanguageMgr.h" #include "Log.h" @@ -42,6 +43,37 @@ #include "World.h" #include "WorldPacket.h" +static void StripInvisibleChars(std::string& str) +{ + static std::string const invChars = " \t\7\n"; + + size_t wpos = 0; + + bool space = false; + for (size_t pos = 0; pos < str.size(); ++pos) + { + if (invChars.find(str[pos]) != std::string::npos) + { + if (!space) + { + str[wpos++] = ' '; + space = true; + } + } + else + { + if (wpos != pos) + str[wpos++] = str[pos]; + else + ++wpos; + space = false; + } + } + + if (wpos < str.size()) + str.erase(wpos, str.size()); +} + void WorldSession::HandleChatMessageOpcode(WorldPackets::Chat::ChatMessage& chatMessage) { ChatMsg type; @@ -174,26 +206,31 @@ void WorldSession::HandleChatMessage(ChatMsg type, Language lang, std::string ms return; } + // Strip invisible characters for non-addon messages + if (sWorld->getBoolConfig(CONFIG_CHAT_FAKE_MESSAGE_PREVENTING)) + StripInvisibleChars(msg); + if (msg.empty()) return; if (ChatHandler(this).ParseCommands(msg.c_str())) return; - // Strip invisible characters for non-addon messages - if (sWorld->getBoolConfig(CONFIG_CHAT_FAKE_MESSAGE_PREVENTING)) - stripLineInvisibleChars(msg); - - if (sWorld->getIntConfig(CONFIG_CHAT_STRICT_LINK_CHECKING_SEVERITY) && !ChatHandler(this).isValidChatMessage(msg.c_str())) + bool validMessage = Trinity::Hyperlinks::ValidateLinks(msg); + if (!validMessage) { - TC_LOG_ERROR("network", "Player %s (%s) sent a chatmessage with an invalid link: %s", GetPlayer()->GetName().c_str(), - GetPlayer()->GetGUID().ToString().c_str(), msg.c_str()); + TC_LOG_ERROR("network", "Player %s (%s) sent a chatmessage with an invalid link - corrected", GetPlayer()->GetName().c_str(), + GetPlayer()->GetGUID().ToString().c_str()); if (sWorld->getIntConfig(CONFIG_CHAT_STRICT_LINK_CHECKING_KICK)) + { KickPlayer(); + return; + } + } + if (msg.length() > 255) return; - } switch (type) { @@ -431,6 +468,22 @@ void WorldSession::HandleChatAddonMessage(ChatMsg type, std::string prefix, std: if (prefix == AddonChannelCommandHandler::PREFIX && AddonChannelCommandHandler(this).ParseCommands(text.c_str())) return; + bool validMessage = Trinity::Hyperlinks::ValidateLinks(text); + if (!validMessage) + { + TC_LOG_ERROR("network", "Player %s (%s) sent a chatmessage with an invalid link - corrected", GetPlayer()->GetName().c_str(), + GetPlayer()->GetGUID().ToString().c_str()); + + if (sWorld->getIntConfig(CONFIG_CHAT_STRICT_LINK_CHECKING_KICK)) + { + KickPlayer(); + return; + } + } + + if (text.length() > 255) + return; + switch (type) { case CHAT_MSG_GUILD: @@ -505,6 +558,26 @@ void WorldSession::HandleChatMessageAFKOpcode(WorldPackets::Chat::ChatMessageAFK if (sender->IsInCombat()) return; + // Strip invisible characters for non-addon messages + if (sWorld->getBoolConfig(CONFIG_CHAT_FAKE_MESSAGE_PREVENTING)) + StripInvisibleChars(chatMessageAFK.Text); + + bool validMessage = Trinity::Hyperlinks::ValidateLinks(chatMessageAFK.Text); + if (!validMessage) + { + TC_LOG_ERROR("network", "Player %s (%s) sent a chatmessage with an invalid link - corrected", GetPlayer()->GetName().c_str(), + GetPlayer()->GetGUID().ToString().c_str()); + + if (sWorld->getIntConfig(CONFIG_CHAT_STRICT_LINK_CHECKING_KICK)) + { + KickPlayer(); + return; + } + } + + if (chatMessageAFK.Text.length() > 255) + return; + if (sender->HasAura(GM_SILENCE_AURA)) { SendNotification(GetTrinityString(LANG_GM_SILENCE), sender->GetName().c_str()); @@ -541,6 +614,26 @@ void WorldSession::HandleChatMessageDNDOpcode(WorldPackets::Chat::ChatMessageDND if (sender->IsInCombat()) return; + // Strip invisible characters for non-addon messages + if (sWorld->getBoolConfig(CONFIG_CHAT_FAKE_MESSAGE_PREVENTING)) + StripInvisibleChars(chatMessageDND.Text); + + bool validMessage = Trinity::Hyperlinks::ValidateLinks(chatMessageDND.Text); + if (!validMessage) + { + TC_LOG_ERROR("network", "Player %s (%s) sent a chatmessage with an invalid link - corrected", GetPlayer()->GetName().c_str(), + GetPlayer()->GetGUID().ToString().c_str()); + + if (sWorld->getIntConfig(CONFIG_CHAT_STRICT_LINK_CHECKING_KICK)) + { + KickPlayer(); + return; + } + } + + if (chatMessageDND.Text.length() > 255) + return; + if (sender->HasAura(GM_SILENCE_AURA)) { SendNotification(GetTrinityString(LANG_GM_SILENCE), sender->GetName().c_str()); |