Add player authentication backend.
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user