using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using System.Text; using Toolkit.Foundation; namespace Bitvault; public class CreateContainerHandler(IContainerComponentFactory componentFactory) : IHandler, bool> { public async Task Handle(Create args, CancellationToken cancellationToken) { if (args.Value is Vault vault && vault.Name is { Length: > 0 } name && vault.Password is { Length: > 0 } password) { if (componentFactory.Create(name) is IComponentHost host) { ISecurityKeyFactory keyVaultFactory = host.Services.GetRequiredService(); IContainer vaultKeyContainer = host.Services.GetRequiredService>(); IContainer vaultStorage = host.Services.GetRequiredService(); if (keyVaultFactory.Create(Encoding.UTF8.GetBytes(password)) is SecurityKey key) { vaultKeyContainer.Set(key); if (await vaultStorage.Create(name, key)) { IWritableConfiguration configuration = host.Services.GetRequiredService>(); configuration.Write(args => args.Key = $"{Convert.ToBase64String(key.Salt)}:{Convert.ToBase64String(key.EncryptedKey)}:{Convert.ToBase64String(key.DecryptedKey)}"); host.Start(); return true; } } } } return false; } }