package auth import ( "errors" "linux-auth/internal/db" "linux-auth/internal/utils" ) /** * @brief Проверка аутентификации пользователя * * Сравнивает введённый пароль с хешем из БД. * Учитывает блокировку пользователя и количество неудачных попыток. * * @param username Логин пользователя * @param password Введённый пароль * @return true если доступ разрешён, false если логин/пароль неверны * @return ошибка если произошла системная ошибка (например, БД) */ func Authenticate(username, password string) (bool, error) { user, err := db.GetUser(username) if err != nil { // Пользователь не найден return false, nil } // Проверка блокировки if user.Locked { return false, errors.New("пользователь заблокирован") } // Проверка пароля if !utils.CheckPassword(password, user.PasswordHash) { // Инкрементируем счётчик неудачных попыток err := db.IncrementFail(username) if err != nil { return false, err } // Если достигнут максимум — блокируем const MaxAttempts = 3 // Можно передавать через config.toml user.FailedAttempts++ if user.FailedAttempts >= MaxAttempts { _ = db.LockUser(username) } return false, nil } // Успешный вход — сбрасываем счётчик неудачных попыток _ = db.ResetFails(username) return true, nil }