// Метод, реализующий полноценное добавление нового пользователя в БД public RegisterError AddUser(AddUser newUser) { _db.BeginTransaction(); // Проверка - существует ли в БД уже такой логин if (_db.CheckIfInTable("users", new DbVal("login"), new DbVal($"'{newUser.Login}'"))) { _db.RollbackTransaction(); return(RegisterError.LOGIN_EXISTS); } // Добавление пользователя (без пароля) bool result = _db.AddToTable("users", new DbVal("role_id", "login"), new DbVal(2, newUser.Login) ); if (result) { // Получение id добавленного пользователя int userId = -1; int.TryParse(_db.GetFromTableSorted("users", new DbVal("id"), "id", IDatabase.OrderType.DESC, limit: 1)[0][0], out userId); if (userId < 0) { _db.RollbackTransaction(); return(RegisterError.OTHER); } // Генерация соли string salt = ""; for (int i = userId - 20; i < new Random().Next(userId - 10, userId); i++) { salt += new Random().Next(0, Math.Abs(i / 2)); } // Вычисление хэша string hash = CreatePasswordHash(newUser.Passw, salt); // Добавление пароля result = _db.AddToTable("passwords", new DbVal("user_id", "hash", "salt"), new DbVal(userId, hash, salt) ); if (result) { // Получение id добавленного пароля int passwId = -1; int.TryParse(_db.GetFromTableSorted("passwords", new DbVal("id"), "id", IDatabase.OrderType.DESC, limit: 1)[0][0], out passwId); if (passwId < 0) { _db.RollbackTransaction(); return(RegisterError.OTHER); } // Обновление id пароля длля пользователя result = _db.ChangeInTable("users", new DbVal("passw_id"), new DbVal(passwId), $"id={userId}"); } } if (result) { _db.CommitTransaction(); } else { _db.RollbackTransaction(); } return((result) ? RegisterError.NONE : RegisterError.OTHER); }