package main import ( "flag" "fmt" "log" "os" "linux-auth/internal/auth" "linux-auth/internal/config" "linux-auth/internal/db" "linux-auth/internal/ui" ) /** * @brief Точка входа в приложение аутентификации * * Программа загружает конфигурацию, инициализирует БД * и запускает цикл аутентификации пользователя. */ func main() { // ---------- Работа с аргументами ---------- configPath := flag.String( "config", "configs/config.toml", "Путь к конфигурационному файлу", ) flag.Parse() // ---------- Загрузка конфигурации ---------- cfg, err := config.Load(*configPath) if err != nil { log.Fatalf("Ошибка загрузки конфигурации: %v\n", err) } if cfg.App.Name != "" { fmt.Println("=== ", cfg.App.Name, " ===") } // ---------- Инициализация БД ---------- err = db.Init(cfg.Database.Path) if err != nil { log.Fatalf("Ошибка инициализации БД: %v\n", err) } defer db.Close() // ---------- Основной цикл аутентификации ---------- attempts := 0 for { // Проверка лимита попыток if attempts >= cfg.App.MaxLoginAttempts { fmt.Println("Превышено количество попыток входа.") os.Exit(1) } // Ввод логина и пароля username, password, err := ui.ReadCredentials() if err != nil { fmt.Println("Ошибка ввода данных.") attempts++ continue } // Проверка аутентификации ok, err := auth.Authenticate(username, password) if err != nil { fmt.Printf("Ошибка аутентификации: %v\n", err) attempts++ continue } if ok { fmt.Printf("Доступ разрешён. Добро пожаловать, %s!\n", username) break } else { fmt.Println("Неверный логин или пароль.") attempts++ } // Предложение очистки формы (логическое) if ui.AskReset() { continue } } fmt.Println("Работа приложения завершена.") }