Fix chat sanitization and entity name escaping (#12015)

This commit is contained in:
Leon Friedrich
2022-10-18 19:59:09 +13:00
committed by GitHub
parent 6db886773b
commit 3aeba9a63e
11 changed files with 104 additions and 94 deletions

View File

@@ -77,8 +77,8 @@ namespace Content.Server.Chat.Managers
public void DispatchServerAnnouncement(string message, Color? colorOverride = null)
{
var messageWrap = Loc.GetString("chat-manager-server-wrap-message");
ChatMessageToAll(ChatChannel.Server, message, messageWrap, colorOverride);
var wrappedMessage = Loc.GetString("chat-manager-server-wrap-message", ("message", FormattedMessage.EscapeText(message)));
ChatMessageToAll(ChatChannel.Server, message, wrappedMessage, colorOverride);
Logger.InfoS("SERVER", message);
_adminLogger.Add(LogType.Chat, LogImpact.Low, $"Server announcement: {message}");
@@ -86,8 +86,8 @@ namespace Content.Server.Chat.Managers
public void DispatchServerMessage(IPlayerSession player, string message)
{
var messageWrap = Loc.GetString("chat-manager-server-wrap-message");
ChatMessageToOne(ChatChannel.Server, message, messageWrap, default, false, player.ConnectedClient);
var wrappedMessage = Loc.GetString("chat-manager-server-wrap-message", ("message", FormattedMessage.EscapeText(message)));
ChatMessageToOne(ChatChannel.Server, message, wrappedMessage, default, false, player.ConnectedClient);
_adminLogger.Add(LogType.Chat, LogImpact.Low, $"Server message to {player:Player}: {message}");
}
@@ -95,12 +95,11 @@ namespace Content.Server.Chat.Managers
public void SendAdminAnnouncement(string message)
{
var clients = _adminManager.ActiveAdmins.Select(p => p.ConnectedClient);
message = FormattedMessage.EscapeText(message);
var messageWrap = Loc.GetString("chat-manager-send-admin-announcement-wrap-message",
("adminChannelName", Loc.GetString("chat-manager-admin-channel-name")));
var wrappedMessage = Loc.GetString("chat-manager-send-admin-announcement-wrap-message",
("adminChannelName", Loc.GetString("chat-manager-admin-channel-name")), ("message", FormattedMessage.EscapeText(message)));
ChatMessageToMany(ChatChannel.Admin, message, messageWrap, default, false, clients.ToList());
ChatMessageToMany(ChatChannel.Admin, message, wrappedMessage, default, false, clients.ToList());
_adminLogger.Add(LogType.Chat, LogImpact.Low, $"Admin announcement from {message}: {message}");
}
@@ -110,9 +109,8 @@ namespace Content.Server.Chat.Managers
{
return;
}
message = FormattedMessage.EscapeText(message);
var messageWrap = Loc.GetString("chat-manager-send-hook-ooc-wrap-message", ("senderName", sender));
ChatMessageToAll(ChatChannel.OOC, message, messageWrap);
var wrappedMessage = Loc.GetString("chat-manager-send-hook-ooc-wrap-message", ("senderName", sender), ("message", FormattedMessage.EscapeText(message)));
ChatMessageToAll(ChatChannel.OOC, message, wrappedMessage);
_adminLogger.Add(LogType.Chat, LogImpact.Low, $"Hook OOC from {sender}: {message}");
}
@@ -135,8 +133,6 @@ namespace Content.Server.Chat.Managers
return;
}
message = FormattedMessage.EscapeText(message);
switch (type)
{
case OOCChatType.OOC:
@@ -167,7 +163,7 @@ namespace Content.Server.Chat.Managers
}
Color? colorOverride = null;
var messageWrap = Loc.GetString("chat-manager-send-ooc-wrap-message", ("playerName",player.Name));
var wrappedMessage = Loc.GetString("chat-manager-send-ooc-wrap-message", ("playerName",player.Name), ("message", FormattedMessage.EscapeText(message)));
if (_adminManager.HasAdminFlag(player, AdminFlags.Admin))
{
var prefs = _preferencesManager.GetPreferences(player.UserId);
@@ -176,11 +172,11 @@ namespace Content.Server.Chat.Managers
if (player.ConnectedClient.UserData.PatronTier is { } patron &&
PatronOocColors.TryGetValue(patron, out var patronColor))
{
messageWrap = Loc.GetString("chat-manager-send-ooc-patron-wrap-message", ("patronColor", patronColor),("playerName", player.Name));
wrappedMessage = Loc.GetString("chat-manager-send-ooc-patron-wrap-message", ("patronColor", patronColor),("playerName", player.Name), ("message", FormattedMessage.EscapeText(message)));
}
//TODO: player.Name color, this will need to change the structure of the MsgChatMessage
ChatMessageToAll(ChatChannel.OOC, message, messageWrap, colorOverride);
ChatMessageToAll(ChatChannel.OOC, message, wrappedMessage, colorOverride);
_mommiLink.SendOOCMessage(player.Name, message);
_adminLogger.Add(LogType.Chat, LogImpact.Low, $"OOC from {player:Player}: {message}");
}
@@ -194,10 +190,10 @@ namespace Content.Server.Chat.Managers
}
var clients = _adminManager.ActiveAdmins.Select(p => p.ConnectedClient);
var messageWrap = Loc.GetString("chat-manager-send-admin-chat-wrap-message",
var wrappedMessage = Loc.GetString("chat-manager-send-admin-chat-wrap-message",
("adminChannelName", Loc.GetString("chat-manager-admin-channel-name")),
("playerName", player.Name));
ChatMessageToMany(ChatChannel.Admin, message, messageWrap, default, false, clients.ToList());
("playerName", player.Name), ("message", FormattedMessage.EscapeText(message)));
ChatMessageToMany(ChatChannel.Admin, message, wrappedMessage, default, false, clients.ToList());
_adminLogger.Add(LogType.Chat, $"Admin chat from {player:Player}: {message}");
}
@@ -206,12 +202,12 @@ namespace Content.Server.Chat.Managers
#region Utility
public void ChatMessageToOne(ChatChannel channel, string message, string messageWrap, EntityUid source, bool hideChat, INetChannel client, Color? colorOverride = null)
public void ChatMessageToOne(ChatChannel channel, string message, string wrappedMessage, EntityUid source, bool hideChat, INetChannel client, Color? colorOverride = null)
{
var msg = new MsgChatMessage();
msg.Channel = channel;
msg.Message = message;
msg.MessageWrap = messageWrap;
msg.WrappedMessage = wrappedMessage;
msg.SenderEntity = source;
msg.HideChat = hideChat;
if (colorOverride != null)
@@ -221,12 +217,12 @@ namespace Content.Server.Chat.Managers
_netManager.ServerSendMessage(msg, client);
}
public void ChatMessageToMany(ChatChannel channel, string message, string messageWrap, EntityUid source, bool hideChat, List<INetChannel> clients, Color? colorOverride = null)
public void ChatMessageToMany(ChatChannel channel, string message, string wrappedMessage, EntityUid source, bool hideChat, List<INetChannel> clients, Color? colorOverride = null)
{
var msg = new MsgChatMessage();
msg.Channel = channel;
msg.Message = message;
msg.MessageWrap = messageWrap;
msg.WrappedMessage = wrappedMessage;
msg.SenderEntity = source;
msg.HideChat = hideChat;
if (colorOverride != null)
@@ -236,7 +232,7 @@ namespace Content.Server.Chat.Managers
_netManager.ServerSendToMany(msg, clients);
}
public void ChatMessageToManyFiltered(Filter filter, ChatChannel channel, string message, string messageWrap, EntityUid source,
public void ChatMessageToManyFiltered(Filter filter, ChatChannel channel, string message, string wrappedMessage, EntityUid source,
bool hideChat, Color? colorOverride = null)
{
if (!filter.Recipients.Any()) return;
@@ -247,15 +243,15 @@ namespace Content.Server.Chat.Managers
clients.Add(recipient.ConnectedClient);
}
ChatMessageToMany(channel, message, messageWrap, source, hideChat, clients, colorOverride);
ChatMessageToMany(channel, message, wrappedMessage, source, hideChat, clients, colorOverride);
}
public void ChatMessageToAll(ChatChannel channel, string message, string messageWrap, Color? colorOverride = null)
public void ChatMessageToAll(ChatChannel channel, string message, string wrappedMessage, Color? colorOverride = null)
{
var msg = new MsgChatMessage();
msg.Channel = channel;
msg.Message = message;
msg.MessageWrap = messageWrap;
msg.WrappedMessage = wrappedMessage;
if (colorOverride != null)
{
msg.MessageColorOverride = colorOverride.Value;

View File

@@ -23,12 +23,12 @@ namespace Content.Server.Chat.Managers
void SendHookOOC(string sender, string message);
void SendAdminAnnouncement(string message);
void ChatMessageToOne(ChatChannel channel, string message, string messageWrap, EntityUid source, bool hideChat,
void ChatMessageToOne(ChatChannel channel, string message, string wrappedMessage, EntityUid source, bool hideChat,
INetChannel client, Color? colorOverride = null);
void ChatMessageToMany(ChatChannel channel, string message, string messageWrap, EntityUid source, bool hideChat,
void ChatMessageToMany(ChatChannel channel, string message, string wrappedMessage, EntityUid source, bool hideChat,
List<INetChannel> clients, Color? colorOverride = null);
void ChatMessageToManyFiltered(Filter filter, ChatChannel channel, string message, string messageWrap, EntityUid source, bool hideChat, Color? colorOverride);
void ChatMessageToAll(ChatChannel channel, string message, string messageWrap, Color? colorOverride = null);
void ChatMessageToManyFiltered(Filter filter, ChatChannel channel, string message, string wrappedMessage, EntityUid source, bool hideChat, Color? colorOverride);
void ChatMessageToAll(ChatChannel channel, string message, string wrappedMessage, Color? colorOverride = null);
bool MessageCharacterLimit(IPlayerSession player, string message);
}

View File

@@ -198,8 +198,8 @@ public sealed partial class ChatSystem : SharedChatSystem
public void DispatchGlobalAnnouncement(string message, string sender = "Central Command",
bool playSound = true, SoundSpecifier? announcementSound = null, Color? colorOverride = null)
{
var messageWrap = Loc.GetString("chat-manager-sender-announcement-wrap-message", ("sender", sender));
_chatManager.ChatMessageToAll(ChatChannel.Radio, message, messageWrap, colorOverride);
var wrappedMessage = Loc.GetString("chat-manager-sender-announcement-wrap-message", ("sender", sender), ("message", FormattedMessage.EscapeText(message)));
_chatManager.ChatMessageToAll(ChatChannel.Radio, message, wrappedMessage, colorOverride);
if (playSound)
{
SoundSystem.Play(announcementSound?.GetSound() ?? DefaultAnnouncementSound, Filter.Broadcast(), AudioParams.Default.WithVolume(-2f));
@@ -218,7 +218,7 @@ public sealed partial class ChatSystem : SharedChatSystem
public void DispatchStationAnnouncement(EntityUid source, string message, string sender = "Central Command",
bool playDefaultSound = true, SoundSpecifier? announcementSound = null, Color? colorOverride = null)
{
var messageWrap = Loc.GetString("chat-manager-sender-announcement-wrap-message", ("sender", sender));
var wrappedMessage = Loc.GetString("chat-manager-sender-announcement-wrap-message", ("sender", sender), ("message", FormattedMessage.EscapeText(message)));
var station = _stationSystem.GetOwningStation(source);
if (station == null)
@@ -231,7 +231,7 @@ public sealed partial class ChatSystem : SharedChatSystem
var filter = _stationSystem.GetInStation(stationDataComp);
_chatManager.ChatMessageToManyFiltered(filter, ChatChannel.Radio, message, messageWrap, source, false, colorOverride);
_chatManager.ChatMessageToManyFiltered(filter, ChatChannel.Radio, message, wrappedMessage, source, false, colorOverride);
if (playDefaultSound)
{
@@ -261,15 +261,16 @@ public sealed partial class ChatSystem : SharedChatSystem
var nameEv = new TransformSpeakerNameEvent(source, Name(source));
RaiseLocalEvent(source, nameEv);
var name = FormattedMessage.EscapeText(nameEv.Name);
message = TransformSpeech(source, message);
if (message.Length == 0)
return;
var messageWrap = Loc.GetString("chat-manager-entity-say-wrap-message",
("entityName", nameEv.Name));
var wrappedMessage = Loc.GetString("chat-manager-entity-say-wrap-message",
("entityName", name), ("message", FormattedMessage.EscapeText(message)));
SendInVoiceRange(ChatChannel.Local, message, messageWrap, source, hideChat);
SendInVoiceRange(ChatChannel.Local, message, wrappedMessage, source, hideChat);
_listener.PingListeners(source, message, null);
var ev = new EntitySpokeEvent(message);
@@ -302,8 +303,7 @@ public sealed partial class ChatSystem : SharedChatSystem
var nameEv = new TransformSpeakerNameEvent(source, Name(source));
RaiseLocalEvent(source, nameEv);
var messageWrap = Loc.GetString("chat-manager-entity-whisper-wrap-message",
("entityName", nameEv.Name));
var name = FormattedMessage.EscapeText(nameEv.Name);
var xforms = GetEntityQuery<TransformComponent>();
var ghosts = GetEntityQuery<GhostComponent>();
@@ -322,11 +322,17 @@ public sealed partial class ChatSystem : SharedChatSystem
if (sourceCoords.InRange(EntityManager, transformEntity.Coordinates, WhisperRange) ||
ghosts.HasComponent(playerEntity))
{
_chatManager.ChatMessageToOne(ChatChannel.Whisper, message, messageWrap, source, hideChat, session.ConnectedClient);
var wrappedMessage = Loc.GetString("chat-manager-entity-whisper-wrap-message",
("entityName", name), ("message", FormattedMessage.EscapeText(message)));
_chatManager.ChatMessageToOne(ChatChannel.Whisper, message, wrappedMessage, source, hideChat, session.ConnectedClient);
}
else
{
_chatManager.ChatMessageToOne(ChatChannel.Whisper, obfuscatedMessage, messageWrap, source, hideChat,
var wrappedMessage = Loc.GetString("chat-manager-entity-whisper-wrap-message",
("entityName", name), ("message", FormattedMessage.EscapeText(obfuscatedMessage)));
_chatManager.ChatMessageToOne(ChatChannel.Whisper, obfuscatedMessage, wrappedMessage, source, hideChat,
session.ConnectedClient);
}
}
@@ -344,26 +350,32 @@ public sealed partial class ChatSystem : SharedChatSystem
{
if (!_actionBlocker.CanEmote(source)) return;
// Emotes use Identity.Name, since it doesn't actually involve your voice at all.
var messageWrap = Loc.GetString("chat-manager-entity-me-wrap-message",
("entityName", Identity.Name(source, EntityManager)));
var name = FormattedMessage.EscapeText(Identity.Name(source, EntityManager));
SendInVoiceRange(ChatChannel.Emotes, action, messageWrap, source, hideChat);
// Emotes use Identity.Name, since it doesn't actually involve your voice at all.
var wrappedMessage = Loc.GetString("chat-manager-entity-me-wrap-message",
("entityName", name),
("message", FormattedMessage.EscapeText(action)));
SendInVoiceRange(ChatChannel.Emotes, action, wrappedMessage, source, hideChat);
_adminLogger.Add(LogType.Chat, LogImpact.Low, $"Emote from {ToPrettyString(source):user}: {action}");
}
// ReSharper disable once InconsistentNaming
private void SendLOOC(EntityUid source, IPlayerSession player, string message, bool hideChat)
{
var name = FormattedMessage.EscapeText(Identity.Name(source, EntityManager));
if (_adminManager.IsAdmin(player))
{
if (!_adminLoocEnabled) return;
}
else if (!_loocEnabled) return;
var messageWrap = Loc.GetString("chat-manager-entity-looc-wrap-message",
("entityName", Identity.Name(source, EntityManager)));
var wrappedMessage = Loc.GetString("chat-manager-entity-looc-wrap-message",
("entityName", name),
("message", FormattedMessage.EscapeText(message)));
SendInVoiceRange(ChatChannel.LOOC, message, messageWrap, source, hideChat);
SendInVoiceRange(ChatChannel.LOOC, message, wrappedMessage, source, hideChat);
_adminLogger.Add(LogType.Chat, LogImpact.Low, $"LOOC from {player:Player}: {message}");
}
@@ -371,23 +383,25 @@ public sealed partial class ChatSystem : SharedChatSystem
{
var clients = GetDeadChatClients();
var playerName = Name(source);
string messageWrap;
string wrappedMessage;
if (_adminManager.IsAdmin(player))
{
messageWrap = Loc.GetString("chat-manager-send-admin-dead-chat-wrap-message",
wrappedMessage = Loc.GetString("chat-manager-send-admin-dead-chat-wrap-message",
("adminChannelName", Loc.GetString("chat-manager-admin-channel-name")),
("userName", player.ConnectedClient.UserName));
("userName", player.ConnectedClient.UserName),
("message", FormattedMessage.EscapeText(message)));
_adminLogger.Add(LogType.Chat, LogImpact.Low, $"Admin dead chat from {player:Player}: {message}");
}
else
{
messageWrap = Loc.GetString("chat-manager-send-dead-chat-wrap-message",
wrappedMessage = Loc.GetString("chat-manager-send-dead-chat-wrap-message",
("deadChannelName", Loc.GetString("chat-manager-dead-channel-name")),
("playerName", (playerName)));
("playerName", (playerName)),
("message", FormattedMessage.EscapeText(message)));
_adminLogger.Add(LogType.Chat, LogImpact.Low, $"Dead chat from {player:Player}: {message}");
}
_chatManager.ChatMessageToMany(ChatChannel.Dead, message, messageWrap, source, hideChat, clients.ToList());
_chatManager.ChatMessageToMany(ChatChannel.Dead, message, wrappedMessage, source, hideChat, clients.ToList());
}
#endregion
@@ -397,11 +411,11 @@ public sealed partial class ChatSystem : SharedChatSystem
/// <summary>
/// Sends a chat message to the given players in range of the source entity.
/// </summary>
private void SendInVoiceRange(ChatChannel channel, string message, string messageWrap, EntityUid source, bool hideChat)
private void SendInVoiceRange(ChatChannel channel, string message, string wrappedMessage, EntityUid source, bool hideChat)
{
var sessions = new List<ICommonSession>();
ClientDistanceToList(source, VoiceRange, sessions);
_chatManager.ChatMessageToMany(channel, message, messageWrap, source, hideChat, sessions.Select(s => s.ConnectedClient).ToList());
_chatManager.ChatMessageToMany(channel, message, wrappedMessage, source, hideChat, sessions.Select(s => s.ConnectedClient).ToList());
}
/// <summary>
@@ -438,7 +452,6 @@ public sealed partial class ChatSystem : SharedChatSystem
newMessage = SanitizeMessageCapital(newMessage);
if (punctuate)
newMessage = SanitizeMessagePeriod(newMessage);
newMessage = FormattedMessage.EscapeText(newMessage);
_sanitizer.TrySanitizeOutSmilies(newMessage, source, out newMessage, out emoteStr);