using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using System.Text; using Toolkit.Foundation; namespace Bitvault; public class CreateContainerHandler(IContainerFactory componentFactory, IPublisher publisher) : IHandler, bool> { public async Task Handle(CreateEventArgs args, CancellationToken cancellationToken) { if (args.Value is Container container && container.Name is { Length: > 0 } name && container.Password is { Length: > 0 } password) { if (componentFactory.Create(name) is IComponentHost host) { ISecurityKeyFactory keyVaultFactory = host.Services.GetRequiredService(); IValueStore secureKeyStore = host.Services.GetRequiredService>(); IContainerStorageFactory containerFactory = host.Services.GetRequiredService(); if (keyVaultFactory.Create(Encoding.UTF8.GetBytes(password)) is SecurityKey key) { secureKeyStore.Set(key); if (await containerFactory.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(); publisher.Publish(Activated.As(host), cancellationToken); return true; } } } } return false; } }