Files
stevanfreeborn.secureconfig/src/StevanFreeborn.Extensions.Configuration.Secure/Configuration/SecureConfigBuilder.cs
T

103 lines
3.0 KiB
C#

using System.Text.Json;
using System.Text.Json.Serialization.Metadata;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using StevanFreeborn.Extensions.Configuration.Secure.Cryptography;
using StevanFreeborn.Extensions.Configuration.Secure.Storage;
namespace StevanFreeborn.Extensions.Configuration.Secure.Configuration;
internal sealed class SecureConfigBuilder : ISecureConfigBuilder
{
internal ISecureStorageProvider? StorageProvider { get; private set; }
internal Func<IEncryptionKeyProvider, ICryptoProvider>? CryptoProviderFactory { get; private set; }
internal IEncryptionKeyProvider? KeyProvider { get; private set; }
internal ILoggerFactory LoggerFactory { get; private set; } = NullLoggerFactory.Instance;
internal JsonSerializerOptions SerializerOptions { get; } = new()
{
PropertyNameCaseInsensitive = true,
};
public ISecureConfigBuilder UseJsonFileStorage(JsonStorageOptions options)
{
StorageProvider = new JsonFileStorageProvider(options);
return this;
}
public ISecureConfigBuilder UseJsonFileStorage(Action<JsonStorageOptions> configure)
{
#if NET6_0_OR_GREATER
ArgumentNullException.ThrowIfNull(configure);
#else
if (configure is null)
{
throw new ArgumentNullException(nameof(configure));
}
#endif
var options = new JsonStorageOptions();
configure.Invoke(options);
StorageProvider = new JsonFileStorageProvider(options);
return this;
}
public ISecureConfigBuilder AddJsonAotContext(IJsonTypeInfoResolver context)
{
#if NET6_0_OR_GREATER
ArgumentNullException.ThrowIfNull(context);
#else
if (context is null)
{
throw new ArgumentNullException(nameof(context));
}
#endif
SerializerOptions.TypeInfoResolverChain.Insert(0, context);
return this;
}
public ISecureConfigBuilder UseCustomStorage(ISecureStorageProvider provider)
{
StorageProvider = provider ?? throw new ArgumentNullException(nameof(provider));
return this;
}
public ISecureConfigBuilder WithBase64EncryptionKey(string key)
{
KeyProvider = new StaticKeyProvider(key);
return this;
}
public ISecureConfigBuilder WithMachineIdKey()
{
var logger = LoggerFactory.CreateLogger<MachineIdKeyGenerator>();
KeyProvider = new MachineIdKeyProvider(new MachineIdKeyGenerator(logger));
return this;
}
public ISecureConfigBuilder WithCustomKeyProvider(IEncryptionKeyProvider provider)
{
KeyProvider = provider ?? throw new ArgumentNullException(nameof(provider));
return this;
}
public ISecureConfigBuilder WithLoggerFactory(ILoggerFactory loggerFactory)
{
LoggerFactory = loggerFactory ?? NullLoggerFactory.Instance;
return this;
}
public ISecureConfigBuilder WithAesCryptoProvider()
{
CryptoProviderFactory = (kp) => new AesCryptoProvider(kp);
return this;
}
public ISecureConfigBuilder WithCustomCryptoProvider(Func<IEncryptionKeyProvider, ICryptoProvider> cryptoProviderFactory)
{
CryptoProviderFactory = cryptoProviderFactory;
return this;
}
}