mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-15 23:20:36 +01:00
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:
@@ -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");
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user