Exemplo n.º 1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="message"></param>
        protected virtual void PermissionLevelRequestHandler(IIncomingMessage message)
        {
            var key = message.AsString();

            var extension = message.Peer.GetExtension <SecurityInfoPeerExtension>();

            var currentLevel = extension.PermissionLevel;
            var newLevel     = currentLevel;

            var permissionClaimed = false;

            foreach (var entry in permissions)
            {
                if (entry.key == key)
                {
                    newLevel          = entry.permissionLevel;
                    permissionClaimed = true;
                }
            }

            extension.PermissionLevel = newLevel;

            if (!permissionClaimed && !string.IsNullOrEmpty(key))
            {
                // If we didn't claim a permission
                message.Respond("Invalid permission key", ResponseStatus.Unauthorized);
                return;
            }

            message.Respond(newLevel, ResponseStatus.Success);
        }
Exemplo n.º 2
0
        protected virtual void OnGetUsersInChannelRequestHandler(IIncomingMessage message)
        {
            string responseMsg = string.Empty;

            var chatUser = message.Peer.GetExtension <ChatUserPeerExtension>();

            if (chatUser == null)
            {
                responseMsg = "Chat cannot identify you";

                logger.Error(responseMsg);

                message.Respond(responseMsg, ResponseStatus.Unauthorized);
                return;
            }

            var channelName = message.AsString();
            var channel     = GetOrCreateChannel(channelName);

            if (channel == null)
            {
                responseMsg = "This channel is forbidden";

                logger.Error(responseMsg);

                // There's no such channel
                message.Respond(responseMsg, ResponseStatus.Failed);
                return;
            }

            var users = channel.Users.Select(u => u.Username);

            message.Respond(users.ToBytes(), ResponseStatus.Success);
        }
Exemplo n.º 3
0
        private void HandleLobbyMasterChangeMsg(IIncomingMessage message)
        {
            var masterUsername = message.AsString();

            Data.GameMaster = masterUsername;
            Listener?.OnMasterChanged(masterUsername);
        }
Exemplo n.º 4
0
        private void HandleLobbyStatusTextChangeMsg(IIncomingMessage message)
        {
            var text = message.AsString();

            Data.StatusText = text;

            Listener?.OnLobbyStatusTextChanged(text);
        }
Exemplo n.º 5
0
        protected virtual void OnPickUsernameRequestHandler(IIncomingMessage message)
        {
            try
            {
                if (!allowUsernamePicking)
                {
                    throw new MstMessageHandlerException("Username picking is disabled", ResponseStatus.Failed);
                }

                var username = message.AsString();

                if (username.Contains(" "))
                {
                    throw new MstMessageHandlerException("Username cannot contain whitespaces", ResponseStatus.Failed);
                }

                var chatUser = message.Peer.GetExtension <ChatUserPeerExtension>();

                if (chatUser != null)
                {
                    throw new MstMessageHandlerException($"You're already identified as: {chatUser.Username}", ResponseStatus.Failed);
                }

                if (ChatUsers.ContainsKey(username))
                {
                    throw new MstMessageHandlerException("There's already a user who has the same username", ResponseStatus.Failed);
                }

                chatUser = CreateChatUser(message.Peer, username);

                if (!AddChatUser(chatUser))
                {
                    throw new MstMessageHandlerException("Failed to add user to chat", ResponseStatus.Failed);
                }

                // Add the extension
                message.Peer.AddExtension(chatUser);

                // Send response
                message.Respond(ResponseStatus.Success);
            }
            // If we got system exception
            catch (MstMessageHandlerException e)
            {
                logger.Error(e.Message);
                message.Respond(e.Message, e.Status);
            }
            // If we got another exception
            catch (Exception e)
            {
                logger.Error(e.Message);
                message.Respond(e.Message, ResponseStatus.Error);
            }
        }
Exemplo n.º 6
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="member"></param>
        /// <param name="message"></param>
        public void ChatMessageHandler(LobbyMember member, IIncomingMessage message)
        {
            var text = message.AsString();

            var messagePacket = new LobbyChatPacket()
            {
                Message = text,
                Sender  = member.Username
            };

            var msg = MessageHelper.Create((short)MstMessageCodes.LobbyChatMessage, messagePacket.ToBytes());

            Broadcast(msg);
        }
Exemplo n.º 7
0
        protected virtual void OnJoinChannelRequestHandler(IIncomingMessage message)
        {
            try
            {
                // Get user from peer
                var chatUser = message.Peer.GetExtension <ChatUserPeerExtension>();

                // If peer has no user
                if (chatUser == null)
                {
                    throw new MstMessageHandlerException("Chat cannot identify you", ResponseStatus.Unauthorized);
                }

                // Get channel name
                var channelName = message.AsString();

                // Trying to create channel with given name
                var channel = GetOrCreateChannel(channelName);

                if (channel == null)
                {
                    throw new MstMessageHandlerException("This channel is forbidden", ResponseStatus.Failed);
                }

                if (!channel.AddUser(chatUser))
                {
                    throw new MstMessageHandlerException("Failed to join a channel", ResponseStatus.Failed);
                }

                if (setFirstChannelAsLocal && chatUser.CurrentChannels.Count == 1)
                {
                    chatUser.DefaultChannel = channel;
                }

                message.Respond(ResponseStatus.Success);
            }
            // If we got system exception
            catch (MstMessageHandlerException e)
            {
                logger.Error(e.Message);
                message.Respond(e.Message, e.Status);
            }
            // If we got another exception
            catch (Exception e)
            {
                logger.Error(e.Message);
                message.Respond(e.Message, ResponseStatus.Error);
            }
        }
Exemplo n.º 8
0
        private void HandleLobbyMemberLeftMsg(IIncomingMessage message)
        {
            var username = message.AsString();

            Members.TryGetValue(username, out LobbyMemberData member);

            if (member == null)
            {
                return;
            }

            Members.Remove(username);

            Listener?.OnMemberLeft(member);
        }
Exemplo n.º 9
0
        protected virtual void OnJoinChannelRequestHandler(IIncomingMessage message)
        {
            var chatUser = message.Peer.GetExtension <ChatUserPeerExtension>();

            string responseMsg;

            if (chatUser == null)
            {
                responseMsg = "Chat cannot identify you";

                logger.Error(responseMsg);

                message.Respond(responseMsg, ResponseStatus.Unauthorized);
                return;
            }

            var channelName = message.AsString();

            var channel = GetOrCreateChannel(channelName);

            if (channel == null)
            {
                responseMsg = "This channel is forbidden";

                logger.Error(responseMsg);

                // There's no such channel
                message.Respond(responseMsg, ResponseStatus.Failed);
                return;
            }

            if (!channel.AddUser(chatUser))
            {
                responseMsg = "Failed to join a channel";

                logger.Error(responseMsg);

                message.Respond(responseMsg, ResponseStatus.Failed);
                return;
            }

            if (setFirstChannelAsLocal && chatUser.CurrentChannels.Count == 1)
            {
                chatUser.DefaultChannel = channel;
            }

            message.Respond(ResponseStatus.Success);
        }
Exemplo n.º 10
0
        private void OnSaveProfileResponseCallback(ResponseStatus status, IIncomingMessage response)
        {
            Mst.Events.Invoke(MstEventKeys.hideLoadingInfo);

            if (status == ResponseStatus.Success)
            {
                OnProfileSavedEvent?.Invoke();

                logger.Debug("Your profile is successfuly updated and saved");
            }
            else
            {
                Mst.Events.Invoke(MstEventKeys.showOkDialogBox, new OkDialogBoxEventMessage(response.AsString()));
                logger.Error(response.AsString());
            }
        }
Exemplo n.º 11
0
        protected virtual void OnLeaveChannelRequestHandler(IIncomingMessage message)
        {
            try
            {
                // Get user from peer
                var chatUser = message.Peer.GetExtension <ChatUserPeerExtension>();

                // If peer has no user
                if (chatUser == null)
                {
                    throw new MstMessageHandlerException("Chat cannot identify you", ResponseStatus.Unauthorized);
                }

                // Get channel name
                var channelName = message.AsString();

                // Trying to get channel by name
                if (!ChatChannels.TryGetValue(channelName, out ChatChannel channel))
                {
                    throw new MstMessageHandlerException("This channel does not exist", ResponseStatus.Failed);
                }

                // Remove user from channel
                channel.RemoveUser(chatUser);

                if (setLastChannelAsLocal && chatUser.CurrentChannels.Count == 1)
                {
                    chatUser.DefaultChannel = chatUser.CurrentChannels.First();
                }

                message.Respond(ResponseStatus.Success);
            }
            // If we got system exception
            catch (MstMessageHandlerException e)
            {
                logger.Error(e.Message);
                message.Respond(e.Message, e.Status);
            }
            // If we got another exception
            catch (Exception e)
            {
                logger.Error(e.Message);
                message.Respond(e.Message, ResponseStatus.Error);
            }
        }
Exemplo n.º 12
0
        protected virtual void OnSetDefaultChannelRequestHandler(IIncomingMessage message)
        {
            try
            {
                var chatUser = message.Peer.GetExtension <ChatUserPeerExtension>();

                // If peer has no user
                if (chatUser == null)
                {
                    throw new MstMessageHandlerException("Chat cannot identify you", ResponseStatus.Unauthorized);
                }

                var channelName = message.AsString();
                var channel     = GetOrCreateChannel(channelName);

                if (channel == null)
                {
                    throw new MstMessageHandlerException("This channel is forbidden", ResponseStatus.Failed);
                }

                // Add user to channel
                channel.AddUser(chatUser);

                // Set the property of default chat channel
                chatUser.DefaultChannel = channel;

                // Respond with a "success" status
                message.Respond(ResponseStatus.Success);
            }
            // If we got system exception
            catch (MstMessageHandlerException e)
            {
                logger.Error(e.Message);
                message.Respond(e.Message, e.Status);
            }
            // If we got another exception
            catch (Exception e)
            {
                logger.Error(e.Message);
                message.Respond(e.Message, ResponseStatus.Error);
            }
        }
Exemplo n.º 13
0
        /// <summary>
        /// Handles a request from game server to get a profile
        /// </summary>
        /// <param name="message"></param>
        protected virtual void GameServerProfileRequestHandler(IIncomingMessage message)
        {
            if (!HasPermissionToEditProfiles(message.Peer))
            {
                message.Respond("Invalid permission level", ResponseStatus.Unauthorized);
                return;
            }

            var userId = message.AsString();

            profilesList.TryGetValue(userId, out ObservableServerProfile profile);

            if (profile == null)
            {
                message.Respond(ResponseStatus.Failed);
                return;
            }

            message.Respond(profile.ToBytes(), ResponseStatus.Success);
        }
Exemplo n.º 14
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="message"></param>
        protected virtual async void GetAesKeyRequestHandler(IIncomingMessage message)
        {
            var extension    = message.Peer.GetExtension <SecurityInfoPeerExtension>();
            var encryptedKey = extension.AesKeyEncrypted;

            if (encryptedKey != null)
            {
                logger.Debug("There's already a key generated");

                // There's already a key generated
                message.Respond(encryptedKey, ResponseStatus.Success);
                return;
            }

            // Generate a random key
            var aesKey = Mst.Helper.CreateRandomAlphanumericString(8);

            var clientsPublicKeyXml = message.AsString();

            // Deserialize public key
            var sr = new System.IO.StringReader(clientsPublicKeyXml);
            var xs = new System.Xml.Serialization.XmlSerializer(typeof(RSAParameters));
            var clientsPublicKey = (RSAParameters)xs.Deserialize(sr);

            byte[] encryptedAes = await Task.Run(() =>
            {
                using (var csp = new RSACryptoServiceProvider())
                {
                    csp.ImportParameters(clientsPublicKey);
                    encryptedAes = csp.Encrypt(Encoding.Unicode.GetBytes(aesKey), false);

                    // Save keys for later use
                    extension.AesKeyEncrypted = encryptedAes;
                    extension.AesKey          = aesKey;

                    return(encryptedAes);
                }
            });

            message.Respond(encryptedAes, ResponseStatus.Success);
        }
Exemplo n.º 15
0
        /// <summary>
        /// Fired when player requested access to this room
        /// </summary>
        /// <param name="message"></param>
        private void ValidateRoomAccessRequestHandler(IIncomingMessage message)
        {
            var token      = message.AsString();
            var roomServer = Server as RoomServer;

            logger.Debug($"Client {message.Peer.Id} requested access validation");

            // Trying to validate room client connection access
            //Mst.Server.Rooms.ValidateAccess(roomServer.CurrentRoomController.RoomId, token, (usernameAndPeerId, error) =>
            //{
            //    if (usernameAndPeerId == null)
            //    {
            //        logger.Error(error);
            //        message.Peer.Disconnect("Invalid room access token");
            //        return;
            //    }

            //    // Let's get account info of the connected peer from master server
            //    Mst.Server.Auth.GetPeerAccountInfo(usernameAndPeerId.PeerId, (info, infoError) =>
            //    {
            //        if (info == null)
            //        {
            //            logger.Error(infoError);
            //            return;
            //        }

            //        logger.Debug($"Room got peer account info. {info}");

            //        // Create new room player info
            //        var roomUserExtension = new RoomUserPeerExtension(info.PeerId, info.Username, message.Peer, info.CustomOptions);

            //        // Add extension to peer
            //        message.Peer.AddExtension(roomUserExtension);

            //        // Inform all listeners
            //        OnPlayerJoinedEvent?.Invoke(roomUserExtension);
            //    });

            //    message.Respond(ResponseStatus.Success);
            //});
        }
Exemplo n.º 16
0
        protected virtual void OnSetDefaultChannelRequestHandler(IIncomingMessage message)
        {
            var chatUser = message.Peer.GetExtension <ChatUserPeerExtension>();

            string responseMsg;

            if (chatUser == null)
            {
                responseMsg = "Chat cannot identify you";

                logger.Error(responseMsg);

                message.Respond(responseMsg, ResponseStatus.Unauthorized);
                return;
            }

            var channelName = message.AsString();

            var channel = GetOrCreateChannel(channelName);

            if (channel == null)
            {
                responseMsg = "This channel is forbidden";

                logger.Error(responseMsg);

                // There's no such channel
                message.Respond(responseMsg, ResponseStatus.Failed);
                return;
            }

            // Add user to channel
            channel.AddUser(chatUser);

            // Set the property of default chat channel
            chatUser.DefaultChannel = channel;

            // Respond with a "success" status
            message.Respond(ResponseStatus.Success);
        }
Exemplo n.º 17
0
        protected virtual void OnLeaveChannelRequestHandler(IIncomingMessage message)
        {
            var chatUser = message.Peer.GetExtension <ChatUserPeerExtension>();

            string responseMsg;

            if (chatUser == null)
            {
                responseMsg = "Chat cannot identify you";

                logger.Error(responseMsg);

                message.Respond(responseMsg, ResponseStatus.Unauthorized);
                return;
            }

            var channelName = message.AsString().ToLower();

            if (!ChatChannels.TryGetValue(channelName, out ChatChannel channel))
            {
                responseMsg = "This channel does not exist";

                logger.Error(responseMsg);

                message.Respond(responseMsg, ResponseStatus.Failed);
                return;
            }

            channel.RemoveUser(chatUser);

            if (setLastChannelAsLocal && chatUser.CurrentChannels.Count == 1)
            {
                chatUser.DefaultChannel = chatUser.CurrentChannels.First();
            }

            message.Respond(ResponseStatus.Success);
        }
Exemplo n.º 18
0
        protected virtual void OnGetUsersInChannelRequestHandler(IIncomingMessage message)
        {
            try
            {
                var chatUser = message.Peer.GetExtension <ChatUserPeerExtension>();

                // If peer has no user
                if (chatUser == null)
                {
                    throw new MstMessageHandlerException("Chat cannot identify you", ResponseStatus.Unauthorized);
                }

                var channelName = message.AsString();
                var channel     = GetOrCreateChannel(channelName);

                if (channel == null)
                {
                    throw new MstMessageHandlerException("This channel is forbidden", ResponseStatus.Failed);
                }

                var users = channel.Users.Select(u => u.Username);
                message.Respond(users.ToBytes(), ResponseStatus.Success);
            }
            // If we got system exception
            catch (MstMessageHandlerException e)
            {
                logger.Error(e.Message);
                message.Respond(e.Message, e.Status);
            }
            // If we got another exception
            catch (Exception e)
            {
                logger.Error(e.Message);
                message.Respond(e.Message, ResponseStatus.Error);
            }
        }
Exemplo n.º 19
0
        protected virtual void OnPickUsernameRequestHandler(IIncomingMessage message)
        {
            string responseMsg;

            if (!allowUsernamePicking)
            {
                responseMsg = "Username picking is disabled";

                logger.Error(responseMsg);

                message.Respond(responseMsg, ResponseStatus.Failed);
                return;
            }

            var username = message.AsString();

            if (username.Contains(" "))
            {
                responseMsg = "Username cannot contain whitespaces";

                logger.Error(responseMsg);

                message.Respond(responseMsg, ResponseStatus.Failed);
                return;
            }

            var chatUser = message.Peer.GetExtension <ChatUserPeerExtension>();

            if (chatUser != null)
            {
                responseMsg = $"You're already identified as: {chatUser.Username}";

                logger.Error(responseMsg);

                message.Respond(responseMsg);
                return;
            }

            if (ChatUsers.ContainsKey(username.ToLower()))
            {
                responseMsg = "There's already a user who has the same username";

                logger.Error(responseMsg);

                message.Respond(responseMsg, ResponseStatus.Failed);
                return;
            }

            chatUser = new ChatUserPeerExtension(message.Peer, username);

            if (!AddChatUser(chatUser))
            {
                responseMsg = "Failed to add user to chat";

                logger.Error(responseMsg);

                message.Respond(responseMsg, ResponseStatus.Failed);
                return;
            }

            // Add the extension
            message.Peer.AddExtension(chatUser);

            message.Respond(ResponseStatus.Success);
        }