/// <summary>
        /// Method for managing user actions
        /// </summary>
        /// <param name="socket"></param>
        public void ProcessClient(object socket)
        {
            try
            {
                clientSocket = (Socket)socket;
                networkStream = new NetworkStream(clientSocket);
                BinaryReader = new BinaryReader(networkStream);
                BunaryWriter = new BinaryWriter(networkStream);

                //Authenticate the user
                user = AuthenticateUser();

                if (user != null)
                {
                    while (clientSocket.Connected)
                    {
                        //While the connection is active process user action
                        if (!ProcessRequest())
                        {
                            //if user disconnects then close the socket connection
                            clientSocket.Close();
                            break;
                        }
                    }
                }
                else
                {
                    //if user disconnects then close the socket connection
                    clientSocket.Close();
                    ProcessMessage(Constants.CONNECTION_CLOSED);
                }
            }
            catch (Exception e)
            {
                if (ProcessError != null)
                {
                    ProcessError(e.Message);
                }
            }
        }
        /// <summary>
        /// Method to register new user
        /// </summary>
        /// <returns></returns>
        private User RegisterUser()
        {
            string username;
            string password;
            UserRightsEnum rights = UserRightsEnum.None;

            username = BinaryReader.ReadString();
            password = BinaryReader.ReadString();
            rights = (UserRightsEnum)BinaryReader.ReadInt32();

            if (Users.Any(u => u.Username == username))
            {
                BunaryWriter.Write(string.Format(Constants.USERNAME_ALREADY_IN_USE, username));
                return AuthenticateUser();
            }
            else
            {
                User newUser = new User(username, password, rights);
                lock (Users)
                {
                    Users.Add(newUser);
                }

                string message = string.Format(Constants.USER_SUCCESSFULLY_REGISTERED, username);
                ProcessMessage(message);
                BunaryWriter.Write(message);

                return newUser;
            }
        }
        /// <summary>
        /// Method to login the user
        /// </summary>
        /// <returns></returns>
        private User LoginUser()
        {
            string username;
            string password;
            User user;
            try
            {
                username = BinaryReader.ReadString();
                password = BinaryReader.ReadString();

                user = Users.FirstOrDefault(u => u.Username == username && u.Password == password);

                if (user != null)
                {
                    ProcessMessage(string.Format(Constants.USER_LOGGED_IN, username));
                    BunaryWriter.Write(string.Format(Constants.WELLCOME_IN_THE_SYSTEM, username));
                    return user;
                }
                else
                {
                    BunaryWriter.Write(Constants.USERNAME_OR_PASSWORD_INCORRECT);
                }
            }
            catch (Exception e)
            {
                BunaryWriter.Write(e.Message);
            }

            return AuthenticateUser();
        }
        /// <summary>
        /// Method for managing user actions
        /// </summary>
        /// <returns>True if user performs another action and False if user disconnects</returns>
        private bool ProcessRequest()
        {
            //Get user action
            ActionEnum currentAction = ((ActionEnum)BinaryReader.ReadInt32());

            if (currentAction == ActionEnum.GenerateToken && (user.Rights == UserRightsEnum.GenerateToken || user.Rights == UserRightsEnum.All))
            {
                //Generate token if user has rights
                GenerateToken();
            }
            else if (currentAction == ActionEnum.RequestCardNumber && (user.Rights == UserRightsEnum.Request || user.Rights == UserRightsEnum.All))
            {
                //request bank card number if user has rights
                RequestCardId();
            }
            else if (currentAction == ActionEnum.Logout)
            {
                //Logout user from the sustem
                ProcessMessage(string.Format(Constants.USER_HAS_LOGGED_OUT, user.Username));
                this.user = null;
                BunaryWriter.Write(true);
                user = AuthenticateUser();
                if(user == null)
                    return false;
            }
            else if (currentAction == ActionEnum.Disconnect)
            {
                //Disconnect client
                ProcessMessage(string.Format(Constants.USER_HAS_DISCONNECTED, user.Username));
                this.user = null;
                return false;
            }
            else
            {
                //User has no rights
                BunaryWriter.Write((int)ActionEnum.Denied);
            }

            //Operation completed successfully
            return true;
        }
예제 #5
0
 /// <summary>
 /// Copy constructor
 /// </summary>
 /// <param name="user"></param>
 public User(User user)
     : this(user.Username, user.Password, user.Rights)
 {
 }