Add player authentication backend.

This commit is contained in:
Paul Chote
2018-07-07 13:41:00 +00:00
committed by abcdefg30
parent 0965464148
commit c74159e549
12 changed files with 408 additions and 46 deletions

View File

@@ -19,6 +19,7 @@ namespace OpenRA.Network
public string Mod;
public string Version;
public string Map;
public string AuthToken;
public static HandshakeRequest Deserialize(string data)
{
@@ -40,6 +41,11 @@ namespace OpenRA.Network
public string Mod;
public string Version;
public string Password;
// For player authentication
public string Fingerprint;
public string AuthSignature;
[FieldLoader.Ignore] public Session.Client Client;
public static HandshakeResponse Deserialize(string data)
@@ -68,7 +74,7 @@ namespace OpenRA.Network
{
var data = new List<MiniYamlNode>();
data.Add(new MiniYamlNode("Handshake", null,
new string[] { "Mod", "Version", "Password" }.Select(p => FieldSaver.SaveField(this, p)).ToList()));
new string[] { "Mod", "Version", "Password", "Fingerprint", "AuthSignature" }.Select(p => FieldSaver.SaveField(this, p)).ToList()));
data.Add(new MiniYamlNode("Client", FieldSaver.Save(Client)));
return data.WriteToString();

View File

@@ -126,6 +126,9 @@ namespace OpenRA.Network
public bool IsInvalid { get { return State == ClientState.Invalid; } }
public bool IsObserver { get { return Slot == null; } }
// Linked to the online player database
public string Fingerprint;
public MiniYamlNode Serialize()
{
return new MiniYamlNode("Client@{0}".F(Index), FieldSaver.Save(this));

View File

@@ -9,9 +9,12 @@
*/
#endregion
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using OpenRA.Traits;
namespace OpenRA.Network
@@ -175,14 +178,19 @@ namespace OpenRA.Network
State = Session.ClientState.Invalid
};
var localProfile = Game.LocalPlayerProfile;
var response = new HandshakeResponse()
{
Client = info,
Mod = mod.Id,
Version = mod.Metadata.Version,
Password = orderManager.Password
Password = orderManager.Password,
Fingerprint = localProfile.Fingerprint
};
if (request.AuthToken != null && response.Fingerprint != null)
response.AuthSignature = localProfile.Sign(request.AuthToken);
orderManager.IssueOrder(Order.HandshakeResponse(response.Serialize()));
break;
}