2024-10-02 07:11:35 +00:00
|
|
|
using System.Dynamic;
|
|
|
|
|
using Elsa.JavaScript.Notifications;
|
|
|
|
|
using Elsa.Mediator.Contracts;
|
|
|
|
|
using Elsa.Secrets.Management;
|
2024-10-30 08:19:14 +00:00
|
|
|
using Humanizer;
|
2024-10-02 07:11:35 +00:00
|
|
|
using JetBrains.Annotations;
|
|
|
|
|
|
|
|
|
|
namespace Elsa.Secrets.Scripting.JavaScript;
|
|
|
|
|
|
|
|
|
|
/// A handler that configures the Jint engine with secrets.
|
|
|
|
|
[UsedImplicitly]
|
2024-10-30 08:19:14 +00:00
|
|
|
public class ConfigureEngineWithSecrets(ISecretManager secretManager, IDecryptor decryptor) : INotificationHandler<EvaluatingJavaScript>
|
2024-10-02 07:11:35 +00:00
|
|
|
{
|
|
|
|
|
/// <inheritdoc />
|
|
|
|
|
public async Task HandleAsync(EvaluatingJavaScript notification, CancellationToken cancellationToken)
|
|
|
|
|
{
|
2024-10-30 08:19:14 +00:00
|
|
|
await GenerateSecretAccessorFunctions(notification, cancellationToken);
|
2024-10-02 07:11:35 +00:00
|
|
|
}
|
|
|
|
|
|
2024-10-30 08:19:14 +00:00
|
|
|
private async Task GenerateSecretAccessorFunctions(EvaluatingJavaScript notification, CancellationToken cancellationToken)
|
2024-10-02 07:11:35 +00:00
|
|
|
{
|
|
|
|
|
var engine = notification.Engine;
|
2024-10-30 08:19:14 +00:00
|
|
|
var secrets = (await secretManager.ListAsync(cancellationToken)).ToList();
|
2024-10-02 07:11:35 +00:00
|
|
|
|
|
|
|
|
IDictionary<string, object?> secretsContainer = new ExpandoObject();
|
|
|
|
|
|
|
|
|
|
foreach (var secret in secrets)
|
|
|
|
|
{
|
2024-10-30 08:19:14 +00:00
|
|
|
secretsContainer[$"get{secret.Name.Pascalize()}Async"] = () => ResolveSecretAsync(secret, cancellationToken);
|
2024-10-02 07:11:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
engine.SetValue("secrets", secretsContainer);
|
|
|
|
|
}
|
|
|
|
|
|
2024-10-30 08:19:14 +00:00
|
|
|
private async Task<string> ResolveSecretAsync(Secret secret, CancellationToken cancellationToken)
|
2024-10-02 07:11:35 +00:00
|
|
|
{
|
2024-10-30 08:19:14 +00:00
|
|
|
if (secret.Status != SecretStatus.Active)
|
|
|
|
|
throw new InvalidOperationException($"Secret '{secret.Name}' is not active.");
|
|
|
|
|
return await decryptor.DecryptAsync(secret.EncryptedValue, cancellationToken);
|
2024-10-02 07:11:35 +00:00
|
|
|
}
|
|
|
|
|
}
|