using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using System.Text; using Toolkit.Foundation; namespace Bitvault; public class CreateLockerHandler(ILockerFactory componentFactory, IPublisher publisher) : IHandler>, bool> { public async Task Handle(CreateEventArgs> args, CancellationToken cancellationToken) { if (args.Value is Locker <(string, string)> locker) { if (locker.Value is (string name, string password) && name is { Length: > 0 } && password is { Length: > 0 }) { if (componentFactory.Create(name) is IComponentHost host) { ISecurityKeyFactory keyVaultFactory = host.Services.GetRequiredService(); IDecoratorService secureKeyStore = host.Services.GetRequiredService>(); ILockerStorageFactory lockerStorageFactory = host.Services.GetRequiredService(); if (keyVaultFactory.Create(Encoding.UTF8.GetBytes(password)) is SecurityKey key) { secureKeyStore.Set(key); if (await lockerStorageFactory.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; } }