/// <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);
        }
Exemple #2
0
        /// <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
        }