Пример #1
0
        // ---------------------------------------------------------- MESSAGING
        private void btnSendMessage_Click(object sender, EventArgs e)
        {
            txtMessage.Text = txtMessage.Text.Trim();
            if (txtMessage.Text == "")
            {
                return;
            }

            lblInfo.Text = "Sending Message...";

            dynamic     content;
            MessMessage outMessage;

            content         = new JObject();
            content.message = txtMessage.Text;

            outMessage         = new MessMessage();
            outMessage.type    = MessageTypes.TextMessage;
            outMessage.content = JsonConvert.SerializeObject(content);

            sendToServer(outMessage.toJSON());

            txtMessage.Text = "";

            lblInfo.Text = "Message sent";
        }
Пример #2
0
        // ---------------------------------------------------------- GUI UPDATING
        // Sends updated client list
        private void UpdateSendUserList()
        {
            MessMessage   outMessage;
            List <String> userList;

            log("Updating user list...", true);

            // Create user list from the dictionary
            userList = new List <string>();
            foreach (KeyValuePair <TcpClient, MessClient> client in clientList)
            {
                if (client.Value.isLogin)
                {
                    userList.Add(client.Value.ToString());
                }
            }

            // Generate user list message
            outMessage         = new MessMessage();
            outMessage.type    = MessageTypes.UserListUpdate;
            outMessage.content = JsonConvert.SerializeObject(userList);

            broadcast(outMessage.toJSON());
            log("Sent user list to current users");

            updateUIUserList();
            log("Current user list updated");
        }
Пример #3
0
        // ---------------------------------------------------------- LOG OUT
        private void logout()
        {
            string      displayMessage;
            MessMessage outMessage;

            if (clientSocket != null)
            {
                if (clientSocket.Connected)
                {
                    outMessage      = new MessMessage();
                    outMessage.type = MessageTypes.Terminate;
                    sendToServer(outMessage.toJSON());

                    messageThread.Abort();
                    clientSocket.Close();

                    displayMessage = String.Format("[{0}] You have disconnected",
                                                   DateTime.Now.ToString("dd-MM-yyyy HH:mm:ss")
                                                   );
                    logMessage(displayMessage);
                }
            }

            reset();
        }
Пример #4
0
        private void logMessage(MessMessage message)
        {
            /*
             *  Message Types:
             *      0: Login Info
             *      1: Text Message
             *      2: Image
             *      3: File
             */
            String typeMessage = "";

            switch (message.type)
            {
            case MessageTypes.TextMessage:
                typeMessage = "Text";
                break;

            case MessageTypes.ImageMessage:
                typeMessage = "Image";
                break;

            case MessageTypes.FileMessage:
                typeMessage = "File";
                break;
            }

            log(typeMessage + " Message Sent:", true);
            log(message.content);
        }
Пример #5
0
        private MessMessage editUser(dynamic data)
        {
            MessMessage message;
            DataTable   res       = new DataTable();
            dynamic     result    = new JObject();
            bool        isValid   = false;
            string      dbMessage = "";

            log("Attempting to edit user:"******"Old Name: " + data.oldName);
            log("New Name: " + data.newName);

            if (((String)data.newName).Trim() != "")
            {
                try {
                    db.OpenConnection();

                    db.setPreparedStatement("call p_edit_user(@val0, @val1)");
                    db.setPreparedVariables(new Dictionary <string, object> {
                        { "@val0", data.id },
                        { "@val1", data.newName }
                    });

                    res.Load(db.runPreparedStatement());

                    foreach (DataRow row in res.Rows)
                    {
                        isValid   = ((Int32)row["isValid"] == 1);
                        dbMessage = (String)row["message"];
                    }
                }
                catch (MySqlException e) {
                    log("Exception occured!");
                    log(e.ToString());
                }
                finally {
                    db.CloseConnection();
                }
            }
            else
            {
                isValid   = false;
                dbMessage = "Name needs to be real";
            }

            result.isValid = isValid;
            result.message = dbMessage;
            result.newName = data.newName;

            message         = new MessMessage();
            message.type    = MessageTypes.EditName;
            message.content = JsonConvert.SerializeObject(result);

            log("Result: " + dbMessage);

            return(message);
        }
Пример #6
0
        // ---------------------------------------------------------- SOCKETS
        private void socketsInit()
        {
            clientSocket = new TcpClient();
            String serverLocation = Properties.Settings.Default.serverLocation;
            int    clientPort     = Properties.Settings.Default.clientPort;

            // Check if Server Location is empty
            if (serverLocation == "")
            {
                lblInfo.Text = "Please set Server Location in Settings Tab.";
                return;
            }
            if (clientSocket.Connected)
            {
                logInfo("Already connected to Server");
                return;
            }

            messageThread = new Thread(new ThreadStart(recieveMessagesThread));
            messageThread.IsBackground = true;
            Thread socketCreationThread = new Thread(() => {
                try {
                    // Connect socket
                    clientSocket.Connect(serverLocation, clientPort);

                    logInfo("Conneciton established! Sending handshake");
                    MessMessage outMessage = new MessMessage();
                    dynamic content        = new JObject();
                    content.token          = "MessV3".GetHashCode();

                    // Get message contents
                    outMessage.type    = MessageTypes.HandshakeData;
                    outMessage.content = JsonConvert.SerializeObject(content);

                    sendToServer(outMessage.toJSON());

                    isConnected = true;

                    messageThread.Start();
                    this.Invoke((MethodInvoker) delegate {
                        btnConnect.Text = "Disconnect";
                        tabControlMain.SelectedIndex = 1;
                    });
                }
                catch (SocketException e) {
                    logInfo("Connection error! " + e.Message);
                }
            });

            socketCreationThread.IsBackground = true;
            socketCreationThread.Start();
        }
Пример #7
0
        private MessMessage validateUser(dynamic data)
        {
            MessMessage message;
            DataTable   res       = new DataTable();
            dynamic     result    = new JObject();
            bool        isLogin   = false;
            string      dbMessage = "";
            string      name      = "";
            int         id        = 0;

            log("Attempting to authorize user:"******"username: "******"call p_validate_user(@val0, @val1)");
                db.setPreparedVariables(new Dictionary <string, object> {
                    { "@val0", data.username },
                    { "@val1", data.password }
                });

                res.Load(db.runPreparedStatement());

                foreach (DataRow row in res.Rows)
                {
                    isLogin   = ((Int32)row["login"] == 1);
                    id        = ((Int32)row["id"]);
                    dbMessage = (String)row["message"];
                    name      = (String)row["name"];
                }
            } catch (MySqlException e) {
                log("Exception occured!");
                log(e.ToString());
            } finally {
                db.CloseConnection();
            }

            result.login   = isLogin;
            result.message = dbMessage;
            result.name    = name;
            result.id      = id;

            message         = new MessMessage();
            message.type    = MessageTypes.LoginData;
            message.content = JsonConvert.SerializeObject(result);

            log("Result: " + dbMessage);

            return(message);
        }
Пример #8
0
        private void changeDisplayName()
        {
            MessMessage outMessage;
            dynamic     content;

            content         = new JObject();
            content.newName = txtSettingsDisplayName.Text.Trim();

            lblInfo.Text = "Attempting modification...";

            outMessage         = new MessMessage();
            outMessage.type    = MessageTypes.EditName;
            outMessage.content = JsonConvert.SerializeObject(content);

            sendToServer(outMessage.toJSON());
            lblInfo.Text = "Updated name sent";
        }
Пример #9
0
        private void BtnMute_Click(object sender, EventArgs e)
        {
            if (listOnlineUsers.SelectedItem == null)
            {
                setUserControlEnabled(false);
                return;
            }

            MessClient userToMute = (MessClient)listOnlineUsers.SelectedItem;
            bool       toMute     = (btnMute.Text == "Mute User");

            // Update inverse list
            updateInverseClientList();

            // Mute or unmute client
            if (toMute)
            {
                log("Muting " + userToMute.name + "...", isNew: true);
                clientList[inverseClientList[userToMute]].isMuted = true;
                btnMute.Text = "Unmute User";
            }
            else
            {
                log("Unmuting " + userToMute.name + "...", isNew: true);
                clientList[inverseClientList[userToMute]].isMuted = false;
                btnMute.Text = "Mute User";
            }

            // Creating update message
            dynamic content = new JObject();

            content.message = String.Format("{0} {1}...", userToMute.name, (toMute ? "muted" : "able to speak"));
            content.author  = "Server";

            MessMessage message = new MessMessage();

            message.type    = MessageTypes.TextMessage;
            message.time    = Utilities.DateTime2UnixTimeStamp(DateTime.UtcNow);
            message.content = JsonConvert.SerializeObject(content);

            broadcast(message.toJSON());

            UpdateSendUserList();
        }
Пример #10
0
        private void Register()
        {
            MessMessage outMessage;
            dynamic     details;

            details          = new JObject();
            details.name     = txtLoginDisplayName.Text;
            details.username = txtLoginUsername.Text;
            details.password = txtLoginPassword2.Text.GetHashCode();

            lblInfo.Text = "Attempting registration...";

            outMessage         = new MessMessage();
            outMessage.type    = MessageTypes.RegisterData;
            outMessage.content = JsonConvert.SerializeObject(details);

            sendToServer(outMessage.toJSON());
            lblInfo.Text = "User details sent";
        }
Пример #11
0
        // ---- END INITIALIZATIONS



        // ------------------------------------------------------------------------------ GENERAL FUNCTIONS
        // ---------------------------------------------------------- USER MANAGEMENT
        private void Login()
        {
            MessMessage outMessage;
            dynamic     credentials;

            credentials          = new JObject();
            credentials.type     = MessageTypes.LoginData;
            credentials.username = txtLoginUsername.Text;
            credentials.password = txtLoginPassword.Text.GetHashCode();

            lblInfo.Text = "Attempting login...";

            outMessage         = new MessMessage();
            outMessage.type    = MessageTypes.LoginData;
            outMessage.content = JsonConvert.SerializeObject(credentials);

            sendToServer(outMessage.toJSON());
            lblInfo.Text = "Credentials sent";
        }
Пример #12
0
        // ------------------------------------------------------------------------------ SERVER SOCKET MANAGER
        public void manageServer()
        {
            TcpClient clientSocket = default(TcpClient);

            log("Starting listen socket...", true);
            serverSocket.Start();
            log("Chat Server Started", true);
            while (true)
            {
                byte[] bytesFrom = new byte[65536];

                // Await until connection
                clientSocket = serverSocket.AcceptTcpClient();

                log("Connection attempt recieved!", true);
                try {
                    // Recieving handshake from client
                    NetworkStream networkStream = clientSocket.GetStream();
                    networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
                } catch (IOException) {
                    log("Client left without handshake");
                    continue;
                }


                MessMessage inMessage, outMessage;
                string      messageRaw;
                int         token;
                dynamic     content;

                // Decoding json from bytes
                messageRaw = Encoding.Unicode.GetString(bytesFrom);

                // Deserializing json
                try {
                    inMessage = JsonConvert.DeserializeObject <MessMessage>(messageRaw);
                } catch (Exception) {
                    log("Weird message recieved:", isNew: true);
                    log(messageRaw);
                    continue;
                }

                log("Handshake!", true);
                log("From: " + clientSocket.Client.RemoteEndPoint.ToString());
                log("Packet: " + inMessage.ToString());


                Thread handshakeThread = new Thread(() => {
                    // Parse data from JSON String
                    content = JsonConvert.DeserializeObject(inMessage.content);
                    token   = content.token;

                    // TODO Ban users

                    // Validate handshake token
                    content         = new JObject();
                    content.isValid = (token == "MessV3".GetHashCode());
                    content.message = (Boolean)content.isValid ? "Valid Token" : "Invalid Token";
                    log("Token status: " + ((Boolean)content.isValid ? "valid" : "invalid"));

                    if (isServerLocked)
                    {
                        log("Server is locked! Revoking connection...");
                        content.message = "Server is locked, cannot connect.";
                        content.isValid = false;
                    }

                    // Prepare handshake response
                    outMessage         = new MessMessage();
                    outMessage.type    = MessageTypes.HandshakeData;
                    outMessage.content = JsonConvert.SerializeObject(content);
                    // Send handshake response
                    sendMessage(outMessage.toJSON(), clientSocket);

                    // If the token is valid add him to the list
                    if ((Boolean)content.isValid)
                    {
                        clientList.Add(clientSocket, new MessClient());

                        // Create and start listening thread
                        Thread clientThread       = new Thread(() => { clientThreadFunction(clientSocket); });
                        clientThread.IsBackground = true;
                        clientThread.Start();
                    }
                });
                handshakeThread.IsBackground = true;
                handshakeThread.Start();
            }
        }
Пример #13
0
        // ------------------------------------------------------------------------------ CLIENT THREAD FUNCTION
        public void clientThreadFunction(TcpClient socket)
        {
            int buffSize = 0;

            byte[]      inBytes;
            string      JSONMessage;
            string      authorName = "";
            int         id = 0;
            MessMessage inMessage, outMessage;

            TcpClient     clientSocket = socket;
            NetworkStream serverStream;

            try {
                // Initializing input bytes

                while (true)
                {
                    // Resetting variables
                    outMessage = new MessMessage();

                    inBytes      = new byte[65536];
                    serverStream = clientSocket.GetStream();
                    buffSize     = clientSocket.ReceiveBufferSize;

                    // Get next message from user
                    serverStream.Read(inBytes, 0, buffSize);

                    // Get data from JSON string
                    JSONMessage = Encoding.Unicode.GetString(inBytes);
                    inMessage   = JsonConvert.DeserializeObject <MessMessage>(JSONMessage);

                    dynamic content = JsonConvert.DeserializeObject(inMessage.content);
                    authorName = clientList[clientSocket].name;
                    id         = clientList[clientSocket].id;

                    // Check for message type
                    switch (inMessage.type)
                    {
                    case MessageTypes.Terminate:
                        log("User disconnecting...", true);
                        log("Info: " + clientSocket.Client.RemoteEndPoint.ToString());
                        log("Name: " + authorName);

                        clientSocket.Close();
                        log("User disconnected");
                        UpdateSendUserList();

                        content.author  = authorName;
                        content.message = "Disconnected";

                        // TODO Connection message type
                        outMessage.type    = MessageTypes.TextMessage;
                        outMessage.time    = Utilities.DateTime2UnixTimeStamp(DateTime.UtcNow);
                        outMessage.content = JsonConvert.SerializeObject(content);

                        broadcast(outMessage.toJSON());
                        return;

                    case MessageTypes.RegisterData:
                        // Create new user
                        outMessage = createUser(content);
                        sendMessage(outMessage.toJSON(), clientSocket);
                        break;

                    case MessageTypes.LoginData:
                        // Authenticate credentials
                        outMessage = validateUser(content);

                        dynamic result = JsonConvert.DeserializeObject(outMessage.content);

                        // Update client information
                        clientList[clientSocket].name    = result.name;
                        clientList[clientSocket].isLogin = result.login;
                        clientList[clientSocket].id      = result.id;

                        sendMessage(outMessage.toJSON(), clientSocket);
                        if ((Boolean)result.login)
                        {
                            UpdateSendUserList();
                        }
                        break;

                    case MessageTypes.EditName:
                        // Modify user's name
                        content.oldName = authorName;
                        content.id      = id;

                        outMessage = editUser(content);

                        content = JsonConvert.DeserializeObject(outMessage.content);

                        if ((Boolean)content.isValid)
                        {
                            clientList[clientSocket].name = content.newName;
                            UpdateSendUserList();
                        }

                        sendMessage(outMessage.toJSON(), clientSocket);
                        break;

                    case MessageTypes.TextMessage:
                        // Text message
                        if (!clientList[clientSocket].isMuted)
                        {
                            if (clientList[clientSocket].isLogin)
                            {
                                // Adding author
                                content.author = authorName;

                                // Setting message up
                                outMessage.type    = inMessage.type;
                                outMessage.time    = Utilities.DateTime2UnixTimeStamp(DateTime.UtcNow);
                                outMessage.content = JsonConvert.SerializeObject(content);

                                // Logging message
                                logMessage(outMessage);
                                // Sending message to all
                                broadcast(outMessage.toJSON());
                            }
                            else
                            {
                                // User hasn't logged in
                                content.message = "Cannot send messages, user hasn't logged in!";

                                // Setting message up
                                outMessage.type    = MessageTypes.GenericData;
                                outMessage.content = JsonConvert.SerializeObject(content);

                                // Sending message
                                sendMessage(outMessage.toJSON(), clientSocket);
                            }
                        }
                        else
                        {
                            // User is muted
                            content.message = "User is muted";

                            // Setting message up
                            outMessage.type    = MessageTypes.GenericData;
                            outMessage.content = JsonConvert.SerializeObject(content);

                            // Sending message
                            sendMessage(outMessage.toJSON(), clientSocket);
                        }
                        break;
                    }
                }
            } catch (IOException) {
                log("User disconnected forcefully", true);
                log("Info: " + clientSocket.Client.RemoteEndPoint.ToString());
                log("Name: " + authorName);

                // Remove user from client list
                clientList.Remove(clientSocket);
                clientSocket.Close();
                UpdateSendUserList();
                return;
            } catch (InvalidOperationException e) {
                // Cannot connect to database
                log(e.ToString());
                log("Cannot connect to DB!");
            } catch (Exception e) {
                // Catch ALL Exceptions just in case
                log(e.ToString());
                log("Exception raised, thread terminated...", isNew: false);
            }
        }
Пример #14
0
        // ---------------------------------------------------------- CLIENT DB MANAGEMENT
        private MessMessage createUser(dynamic data)
        {
            Random      random = new Random();
            MessMessage message;
            DataTable   res       = new DataTable();
            dynamic     result    = new JObject();
            int         errorCode = 0;
            string      dbMessage = "";

            log("Attempting to authorize user to create new user:"******"username: "******", name: " + data.name);

            if (((String)data.username).Trim() == "")
            {
                errorCode = 3;
                dbMessage = "User needs username";
            }
            else if (((String)data.name).Trim() == "")
            {
                errorCode = 3;
                dbMessage = "Name needs to exist";
            }
            else if (data.password == "".GetHashCode())
            {
                errorCode = 3;
                dbMessage = "Password needed";
            }
            else
            {
                try {
                    db.OpenConnection();

                    db.setPreparedStatement("call p_create_user(@val0, @val1, @val2, @val3)");
                    db.setPreparedVariables(new Dictionary <string, object> {
                        { "@val0", random.Next(0, 9999) }, // id INT
                        { "@val1", data.name },            // name STRING
                        { "@val2", data.username },        // username STRING
                        { "@val3", data.password }         // password INT
                    });

                    res.Load(db.runPreparedStatement());

                    foreach (DataRow row in res.Rows)
                    {
                        errorCode = (Int32)row["errorCode"];
                        dbMessage = (String)row["message"];
                    }
                } catch (MySqlException e) {
                    log("Exception occured!");
                    log(e.ToString());
                } finally {
                    db.CloseConnection();
                }
            }


            if (errorCode != 2)
            {
                result.isValid = (errorCode == 0);
                result.message = dbMessage;
            }
            else
            {
                result = createUser(data);
            }

            message         = new MessMessage();
            message.type    = MessageTypes.RegisterData;
            message.content = JsonConvert.SerializeObject(result);

            log("Result: " + dbMessage);

            return(message);
        }