using BrassAndSigil.Server.Models; using Spectre.Console; using Spectre.Console.Cli; namespace BrassAndSigil.Server.Commands; /// /// Set or rotate the web panel admin password from the CLI. /// Useful when first-time-setting up before exposing the panel publicly, /// or rotating after a suspected leak without going through the panel UI. /// public sealed class SetPasswordCommand : Command { public override int Execute(CommandContext context, BaseCommandSettings settings) { var config = ServerConfig.Load(settings.ConfigPath); if (Console.IsInputRedirected) { AnsiConsole.MarkupLine("[red]set-password requires an interactive terminal.[/]"); return 1; } AnsiConsole.MarkupLine("[bold]Set admin password[/]"); if (!string.IsNullOrEmpty(config.WebPassword)) AnsiConsole.MarkupLine("[grey]An existing password is already set; this will overwrite it.[/]"); string pw1, pw2; while (true) { pw1 = AnsiConsole.Prompt(new TextPrompt("New password (min 8 chars):").Secret()); if (pw1.Length < 8) { AnsiConsole.MarkupLine("[red]Too short.[/]"); continue; } pw2 = AnsiConsole.Prompt(new TextPrompt("Confirm:").Secret()); if (pw1 != pw2) { AnsiConsole.MarkupLine("[red]Doesn't match.[/]"); continue; } break; } config.WebPassword = pw1; config.Save(settings.ConfigPath); AnsiConsole.MarkupLine($"[green]✓[/] Saved to {settings.ConfigPath}."); AnsiConsole.MarkupLine("[grey]Restart the server for the new password to take effect.[/]"); return 0; } }