Core/Chat: Allow to sanitize | characters when sending messages to clients

Add an optional parameter "escapeCharacters" to ChatHandler::SendSysMessage() to properly escape | character, otherwise it might freeze the client.
This commit is contained in:
jackpoz
2015-09-05 13:54:44 +02:00
parent 02d014c69d
commit 7c91984a64
2 changed files with 26 additions and 6 deletions

View File

@@ -186,13 +186,33 @@ bool ChatHandler::hasStringAbbr(const char* name, const char* part)
return true;
}
void ChatHandler::SendSysMessage(const char *str)
void ChatHandler::SendSysMessage(const char *str, bool escapeCharacters)
{
WorldPacket data;
// need copy to prevent corruption by strtok call in LineFromMessage original string
char* buf = strdup(str);
char* pos = buf;
char* buf;
char* pos;
if (escapeCharacters && strchr(str, '|'))
{
size_t startPos = 0;
std::ostringstream o;
while (const char* charPos = strchr(str + startPos, '|'))
{
o.write(str + startPos, charPos - str - startPos);
o << "||";
startPos = charPos - str + 1;
}
o.write(str + startPos, strlen(str) - startPos);
buf = strdup(o.str().c_str());
}
else
{
buf = strdup(str);
}
pos = buf;
while (char* line = LineFromMessage(pos))
{
@@ -1223,7 +1243,7 @@ bool CliHandler::isAvailable(ChatCommand const& cmd) const
return cmd.AllowConsole;
}
void CliHandler::SendSysMessage(const char *str)
void CliHandler::SendSysMessage(const char *str, bool /*escapeCharacters*/)
{
m_print(m_callbackArg, str);
m_print(m_callbackArg, "\r\n");

View File

@@ -66,7 +66,7 @@ class ChatHandler
// function with different implementation for chat/console
virtual char const* GetTrinityString(uint32 entry) const;
virtual void SendSysMessage(char const* str);
virtual void SendSysMessage(char const* str, bool escapeCharacters = false);
void SendSysMessage(uint32 entry);
@@ -166,7 +166,7 @@ class CliHandler : public ChatHandler
char const* GetTrinityString(uint32 entry) const override;
bool isAvailable(ChatCommand const& cmd) const override;
bool HasPermission(uint32 /*permission*/) const override { return true; }
void SendSysMessage(const char *str) override;
void SendSysMessage(const char *str, bool escapeCharacters) override;
std::string GetNameLink() const override;
bool needReportToTarget(Player* chr) const override;
LocaleConstant GetSessionDbcLocale() const override;