From b2086d8185633b99007467b0dc70dc0e955c11b7 Mon Sep 17 00:00:00 2001 From: Stevan Freeborn <65925598+StevanFreeborn@users.noreply.github.com> Date: Fri, 6 Feb 2026 06:48:01 -0600 Subject: [PATCH] feat(admincli): add generate key command --- src/FiscalOS.AdminCLI/App.cs | 12 ++++++++++-- src/FiscalOS.AdminCLI/Commands.cs | 7 ++++++- src/FiscalOS.AdminCLI/Usings.cs | 1 + src/FiscalOS.AdminCLI/appsettings.Example.json | 4 ++++ 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/FiscalOS.AdminCLI/App.cs b/src/FiscalOS.AdminCLI/App.cs index 9a53aaf..448ab31 100644 --- a/src/FiscalOS.AdminCLI/App.cs +++ b/src/FiscalOS.AdminCLI/App.cs @@ -3,7 +3,9 @@ namespace FiscalOS.AdminCLI; internal sealed class App( IAnsiConsole console, IPasswordHasher passwordHasher, - IServiceScopeFactory serviceScopeFactory + IServiceScopeFactory serviceScopeFactory, + IEncryptor encryptor, + IKeyRing keyRing ) : IHostedService { private readonly IAnsiConsole _console = console; @@ -32,13 +34,19 @@ internal sealed class App( ); var hashedPassword = passwordHasher.Hash(password); - var user = User.From(username, hashedPassword); + var userEncryptionKey = await encryptor.GenerateEncryptedKeyAsync(cancellationToken); + var user = User.From(username, hashedPassword, userEncryptionKey); await appDbContext.Users.AddAsync(user, cancellationToken); await appDbContext.SaveChangesAsync(cancellationToken); _console.MarkupLine($"User [green]{username}[/] created successfully."); break; + case Commands.GenerateKey: + var key = encryptor.GenerateKey(); + var keyRingEntry = await keyRing.SaveKeyAsync(key); + _console.MarkupLine($"Key generated with id [green]{keyRingEntry.KeyId}[/] generated successfully."); + break; case Commands.Exit: default: break; diff --git a/src/FiscalOS.AdminCLI/Commands.cs b/src/FiscalOS.AdminCLI/Commands.cs index 031eb96..c06b1fe 100644 --- a/src/FiscalOS.AdminCLI/Commands.cs +++ b/src/FiscalOS.AdminCLI/Commands.cs @@ -3,7 +3,12 @@ namespace FiscalOS.AdminCLI; internal static class Commands { public const string CreateUser = "Create User"; + public const string GenerateKey = "Generate Key"; public const string Exit = "Exit"; - public static readonly string[] All = [CreateUser, Exit]; + public static readonly string[] All = [ + CreateUser, + GenerateKey, + Exit + ]; } \ No newline at end of file diff --git a/src/FiscalOS.AdminCLI/Usings.cs b/src/FiscalOS.AdminCLI/Usings.cs index 44bce40..919b9e0 100644 --- a/src/FiscalOS.AdminCLI/Usings.cs +++ b/src/FiscalOS.AdminCLI/Usings.cs @@ -1,6 +1,7 @@ global using FiscalOS.AdminCLI; global using FiscalOS.Core.Authentication; global using FiscalOS.Core.Identity; +global using FiscalOS.Core.Security; global using FiscalOS.Infra.Data; global using FiscalOS.Infra.DependencyInjection; diff --git a/src/FiscalOS.AdminCLI/appsettings.Example.json b/src/FiscalOS.AdminCLI/appsettings.Example.json index a2cd868..8838d41 100644 --- a/src/FiscalOS.AdminCLI/appsettings.Example.json +++ b/src/FiscalOS.AdminCLI/appsettings.Example.json @@ -1,5 +1,9 @@ { "AppDbContextOptions": { "DatabaseFilePath": "DatabaseFilePath" + }, + "FileKeyRingOptions": { + "KeysDirectoryPath": "KeysDirectoryPath", + "PrimaryKeyId": "PrimaryKeyId" } }