Skip to content

Commit

Permalink
sanitize player names
Browse files Browse the repository at this point in the history
  • Loading branch information
Mailaender committed May 10, 2015
1 parent 4b50f34 commit fbb27f1
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 3 deletions.
3 changes: 3 additions & 0 deletions OpenRA.Game/Network/UnitOrders.cs
Expand Up @@ -152,6 +152,9 @@ public static void ProcessOrder(OrderManager orderManager, World world, int clie
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
var info = new Session.Client()
{
Expand Down
2 changes: 1 addition & 1 deletion OpenRA.Game/Server/Server.cs
Expand Up @@ -286,7 +286,7 @@ void ValidateClient(Connection newConn, string data)

var client = new Session.Client()
{
Name = handshake.Client.Name,
Name = OpenRA.Settings.SanitizedPlayerName(handshake.Client.Name),
IpAddress = ((IPEndPoint)newConn.Socket.RemoteEndPoint).Address.ToString(),
Index = newConn.PlayerIndex,
Slot = LobbyInfo.FirstEmptySlot(),
Expand Down
33 changes: 33 additions & 0 deletions OpenRA.Game/Settings.cs
Expand Up @@ -11,7 +11,9 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using OpenRA.Graphics;
using OpenRA.Traits;

namespace OpenRA
{
Expand Down Expand Up @@ -300,6 +302,37 @@ public void Save()
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 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)
{
var defaults = Activator.CreateInstance(section.GetType());
Expand Down
2 changes: 2 additions & 0 deletions OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyUtils.cs
Expand Up @@ -281,6 +281,8 @@ public static void SetupEditableNameWidget(Widget parent, Session.Slot s, Sessio
if (name.Text == c.Name)
return;
name.Text = Settings.SanitizedPlayerName(name.Text);
orderManager.IssueOrder(Order.Command("name " + name.Text));
Game.Settings.Player.Name = name.Text;
Game.Settings.Save();
Expand Down
8 changes: 6 additions & 2 deletions OpenRA.Mods.Common/Widgets/Logic/SettingsLogic.cs
Expand Up @@ -204,9 +204,13 @@ Action InitDisplayPanel(Widget panel)
var ps = Game.Settings.Player;

var nameTextfield = panel.Get<TextFieldWidget>("PLAYERNAME");
nameTextfield.Text = ps.Name;
nameTextfield.Text = Settings.SanitizedPlayerName(ps.Name);
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");
colorPreview.Color = ps.Color;
Expand Down

0 comments on commit fbb27f1

Please sign in to comment.