using NetAdmin.Application.Services;
using NetAdmin.Domain.Dto.Sys.Captcha;
using NetAdmin.SysComponent.Application.Services.Sys.Dependency;
using SixLabors.ImageSharp;
using Yitter.IdGenerator;
namespace NetAdmin.SysComponent.Application.Services.Sys;
///
public sealed class CaptchaService : ServiceBase, ICaptchaService
{
private static readonly Assembly _entryAsm = Assembly.GetEntryAssembly();
private static readonly string _entryAsmName = _entryAsm.FullName![.._entryAsm.FullName.IndexOf(',')];
///
/// Initializes a new instance of the class.
///
public CaptchaService() { }
///
public async Task GetCaptchaImageAsync()
{
var (backgroundImage, sliderImage, offsetSaw) = await CaptchaImageHelper.CreateSawSliderImageAsync(
_entryAsm, $"{_entryAsmName}.Assets.Captcha.background"
, $"{_entryAsmName}.Assets.Captcha.template", (1, 101), (1, 7)
, new Size(50, 50))
.ConfigureAwait(false);
var id = $"{nameof(GetCaptchaImageAsync)}_{YitIdHelper.NextId()}";
return new GetCaptchaRsp { Id = id, BackgroundImage = backgroundImage, SliderImage = sliderImage, SawOffsetX = offsetSaw.X };
}
///
public Task VerifyCaptchaAsync(VerifyCaptchaReq req)
{
req.ThrowIfInvalid();
if (req.SawOffsetX == null) {
return Task.FromResult(false);
}
bool ret;
try {
var aesKey = req.Id.Aes(CaptchaOptions.SecretKey)[..32];
ret = Math.Abs(req.SawOffsetX.Value - req.VerifyData.AesDe(aesKey).Float()) < 5f;
}
catch {
ret = false;
}
return Task.FromResult(ret);
}
}