diff --git a/CLre_server/API/Config/CLreConfig.cs b/CLre_server/API/Config/CLreConfig.cs new file mode 100644 index 0000000..11f4a88 --- /dev/null +++ b/CLre_server/API/Config/CLreConfig.cs @@ -0,0 +1,30 @@ +using System; + +namespace CLre_server.API.Config +{ + [Serializable] + public struct CLreConfig + { + public bool clre_clients_only; + public bool web_server; + + public static CLreConfig Default() + { + return new CLreConfig + { + clre_clients_only = false, + web_server = false, + }; + } + + public static CLreConfig FromString(string s) + { + return UnityEngine.JsonUtility.FromJson(s); + } + + public override string ToString() + { + return UnityEngine.JsonUtility.ToJson(this, true); + } + } +} \ No newline at end of file diff --git a/CLre_server/API/MainServer/Server.cs b/CLre_server/API/MainServer/Server.cs index 8337b9d..b260456 100644 --- a/CLre_server/API/MainServer/Server.cs +++ b/CLre_server/API/MainServer/Server.cs @@ -187,6 +187,7 @@ namespace CLre_server.API.MainServer public static void OnConnect(int playerId) { + Synergy.Clients.RegisterClient(playerId); if (playerConnected != null) playerConnected(mgs, new PlayerConnectArgs { PlayerId = playerId, @@ -195,6 +196,7 @@ namespace CLre_server.API.MainServer public static void OnDisconnect(int playerId) { + Synergy.Clients.RemoveClient(playerId); if (playerDisconnected != null) playerDisconnected(mgs, new PlayerConnectArgs { PlayerId = playerId, diff --git a/CLre_server/API/Synergy/CLreEnforcer.cs b/CLre_server/API/Synergy/CLreEnforcer.cs new file mode 100644 index 0000000..6dc28ad --- /dev/null +++ b/CLre_server/API/Synergy/CLreEnforcer.cs @@ -0,0 +1,36 @@ +using System.Collections; +using UnityEngine; + +namespace CLre_server.API.Synergy +{ + internal static class CLreEnforcer + { + private const float _waitTime = 10.0f; + + public static IEnumerator WaitABitForHandshakeThenKick(int playerId) + { + float elapsedTime = 0.0f; + while (elapsedTime < _waitTime) + { + yield return null; + elapsedTime += Time.deltaTime; + } + yield return null; + if (Clients.IsConnected(playerId) && !Clients.IsCLreClient(playerId)) + { + MainServer.UserVerification.Instance.DisconnectPlayer(playerId); + } + } + + internal static void Init() + { + if (CLre_server.CLre.Config.clre_clients_only) + { + MainServer.Server.Instance.PlayerConnect += (_, playerData) => + { + WaitABitForHandshakeThenKick(playerData.PlayerId).Run(); + }; + } + } + } +} \ No newline at end of file diff --git a/CLre_server/API/Synergy/Clients.cs b/CLre_server/API/Synergy/Clients.cs new file mode 100644 index 0000000..635b341 --- /dev/null +++ b/CLre_server/API/Synergy/Clients.cs @@ -0,0 +1,44 @@ +using System.Collections.Generic; + +namespace CLre_server.API.Synergy +{ + public static class Clients + { + private static readonly List clrePlayers = new List(); + private static readonly List players = new List(); + + internal static void RegisterCLreClient(int playerId) + { + clrePlayers.Add(playerId); + } + + internal static void RegisterClient(int playerId) + { + players.Add(playerId); + } + + internal static void RemoveClient(int playerId) + { + if (IsCLreClient(playerId)) + { + clrePlayers.Remove(playerId); + } + players.Remove(playerId); + } + + public static bool IsCLreClient(int playerId) + { + return clrePlayers.Contains(playerId); + } + + public static bool IsConnected(int playerId) + { + return players.Contains(playerId); + } + + public static IEnumerator CLreClients() + { + return clrePlayers.GetEnumerator(); + } + } +} \ No newline at end of file diff --git a/CLre_server/API/Synergy/Message.cs b/CLre_server/API/Synergy/Message.cs index be75e8f..0f4b273 100644 --- a/CLre_server/API/Synergy/Message.cs +++ b/CLre_server/API/Synergy/Message.cs @@ -53,11 +53,6 @@ namespace CLre_server.API.Synergy h(payload); } } - - internal static void RegisterCLreClient(int playerId) - { - clrePlayers.Add(playerId); - } } public struct ReceiveMessageArgs diff --git a/CLre_server/API/Synergy/ServerHandshakeEngine.cs b/CLre_server/API/Synergy/ServerHandshakeEngine.cs index 81185d8..9578a97 100644 --- a/CLre_server/API/Synergy/ServerHandshakeEngine.cs +++ b/CLre_server/API/Synergy/ServerHandshakeEngine.cs @@ -1,4 +1,5 @@ using System.Collections; +using System.Linq; using GameNetworkLayer.Shared; using HarmonyLib; using Svelto.ECS; @@ -35,9 +36,15 @@ namespace CLre_server.API.Synergy public void OnHandshakeReceived(int playerId, ref SerializedCLreHandshake p) { - // TODO validate handshake msg + // validate handshake msg + if (!(p.HasFlag(HandshakeFlag.Client) + || p.Mods.Contains("CLre"))) + { + Utility.Logging.LogWarning($"Received invalid CLre handshake from player {playerId}! {p}"); + return; + } Utility.Logging.MetaLog($"Received CLre handshake from player {playerId}! {p}"); - Message.RegisterCLreClient(playerId); + Clients.RegisterCLreClient(playerId); SerializedCLreHandshake payload = SerializedCLreHandshake.Current(); payload.SetFlag(HandshakeFlag.Confirm); Sender(payload, playerId).Run(); diff --git a/CLre_server/CLre_server.cs b/CLre_server/CLre_server.cs index 2ce6683..fb9ce2c 100644 --- a/CLre_server/CLre_server.cs +++ b/CLre_server/CLre_server.cs @@ -1,8 +1,10 @@ using System; using System.Diagnostics; +using System.IO; using System.Linq; using System.Reflection; using System.Text; +using CLre_server.API.Config; using CLre_server.API.Tools; using CLre_server.WebStatus; using GameNetworkLayer.Shared; @@ -19,6 +21,8 @@ namespace CLre_server public override string Version { get; } = Assembly.GetExecutingAssembly().GetName().Version.ToString(); internal static Harmony harmonyInstance = null; + + public static CLreConfig Config = CLreConfig.Default(); // called when Cardlife shuts down public override void OnApplicationQuit() @@ -83,7 +87,27 @@ namespace CLre_server API.MainServer.Server.Instance.InitStart += (_, __) => API.Utility.Logging.MetaLog("(!) Server initialising"); API.MainServer.Server.Instance.InitComplete += (_, __) => API.Utility.Logging.MetaLog("(!) Server successfully initialised"); #endif + // try to load config file + try + { + string s = File.ReadAllText("CLre_server.json"); + Config = CLreConfig.FromString(s); + } + catch (Exception e) + { + API.Utility.Logging.LogWarning($"Failed to load CLre_server.json: {e}\n{e.StackTrace}"); + try + { + File.WriteAllText("CLre_server.json", Config.ToString()); + } + catch (Exception e2) + { + API.Utility.Logging.LogWarning($"Failed to write CLre_server.json: {e2}\n{e2.StackTrace}"); + } + } + // init config-dependent functionality WebServer.Init(); + API.Synergy.CLreEnforcer.Init(); // Log info API.Utility.Logging.MetaLog($"{Name} init complete."); } diff --git a/CLre_server/WebStatus/WebServer.cs b/CLre_server/WebStatus/WebServer.cs index 6c1ac7b..c0e3614 100644 --- a/CLre_server/WebStatus/WebServer.cs +++ b/CLre_server/WebStatus/WebServer.cs @@ -50,7 +50,7 @@ namespace CLre_server.WebStatus internal static void Init() { - if (Environment.GetCommandLineArgs().Contains("-web")) + if (CLre.Config.web_server || Environment.GetCommandLineArgs().Contains("-web")) { API.Utility.Logging.Log("Starting status web server"); StatusEndpoints.Init();