Merge pull request #8137 from Mailaender/sanitize-player-name

Added a client side player name sanitation
This commit is contained in:
Pavel Penev
2015-05-30 22:21:32 +03:00
7 changed files with 75 additions and 8 deletions

View File

@@ -152,6 +152,9 @@ namespace OpenRA.Network
break; break;
} }
Game.Settings.Player.Name = Settings.SanitizedPlayerName(Game.Settings.Player.Name);
Game.Settings.Save();
// Otherwise send the handshake with our current settings and let the server reject us // Otherwise send the handshake with our current settings and let the server reject us
var info = new Session.Client() var info = new Session.Client()
{ {

View File

@@ -130,6 +130,9 @@ namespace OpenRA.Server
Port = localEndpoint.Port; Port = localEndpoint.Port;
Settings = settings; Settings = settings;
Settings.Name = OpenRA.Settings.SanitizedServerName(Settings.Name);
ModData = modData; ModData = modData;
randomSeed = (int)DateTime.Now.ToBinary(); randomSeed = (int)DateTime.Now.ToBinary();
@@ -286,7 +289,7 @@ namespace OpenRA.Server
var client = new Session.Client() var client = new Session.Client()
{ {
Name = handshake.Client.Name, Name = OpenRA.Settings.SanitizedPlayerName(handshake.Client.Name),
IpAddress = ((IPEndPoint)newConn.Socket.RemoteEndPoint).Address.ToString(), IpAddress = ((IPEndPoint)newConn.Socket.RemoteEndPoint).Address.ToString(),
Index = newConn.PlayerIndex, Index = newConn.PlayerIndex,
Slot = LobbyInfo.FirstEmptySlot(), Slot = LobbyInfo.FirstEmptySlot(),

View File

@@ -11,7 +11,9 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq;
using OpenRA.Graphics; using OpenRA.Graphics;
using OpenRA.Traits;
namespace OpenRA namespace OpenRA
{ {
@@ -301,6 +303,46 @@ namespace OpenRA
root.WriteToFile(settingsFile); root.WriteToFile(settingsFile);
} }
static string SanitizedName(string dirty)
{
if (string.IsNullOrEmpty(dirty))
return null;
var clean = dirty;
// reserved characters for MiniYAML and JSON
var disallowedChars = new char[] { '#', '@', ':', '\n', '\t', '[', ']', '{', '}', '"', '`' };
foreach (var disallowedChar in disallowedChars)
clean = clean.Replace(disallowedChar.ToString(), string.Empty);
// avoid UI glitches
if (clean.Length > 16)
clean = clean.Substring(0, 16);
return clean;
}
public static string SanitizedServerName(string dirty)
{
var clean = SanitizedName(dirty);
if (string.IsNullOrWhiteSpace(clean))
return new ServerSettings().Name;
else
return clean;
}
public static string SanitizedPlayerName(string dirty)
{
var forbiddenNames = new string[] { "Open", "Closed" };
var botNames = OpenRA.Game.ModData.DefaultRules.Actors["player"].Traits.WithInterface<IBotInfo>().Select(t => t.Name);
var clean = SanitizedName(dirty);
if (string.IsNullOrWhiteSpace(clean) || forbiddenNames.Contains(clean) || botNames.Contains(clean))
clean = new PlayerSettings().Name;
return clean;
}
static void LoadSectionYaml(MiniYaml yaml, object section) static void LoadSectionYaml(MiniYaml yaml, object section)
{ {
var defaults = Activator.CreateInstance(section.GetType()); var defaults = Activator.CreateInstance(section.GetType());

View File

@@ -717,9 +717,13 @@ namespace OpenRA.Mods.Common.Server
{ "name", { "name",
s => s =>
{ {
Log.Write("server", "Player@{0} is now known as {1}.", conn.Socket.RemoteEndPoint, s); var sanitizedName = OpenRA.Settings.SanitizedPlayerName(s);
server.SendMessage("{0} is now known as {1}.".F(client.Name, s)); if (sanitizedName == client.Name)
client.Name = s; return true;
Log.Write("server", "Player@{0} is now known as {1}.", conn.Socket.RemoteEndPoint, sanitizedName);
server.SendMessage("{0} is now known as {1}.".F(client.Name, sanitizedName));
client.Name = sanitizedName;
server.SyncLobbyClients(); server.SyncLobbyClients();
return true; return true;
} }

View File

@@ -266,6 +266,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
if (name.Text == c.Name) if (name.Text == c.Name)
return; return;
name.Text = Settings.SanitizedPlayerName(name.Text);
orderManager.IssueOrder(Order.Command("name " + name.Text)); orderManager.IssueOrder(Order.Command("name " + name.Text));
Game.Settings.Player.Name = name.Text; Game.Settings.Player.Name = name.Text;
Game.Settings.Save(); Game.Settings.Save();

View File

@@ -56,8 +56,17 @@ namespace OpenRA.Mods.Common.Widgets.Logic
panel.Get<LabelWidget>("MAP_NAME").GetText = () => preview.Title; panel.Get<LabelWidget>("MAP_NAME").GetText = () => preview.Title;
} }
panel.Get<TextFieldWidget>("SERVER_NAME").Text = settings.Server.Name ?? ""; var serverName = panel.Get<TextFieldWidget>("SERVER_NAME");
serverName.Text = Settings.SanitizedServerName(settings.Server.Name);
serverName.OnEnterKey = () => { serverName.YieldKeyboardFocus(); return true; };
serverName.OnLoseFocus = () =>
{
serverName.Text = Settings.SanitizedServerName(serverName.Text);
settings.Server.Name = serverName.Text;
};
panel.Get<TextFieldWidget>("LISTEN_PORT").Text = settings.Server.ListenPort.ToString(); panel.Get<TextFieldWidget>("LISTEN_PORT").Text = settings.Server.ListenPort.ToString();
advertiseOnline = Game.Settings.Server.AdvertiseOnline; advertiseOnline = Game.Settings.Server.AdvertiseOnline;
var externalPort = panel.Get<TextFieldWidget>("EXTERNAL_PORT"); var externalPort = panel.Get<TextFieldWidget>("EXTERNAL_PORT");
@@ -81,7 +90,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
void CreateAndJoin() void CreateAndJoin()
{ {
var name = panel.Get<TextFieldWidget>("SERVER_NAME").Text; var name = Settings.SanitizedServerName(panel.Get<TextFieldWidget>("SERVER_NAME").Text);
int listenPort, externalPort; int listenPort, externalPort;
if (!Exts.TryParseIntegerInvariant(panel.Get<TextFieldWidget>("LISTEN_PORT").Text, out listenPort)) if (!Exts.TryParseIntegerInvariant(panel.Get<TextFieldWidget>("LISTEN_PORT").Text, out listenPort))
listenPort = 1234; listenPort = 1234;

View File

@@ -204,9 +204,13 @@ namespace OpenRA.Mods.Common.Widgets.Logic
var ps = Game.Settings.Player; var ps = Game.Settings.Player;
var nameTextfield = panel.Get<TextFieldWidget>("PLAYERNAME"); var nameTextfield = panel.Get<TextFieldWidget>("PLAYERNAME");
nameTextfield.Text = ps.Name; nameTextfield.Text = Settings.SanitizedPlayerName(ps.Name);
nameTextfield.OnEnterKey = () => { nameTextfield.YieldKeyboardFocus(); return true; }; nameTextfield.OnEnterKey = () => { nameTextfield.YieldKeyboardFocus(); return true; };
nameTextfield.OnLoseFocus = () => { ps.Name = nameTextfield.Text; }; nameTextfield.OnLoseFocus = () =>
{
nameTextfield.Text = Settings.SanitizedPlayerName(nameTextfield.Text);
ps.Name = nameTextfield.Text;
};
var colorPreview = panel.Get<ColorPreviewManagerWidget>("COLOR_MANAGER"); var colorPreview = panel.Get<ColorPreviewManagerWidget>("COLOR_MANAGER");
colorPreview.Color = ps.Color; colorPreview.Color = ps.Color;