/// <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; }
/// <summary> /// Copy constructor /// </summary> /// <param name="user"></param> public User(User user) : this(user.Username, user.Password, user.Rights) { }