feat(CodeGenerator): Die Methoden GenerateTotpSecretKey, GenerateTotpQrCode und GenerateTotpQrCode wurden als Schnittstellenimplementierung hinzugefügt.
This commit is contained in:
parent
1657a99aa6
commit
085f37de16
@ -1,7 +0,0 @@
|
|||||||
namespace EnvelopeGenerator.Application.Configurations
|
|
||||||
{
|
|
||||||
public class CodeGeneratorConfig
|
|
||||||
{
|
|
||||||
public string CharPool { get; init; } = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789012345678901234567890123456789";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
namespace EnvelopeGenerator.Application.Configurations
|
||||||
|
{
|
||||||
|
public class CodeGeneratorParams
|
||||||
|
{
|
||||||
|
public string CharPool { get; init; } = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789012345678901234567890123456789";
|
||||||
|
|
||||||
|
public int DefaultTotpSecretKeyLength { get; init; } = 32;
|
||||||
|
|
||||||
|
public string TotpIssuer { get; init; } = "signFlow";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 0 is user email, 1 is secret key and 2 is issuer.
|
||||||
|
/// </summary>
|
||||||
|
public string TotpUrlFormat { get; init; } = "otpauth://totp/{0}?secret={1}&issuer={2}";
|
||||||
|
|
||||||
|
public int TotpQRPixelsPerModule { get; init; } = 20;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -3,5 +3,11 @@
|
|||||||
public interface ICodeGenerator
|
public interface ICodeGenerator
|
||||||
{
|
{
|
||||||
string GenerateCode(int length);
|
string GenerateCode(int length);
|
||||||
|
|
||||||
|
public string GenerateTotpSecretKey(int? length = null);
|
||||||
|
|
||||||
|
public byte[] GenerateTotpQrCode(string userEmail, string secretKey, string? issuer = null, string? totpUrlFormat = null, int? pixelsPerModule = null);
|
||||||
|
|
||||||
|
public byte[] GenerateTotpQrCode(string userEmail, int? length = null, string? issuer = null, string? totpUrlFormat = null, int? pixelsPerModule = null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -10,6 +10,7 @@ using Microsoft.Extensions.DependencyInjection;
|
|||||||
using Microsoft.Extensions.DependencyInjection.Extensions;
|
using Microsoft.Extensions.DependencyInjection.Extensions;
|
||||||
using DigitalData.Core.Client;
|
using DigitalData.Core.Client;
|
||||||
using EnvelopeGenerator.Application.Configurations.GtxMessaging;
|
using EnvelopeGenerator.Application.Configurations.GtxMessaging;
|
||||||
|
using QRCoder;
|
||||||
|
|
||||||
namespace EnvelopeGenerator.Application.Extensions
|
namespace EnvelopeGenerator.Application.Extensions
|
||||||
{
|
{
|
||||||
@ -55,13 +56,14 @@ namespace EnvelopeGenerator.Application.Extensions
|
|||||||
|
|
||||||
services.Configure<DispatcherConfig>(dispatcherConfigSection);
|
services.Configure<DispatcherConfig>(dispatcherConfigSection);
|
||||||
services.Configure<MailConfig>(mailConfigSection);
|
services.Configure<MailConfig>(mailConfigSection);
|
||||||
services.Configure<CodeGeneratorConfig>(codeGeneratorConfigSection);
|
services.Configure<CodeGeneratorParams>(codeGeneratorConfigSection);
|
||||||
services.Configure<EnvelopeReceiverCacheParams>(envelopeReceiverCacheParamsSection);
|
services.Configure<EnvelopeReceiverCacheParams>(envelopeReceiverCacheParamsSection);
|
||||||
|
|
||||||
services.AddHttpClientService<SmsParams>(smsConfigSection);
|
services.AddHttpClientService<SmsParams>(smsConfigSection);
|
||||||
services.TryAddSingleton<IMessagingService, GtxMessagingService>();
|
services.TryAddSingleton<IMessagingService, GtxMessagingService>();
|
||||||
services.TryAddSingleton<ICodeGenerator, CodeGenerator>();
|
services.TryAddSingleton<ICodeGenerator, CodeGenerator>();
|
||||||
services.TryAddSingleton<IEnvelopeReceiverCache, EnvelopeReceiverCache>();
|
services.TryAddSingleton<IEnvelopeReceiverCache, EnvelopeReceiverCache>();
|
||||||
|
services.TryAddSingleton<QRCodeGenerator>();
|
||||||
|
|
||||||
return services;
|
return services;
|
||||||
}
|
}
|
||||||
@ -70,7 +72,7 @@ namespace EnvelopeGenerator.Application.Extensions
|
|||||||
dispatcherConfigSection: config.GetSection("DispatcherConfig"),
|
dispatcherConfigSection: config.GetSection("DispatcherConfig"),
|
||||||
mailConfigSection: config.GetSection("MailConfig"),
|
mailConfigSection: config.GetSection("MailConfig"),
|
||||||
smsConfigSection: config.GetSection("SmsConfig"),
|
smsConfigSection: config.GetSection("SmsConfig"),
|
||||||
codeGeneratorConfigSection: config.GetSection("CodeGeneratorConfig"),
|
codeGeneratorConfigSection: config.GetSection("CodeGeneratorParams"),
|
||||||
envelopeReceiverCacheParamsSection: config.GetSection("EnvelopeReceiverCacheParams"));
|
envelopeReceiverCacheParamsSection: config.GetSection("EnvelopeReceiverCacheParams"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -7,5 +7,8 @@ namespace EnvelopeGenerator.Application.Extensions
|
|||||||
public static bool Ok(this GtxMessagingResponse gtxMessagingResponse)
|
public static bool Ok(this GtxMessagingResponse gtxMessagingResponse)
|
||||||
=> gtxMessagingResponse.TryGetValue("message-status", out var status)
|
=> gtxMessagingResponse.TryGetValue("message-status", out var status)
|
||||||
&& status?.ToString()?.ToLower() == "ok";
|
&& status?.ToString()?.ToLower() == "ok";
|
||||||
|
|
||||||
|
public static string ToBase64String(this byte[] bytes)
|
||||||
|
=> Convert.ToBase64String(bytes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1,21 +1,26 @@
|
|||||||
using EnvelopeGenerator.Application.Configurations;
|
using EnvelopeGenerator.Application.Configurations;
|
||||||
using EnvelopeGenerator.Application.Contracts;
|
using EnvelopeGenerator.Application.Contracts;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
|
using OtpNet;
|
||||||
|
using QRCoder;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
namespace EnvelopeGenerator.Application.Services
|
namespace EnvelopeGenerator.Application.Services
|
||||||
{
|
{
|
||||||
public class CodeGenerator : ICodeGenerator
|
public class CodeGenerator : ICodeGenerator
|
||||||
{
|
{
|
||||||
public static Lazy<CodeGenerator> LazyStatic => new(() => new CodeGenerator(Options.Create<CodeGeneratorConfig>(new())));
|
public static Lazy<CodeGenerator> LazyStatic => new(() => new CodeGenerator(Options.Create<CodeGeneratorParams>(new()), new QRCodeGenerator()));
|
||||||
|
|
||||||
public static CodeGenerator Static => LazyStatic.Value;
|
public static CodeGenerator Static => LazyStatic.Value;
|
||||||
|
|
||||||
private readonly string _charPool;
|
private readonly CodeGeneratorParams _params;
|
||||||
|
|
||||||
public CodeGenerator(IOptions<CodeGeneratorConfig> options)
|
private readonly QRCodeGenerator _qrCodeGenerator;
|
||||||
|
|
||||||
|
public CodeGenerator(IOptions<CodeGeneratorParams> options, QRCodeGenerator qrCodeGenerator)
|
||||||
{
|
{
|
||||||
_charPool = options.Value.CharPool;
|
_params = options.Value;
|
||||||
|
_qrCodeGenerator = qrCodeGenerator;
|
||||||
}
|
}
|
||||||
|
|
||||||
public string GenerateCode(int length)
|
public string GenerateCode(int length)
|
||||||
@ -29,9 +34,33 @@ namespace EnvelopeGenerator.Application.Services
|
|||||||
var passwordBuilder = new StringBuilder(length);
|
var passwordBuilder = new StringBuilder(length);
|
||||||
|
|
||||||
for (int i = 0; i < length; i++)
|
for (int i = 0; i < length; i++)
|
||||||
passwordBuilder.Append(_charPool[random.Next(_charPool.Length)]);
|
passwordBuilder.Append(_params.CharPool[random.Next(_params.CharPool.Length)]);
|
||||||
|
|
||||||
return passwordBuilder.ToString();
|
return passwordBuilder.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string GenerateTotpSecretKey(int? length = null)
|
||||||
|
=> Base32Encoding.ToString(KeyGeneration.GenerateRandomKey(length ?? _params.DefaultTotpSecretKeyLength));
|
||||||
|
|
||||||
|
public byte[] GenerateTotpQrCode(string userEmail, string secretKey, string? issuer = null, string? totpUrlFormat = null, int? pixelsPerModule = null)
|
||||||
|
{
|
||||||
|
var url = string.Format(totpUrlFormat ?? _params.TotpUrlFormat,
|
||||||
|
Uri.EscapeDataString(userEmail),
|
||||||
|
Uri.EscapeDataString(secretKey),
|
||||||
|
Uri.EscapeDataString(issuer ?? _params.TotpIssuer));
|
||||||
|
using var qrCodeData = _qrCodeGenerator.CreateQrCode(url, QRCodeGenerator.ECCLevel.Q);
|
||||||
|
using var qrCode = new BitmapByteQRCode(qrCodeData);
|
||||||
|
return qrCode.GetGraphic(pixelsPerModule ?? _params.TotpQRPixelsPerModule);
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] GenerateTotpQrCode(string userEmail, int? length = null, string? issuer = null, string? totpUrlFormat = null, int? pixelsPerModule = null)
|
||||||
|
{
|
||||||
|
return GenerateTotpQrCode(
|
||||||
|
userEmail: userEmail,
|
||||||
|
secretKey: GenerateTotpSecretKey(length: length),
|
||||||
|
issuer: issuer,
|
||||||
|
totpUrlFormat: totpUrlFormat,
|
||||||
|
pixelsPerModule: pixelsPerModule);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user