Merge pull request #8137 from Mailaender/sanitize-player-name
Added a client side player name sanitation
This commit is contained in:
@@ -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()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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(),
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user