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); } }