/// <summary> /// Bans created user. /// </summary> /// <param name="error">Error messaage if occured.</param> /// <returns>Result of operation.</returns> public bool BanUser(out string error) { // Create users for test. Helpers.Users.SetBaseUsersPool(); // Create admin user. if (!UniformDataOperator.Sql.SqlOperatorHandler.Active.SetToTable(typeof(User), Helpers.Users.user_Moderator, out error)) { return(false); } // Building query. BanInformation banInformation = BanInformation.Permanent; banInformation.blockedRights = new string[] { "logon" }; Query query = new Query( new QueryPart("token", Helpers.Users.user_Moderator.tokens[0]), new QueryPart("guid", "bunUserTest"), new QueryPart("user", "banneduser"), new QueryPart("ban", banInformation)); // Marker that avoid finishing of the test until receiving result. bool operationCompete = false; bool operationResult = false; string internalError = null; // Start reciving clent line. UniformClient.BaseClient.EnqueueDuplexQueryViaPP( // Request connection to localhost server via main pipe. "localhost", Helpers.Networking.DefaultQueriesPipeName, query, // Handler that would recive ther ver answer. (PipesProvider.Client.TransmissionLine line, Query answer) => { if (answer.First.PropertyValueString.StartsWith("error", StringComparison.OrdinalIgnoreCase)) { internalError = query.First.PropertyValueString; operationResult = false; } else { operationResult = true; } operationCompete = true; }); // Wait until operation would complete. while (!operationCompete) { Thread.Sleep(5); } error = internalError; return(operationResult); //User user = (User)Activator.CreateInstance(User.GlobalType); //user.login = "******"; //// Get user id. //if (!UniformDataOperator.Sql.SqlOperatorHandler.Active.SetToObject( // User.GlobalType, user, out error, // new string[] { "userid " }, // "login")) //{ // return false; //} //// Create new permanent ban. //BanInformation ban = BanInformation.Permanent; //ban.userId = user.id; //ban.bannedByUserId = user.id; //ban.blockedRights = new string[] { "logon" }; // Set logon ban. //// Set ban to database. //return UniformDataOperator.Sql.SqlOperatorHandler.Active.SetToTable( // typeof(BanInformation), // ban, // out error); }
/// <summary> /// Methods that process query. /// </summary> /// <param name="serverTL">Operator that call that operation</param> /// <param name="query">Recived query.</param> public void Execute(object serverTL, Query query) { bool dataOperationFailed = false; #region Input data // Get params. query.TryGetParamValue("login", out QueryPart login); query.TryGetParamValue("password", out QueryPart password); query.TryGetParamValue("os", out QueryPart os); query.TryGetParamValue("mac", out QueryPart mac); query.TryGetParamValue("stamp", out QueryPart timeStamp); // Create user instance of requested type. User user = (User)Activator.CreateInstance(OperatingType); user.login = login.PropertyValueString; #endregion Task asyncDataOperator = null; // Get data from SQL server if connected. if (UniformDataOperator.Sql.SqlOperatorHandler.Active != null) { #region SQL server #region Get user // Subscribe on errors. UniformDataOperator.Sql.SqlOperatorHandler.SqlErrorOccured += ErrorListener; // Request data. asyncDataOperator = UniformDataOperator.Sql.SqlOperatorHandler.Active.SetToObjectAsync( OperatingType, Session.Current.TerminationTokenSource.Token, user, new string[0], new string[] { "login" }); // If async operation started. if (asyncDataOperator != null) { // Wait until finishing. while (!asyncDataOperator.IsCompleted && !asyncDataOperator.IsCanceled) { Thread.Sleep(5); } // Unsubscribe from errors listening. UniformDataOperator.Sql.SqlOperatorHandler.SqlErrorOccured -= ErrorListener; } // Drop if async operation failed. if (dataOperationFailed) { return; } #endregion #region Get bans data // Subscribe on errors. UniformDataOperator.Sql.SqlOperatorHandler.SqlErrorOccured += ErrorListener; // Request data. Task banListnerAsyncDataOperator = UniformDataOperator.Sql.SqlOperatorHandler.Active.SetToObjectsAsync( BanInfoOperatingType, Session.Current.TerminationTokenSource.Token, new BanInformation() { userId = user.id }, delegate(IList collection) { user.bans = (List <BanInformation>)collection; }, new string[0], new string[] { "user_userid" }); // If async operation started. if (banListnerAsyncDataOperator != null) { // Wait until finishing. while (!banListnerAsyncDataOperator.IsCompleted && !banListnerAsyncDataOperator.IsCanceled) { Thread.Sleep(5); } // Unsubscribe from errors listening. UniformDataOperator.Sql.SqlOperatorHandler.SqlErrorOccured -= ErrorListener; } #endregion #endregion } // Looking for user in local storage. else { #region Local storage // Find user. if (!API.LocalUsers.TryToFindUser(login.PropertyValueString, out user)) { // Inform that user not found. UniformServer.BaseServer.SendAnswerViaPP("ERROR 412: User not found", query); return; } #endregion } // Drop if async operation failed. if (dataOperationFailed) { return; } #region Validate password. // Comapre password with stored. if (!user.IsOpenPasswordCorrect(password.PropertyValueString)) { // Inform that password is incorrect. UniformServer.BaseServer.SendAnswerViaPP("ERROR 412: Incorrect password", query); return; } // Check for logon bans if (BanInformation.IsBanned(user, "logon")) { // Inform that password is incorrect. UniformServer.BaseServer.SendAnswerViaPP("ERROR 412: User banned.", query); return; } #endregion #region Build answer // Generate new token. string sessionToken = UniformQueries.Tokens.UnusedToken; // Registrate token in session. if (!user.tokens.Contains(sessionToken)) { user.tokens.Add(sessionToken); } // Registrate token for user. Session.Current.AssignTokenToUser( user, sessionToken, mac.PropertyValueString, os.PropertyValueString, timeStamp.PropertyValueString); // Set rights. Session.Current.SetTokenRights(sessionToken, user.rights); // Return session data to user. string rightsString = ""; // Add rights' codes. foreach (string rightsCode in user.rights) { // Add every code splited by '+'. rightsString += "+" + rightsCode; } // Building query. Query answerQuery = new Query( new QueryPart("token", sessionToken), new QueryPart("expiryIn", DateTime.UtcNow.AddMinutes(Config.Active.TokenValidTimeMinutes).ToBinary()), new QueryPart("rights", rightsString) ); // Send token to client. UniformServer.BaseServer.SendAnswerViaPP(answerQuery, query); #endregion #region SQL server callbacks // Looking for user on SQL server if connected. void ErrorListener(object sender, string message) { // Drop if not target user. if (!user.Equals(sender)) { return; } // Mark that data receiving failed. dataOperationFailed = true; // Unsubscribe. UniformDataOperator.Sql.SqlOperatorHandler.SqlErrorOccured -= ErrorListener; // Inform that user not found. UniformServer.BaseServer.SendAnswerViaPP("ERROR SQL SERVER: " + message, query); } #endregion }