Example #1
0
        public void HandleHandshakeRequest(ClientStructure client, HandshakeRequestMsgData data)
        {
            var valid = CheckServerFull(client);

            valid &= valid && CheckUsernameLength(client, data.PlayerName);
            valid &= valid && CheckUsernameCharacters(client, data.PlayerName);
            valid &= valid && CheckPlayerIsAlreadyConnected(client, data.PlayerName);
            valid &= valid && CheckUsernameIsReserved(client, data.PlayerName);
            valid &= valid && CheckPlayerIsBanned(client, data.UniqueIdentifier);

            if (!valid)
            {
                LunaLog.Normal($"Client {data.PlayerName} ({data.UniqueIdentifier}) failed to handshake: {Reason}. Disconnecting");
                client.DisconnectClient = true;
                ClientConnectionHandler.DisconnectClient(client, Reason);
            }
            else
            {
                client.PlayerName       = data.PlayerName;
                client.UniqueIdentifier = data.UniqueIdentifier;
                client.Authenticated    = true;

                LmpPluginHandler.FireOnClientAuthenticated(client);

                LunaLog.Normal($"Client {data.PlayerName} ({data.UniqueIdentifier}) handshake successfully, Version: {data.MajorVersion}.{data.MinorVersion}.{data.BuildVersion}");

                HandshakeSystemSender.SendHandshakeReply(client, HandshakeReply.HandshookSuccessfully, "success");

                var msgData = ServerContext.ServerMessageFactory.CreateNewMessageData <PlayerConnectionJoinMsgData>();
                msgData.PlayerName = client.PlayerName;
                MessageQueuer.RelayMessage <PlayerConnectionSrvMsg>(client, msgData);

                LunaLog.Debug($"Online Players: {ServerContext.PlayerCount}, connected: {ClientRetriever.GetClients().Length}");
            }
        }
Example #2
0
        public void HandleHandshakeResponse(ClientStructure client, HandshakeResponseMsgData data)
        {
            var valid = CheckServerFull(client);

            valid &= valid && CheckUsernameLength(client, data.PlayerName);
            valid &= valid && CheckUsernameCharacters(client, data.PlayerName);
            valid &= valid && CheckWhitelist(client, data.PlayerName);
            valid &= valid && CheckPlayerIsAlreadyConnected(client, data.PlayerName);
            valid &= valid && CheckUsernameIsReserved(client, data.PlayerName);
            valid &= valid && CheckPlayerIsBanned(client, data.PlayerName, client.Endpoint.Address.ToString(), data.PublicKey);
            valid &= valid && CheckKey(client, data.PlayerName, data.PublicKey, data.ChallengeSignature);

            if (!valid)
            {
                LunaLog.Normal($"Client {data.PlayerName} failed to handshake: {Reason}. Disconnecting");
                client.DisconnectClient = true;
                ClientConnectionHandler.DisconnectClient(client, Reason);
            }
            else
            {
                client.PlayerName    = data.PlayerName;
                client.PublicKey     = data.PublicKey;
                client.Id            = Guid.NewGuid();
                client.Authenticated = true;

                LmpPluginHandler.FireOnClientAuthenticated(client);

                LunaLog.Normal($"Client {data.PlayerName} handshook successfully, Version: {data.MajorVersion}.{data.MinorVersion}.{data.BuildVersion}");

                CreatePlayerScenarioFiles(client, data.PlayerName);

                HandshakeSystemSender.SendHandshakeReply(client, HandshakeReply.HandshookSuccessfully, "success");

                var msgData = ServerContext.ServerMessageFactory.CreateNewMessageData <PlayerConnectionJoinMsgData>();
                msgData.PlayerName = client.PlayerName;

                MessageQueuer.RelayMessage <PlayerConnectionSrvMsg>(client, msgData);

                LunaLog.Debug($"Online Players: {ServerContext.PlayerCount}, connected: {ClientRetriever.GetClients().Length}");
            }
        }
        public static async void StartReceiveingMessages()
        {
            try
            {
                while (ServerContext.ServerRunning)
                {
                    var msg = Server.ReadMessage();
                    if (msg != null)
                    {
                        var client = TryGetClient(msg);
                        switch (msg.MessageType)
                        {
                        case NetIncomingMessageType.ConnectionApproval:
                            if (ServerContext.UsePassword)
                            {
                                var password = msg.ReadString();
                                if (password != GeneralSettings.SettingsStore.Password)
                                {
                                    msg.SenderConnection.Deny("Invalid password");
                                    break;
                                }
                            }
                            msg.SenderConnection.Approve();
                            break;

                        case NetIncomingMessageType.Data:
                            ClientMessageReceiver.ReceiveCallback(client, msg);
                            break;

                        case NetIncomingMessageType.WarningMessage:
                            LunaLog.Warning(msg.ReadString());
                            break;

                        case NetIncomingMessageType.DebugMessage:
                            LunaLog.NetworkDebug(msg.ReadString());
                            break;

                        case NetIncomingMessageType.ConnectionLatencyUpdated:
                        case NetIncomingMessageType.VerboseDebugMessage:
                            LunaLog.NetworkVerboseDebug(msg.ReadString());
                            break;

                        case NetIncomingMessageType.Error:
                            LunaLog.Error(msg.ReadString());
                            break;

                        case NetIncomingMessageType.StatusChanged:
                            switch ((NetConnectionStatus)msg.ReadByte())
                            {
                            case NetConnectionStatus.Connected:
                                var endpoint = msg.SenderConnection.RemoteEndPoint;
                                LunaLog.Normal($"New client Connection from {endpoint.Address}:{endpoint.Port}");
                                ClientConnectionHandler.ConnectClient(msg.SenderConnection);
                                break;

                            case NetConnectionStatus.Disconnected:
                                var reason = msg.ReadString();
                                if (client != null)
                                {
                                    ClientConnectionHandler.DisconnectClient(client, reason);
                                }
                                break;
                            }
                            break;

                        default:
                            var details = msg.PeekString();
                            LunaLog.Debug($"Lidgren: {msg.MessageType.ToString().ToUpper()} -- {details}");
                            break;
                        }
                    }
                    else
                    {
                        await Task.Delay(IntervalSettings.SettingsStore.SendReceiveThreadTickMs);
                    }
                }
            }
            catch (Exception e)
            {
                LunaLog.Fatal($"ERROR in thread receive! Details: {e}");
            }
        }
Example #4
0
        public void StartReceiveingMessages()
        {
            try
            {
                while (ServerContext.ServerRunning)
                {
                    var msg = Server.ReadMessage();
                    if (msg != null)
                    {
                        var client = TryGetClient(msg);
                        switch (msg.MessageType)
                        {
                        case NetIncomingMessageType.ConnectionApproval:
                            msg.SenderConnection.Approve();
                            break;

                        case NetIncomingMessageType.Data:
                            ClientMessageReceiver.ReceiveCallback(client, msg);
                            break;

                        case NetIncomingMessageType.WarningMessage:
                            LunaLog.Error($"Lidgren WARNING: {msg.ReadString()}");
                            break;

                        case NetIncomingMessageType.DebugMessage:
                        case NetIncomingMessageType.VerboseDebugMessage:
                            LunaLog.Debug($"Lidgren DEBUG: {msg.MessageType}-- {msg.PeekString()}");
                            break;

                        case NetIncomingMessageType.StatusChanged:
                            switch ((NetConnectionStatus)msg.ReadByte())
                            {
                            case NetConnectionStatus.Connected:
                                var endpoint = msg.SenderConnection.RemoteEndPoint;
                                LunaLog.Normal($"New client Connection from {endpoint.Address}:{endpoint.Port}");
                                ClientConnectionHandler.ConnectClient(msg.SenderConnection);
                                break;

                            case NetConnectionStatus.Disconnected:
                                var reason = msg.ReadString();
                                if (client != null)
                                {
                                    ClientConnectionHandler.DisconnectClient(client, reason);
                                }
                                break;
                            }
                            break;

                        default:
                            var details = msg.PeekString();
                            LunaLog.Debug($"Lidgren: {msg.MessageType.ToString().ToUpper()} -- {details}");
                            break;
                        }
                    }
                    else
                    {
                        Thread.Sleep(GeneralSettings.SettingsStore.SendReceiveThreadTickMs);
                    }
                }
            }
            catch (Exception e)
            {
                LunaLog.Fatal($"ERROR in thread receive! Details: {e}");
            }
        }
Example #5
0
        public static void StartReceivingMessages()
        {
            while (ServerContext.ServerRunning)
            {
                var msg = Server.WaitMessage(ServerContext.PlayerCount > 0 ? IntervalSettings.SettingsStore.SendReceiveThreadTickMs : int.MaxValue);
                if (msg != null)
                {
                    try
                    {
                        ClientStructure client = null;
                        if (msg.SenderConnection != null)
                        {
                            ServerContext.Clients.TryGetValue(msg.SenderConnection.RemoteEndPoint, out client);
                        }
                        switch (msg.MessageType)
                        {
                        case NetIncomingMessageType.ConnectionApproval:
                            if (ServerContext.UsePassword)
                            {
                                if (msg.ReadString() != GeneralSettings.SettingsStore.Password)
                                {
                                    msg.SenderConnection.Deny("Invalid password");
                                    break;
                                }
                            }
                            msg.SenderConnection.Approve();
                            break;

                        case NetIncomingMessageType.Data:
                            MessageReceiver.ReceiveCallback(client, msg);
                            if (client == null)
                            {
                                break;
                            }
                            client.BytesReceived += (uint)msg.LengthBytes;
                            break;

                        case NetIncomingMessageType.WarningMessage:
                            LunaLog.Warning(msg.ReadString());
                            break;

                        case NetIncomingMessageType.DebugMessage:
                            LunaLog.NetworkDebug(msg.ReadString());
                            break;

                        case NetIncomingMessageType.ConnectionLatencyUpdated:
                        case NetIncomingMessageType.VerboseDebugMessage:
                            LunaLog.NetworkVerboseDebug(msg.ReadString());
                            break;

                        case NetIncomingMessageType.ErrorMessage:
                        case NetIncomingMessageType.Error:
                            LunaLog.Error(msg.ReadString());
                            break;

                        case NetIncomingMessageType.StatusChanged:
                            switch ((NetConnectionStatus)msg.ReadByte())
                            {
                            case NetConnectionStatus.Connected:
                                var endpoint = msg.SenderConnection.RemoteEndPoint;
                                LunaLog.Normal($"New client Connection from {endpoint.Address}:{endpoint.Port}");
                                ClientConnectionHandler.ConnectClient(msg.SenderConnection);
                                break;

                            case NetConnectionStatus.Disconnected:
                                if (client != null)
                                {
                                    ClientConnectionHandler.DisconnectClient(client, msg.ReadString());
                                }
                                break;
                            }
                            break;

                        default:
                            LunaLog.Warning($"Unhandled Lidgren Message: {msg.MessageType} -- {msg.ReadString()}");
                            break;
                        }
                    }
                    catch (Exception e)
                    {
                        LunaLog.Error($"ERROR in networking thread! Details: {e}");
                    }
                }
            }
        }
Example #6
0
 /// <summary>
 /// Disconnects the given client
 /// </summary>
 public static void SendConnectionEnd(ClientStructure client, string reason)
 {
     ClientConnectionHandler.DisconnectClient(client, reason);
 }