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