async Task <bool> UpdateUserInDatabase(UserDatabaseEntry entry)
 {
     if (!IsConnected)
     {
         return(false);
     }
     using (var cmd = new MySqlCommand(
                "UPDATE users SET userName=@p2, elo=@p3, passwordHash=@p4, passwordSalt=@p5, mustChangePassword=@p6, isAccountEnabled=@p7 " +
                "WHERE idUser=@p1", _connection))
     {
         cmd.Parameters.Add(new MySqlParameter("@p1", entry.IdUser));
         cmd.Parameters.Add(new MySqlParameter("@p2", entry.UserName));
         cmd.Parameters.Add(new MySqlParameter("@p3", entry.ELO));
         cmd.Parameters.Add(new MySqlParameter("@p4", entry.PasswordHash));
         cmd.Parameters.Add(new MySqlParameter("@p5", entry.PasswordSalt));
         cmd.Parameters.Add(new MySqlParameter("@p6", entry.MustChangePassword));
         cmd.Parameters.Add(new MySqlParameter("@p7", entry.IsAccountEnabled));
         if (await cmd.ExecuteNonQueryAsync() != 1)
         {
             Log.WriteLine(LogPriority.Error, "Error: Updating user in database table failed.");
             return(false);
         }
         return(true);
     }
 }
 async Task <bool> InsertUserToDatabase(UserDatabaseEntry entry)
 {
     if (!IsConnected)
     {
         return(false);
     }
     try
     {
         using (var cmd = new MySqlCommand(
                    "INSERT INTO users (userName,elo,passwordHash,passwordSalt,mustChangePassword,isAccountEnabled) VALUES (@p1,@p2,@p3,@p4,@p5,@p6);", _connection))
         {
             cmd.Parameters.Add(new MySqlParameter("@p1", entry.UserName));
             cmd.Parameters.Add(new MySqlParameter("@p2", entry.ELO));
             cmd.Parameters.Add(new MySqlParameter("@p3", entry.PasswordHash));
             cmd.Parameters.Add(new MySqlParameter("@p4", entry.PasswordSalt));
             cmd.Parameters.Add(new MySqlParameter("@p5", entry.MustChangePassword));
             cmd.Parameters.Add(new MySqlParameter("@p6", entry.IsAccountEnabled));
             if (await cmd.ExecuteNonQueryAsync() != 1)
             {
                 Log.WriteLine(LogPriority.Error, "Error: Inserting user to database table failed.");
                 return(false);
             }
             return(true);
         }
     }
     catch (Exception e)
     {
         Log.WriteLine(LogPriority.Error, "InsertUserToDatabase: " + e.Message);
         return(false);
     }
 }
        UserDatabaseEntry UserFromLine(string line)
        {
            if (string.IsNullOrEmpty(line))
            {
                return(null);
            }

            line = line.Replace("\r", "").Replace("\t", "");

            var spl = line.Split(' ');

            if (spl.Length != 6)
            {
                return(null);
            }

            try
            {
                UserDatabaseEntry entry = new UserDatabaseEntry
                {
                    UserName           = spl[0],
                    ELO                = int.Parse(spl[1]),
                    PasswordHash       = spl[2],
                    PasswordSalt       = spl[3],
                    MustChangePassword = spl[4] == "1",
                    IsAccountEnabled   = spl[5] == "1"
                };
                return(entry);
            }
            catch { return(null); }
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="user"></param>
        /// <param name="password"></param>
        /// <param name="elo">ELO rating. Default: 1000</param>
        /// <param name="isAccountEnabled">Set true to activate the new account. Else an admin has to activate the account manually.</param>
        /// <returns></returns>
        public async Task <bool> AddUserAsync(string user, SecureString password, int elo, bool isAccountEnabled)
        {
            if (_databaseFile == null)
            {
                return(false);
            }
            user = user.Trim();
            if (!LoginHelper.CheckUserName(user))
            {
                return(false);
            }
            await semaphoreSlim.WaitAsync();

            try
            {
                var db = await ReadDatabaseAsync();

                // Check if there is a line that starts with username
                if (db.Exists(o => o.UserName == user))
                {
                    Log.WriteLine(LogPriority.Error, "AddUser: A user with that name already exists.");
                    return(false);
                }

                string hash, salt;
                if (!PasswordHasher.GetNewHash(password.ConvertToUnsecureString(), out hash, out salt))
                {
                    return(false);
                }

                if (elo < 0)
                {
                    elo = 0;
                }
                if (elo > 10000)
                {
                    elo = 10000;
                }

                var usr = new UserDatabaseEntry
                {
                    UserName           = user,
                    PasswordHash       = hash,
                    PasswordSalt       = salt,
                    MustChangePassword = false,
                    ELO = elo,
                    IsAccountEnabled = true
                };

                db.Add(usr);

                return(await WriteDatabaseAsync(db));
            }
            catch (Exception)
            {
                return(false);
            }
            finally { semaphoreSlim.Release(); }
        }
 string UserToLine(UserDatabaseEntry entry)
 {
     return
         (entry.UserName + " " +
          entry.ELO + " " +
          entry.PasswordHash + " " +
          entry.PasswordSalt + " " +
          (entry.MustChangePassword ? "1" : "0") + " " +
          (entry.IsAccountEnabled ? "1" : "0"));
 }
        public async Task <bool> AddUserAsync(string user, SecureString password, int elo, bool isAccountEnabled)
        {
            if (!IsConnected)
            {
                return(false);
            }
            if (!LoginHelper.CheckUserName(user))
            {
                return(false);
            }

            await _semaphoreSlim.WaitAsync();

            try
            {
                var usr = await ReadUserFromDatabaseAsync(user);

                if (usr != null)
                {
                    Log.WriteLine(LogPriority.Error, "AddUser: A user with that name already exists.");
                    return(false);
                }

                // Build password string
                string hash;
                string salt;
                PasswordHasher.GetNewHash(password.ConvertToUnsecureString(), out hash, out salt);

                usr = new UserDatabaseEntry
                {
                    UserName           = user,
                    PasswordHash       = hash,
                    PasswordSalt       = salt,
                    MustChangePassword = false,
                    ELO = elo,
                    IsAccountEnabled = true
                };
                return(await InsertUserToDatabase(usr));
            }
            catch (Exception e)
            {
                Log.WriteLine(LogPriority.Error, "Error: " + e.Message);
                return(false);
            }
            finally { _semaphoreSlim.Release(); }
        }
 async Task <UserDatabaseEntry> ReadUserFromDatabaseAsync(string user)
 {
     if (!IsConnected)
     {
         return(null);
     }
     if (!LoginHelper.CheckUserName(user))
     {
         return(null);
     }
     try
     {
         using (var cmd = new MySqlCommand(
                    "SELECT idUser,userName,elo,passwordHash,passwordSalt,mustChangePassword,isAccountEnabled FROM users WHERE userName=@param1;", _connection))
         {
             cmd.Parameters.Add(new MySqlParameter("@param1", user));
             using (var reader = await cmd.ExecuteReaderAsync())
             {
                 if (reader == null || reader.VisibleFieldCount != 6)
                 {
                     // Sometimes it is intended that this method fails, so don't spam this
                     // Log.WriteLine(LogPriority.Error, "Error: Reading user entry from database failed.");
                 }
                 if (reader.HasRows && await reader.ReadAsync())
                 {
                     var usr = new UserDatabaseEntry
                     {
                         IdUser             = Convert.ToInt32(reader.GetValue(0)),
                         UserName           = Convert.ToString(reader.GetValue(1)),
                         ELO                = Convert.ToInt32(reader.GetValue(2)),
                         PasswordHash       = Convert.ToString(reader.GetValue(3)),
                         PasswordSalt       = Convert.ToString(reader.GetValue(4)),
                         MustChangePassword = Convert.ToBoolean(reader.GetValue(5)),
                         IsAccountEnabled   = Convert.ToBoolean(reader.GetValue(6))
                     };
                     return(usr);
                 }
             }
         }
         return(null);
     }
     catch
     {
         return(null);
     }
 }