Files
mixtape/zero/Security/CaptchaController.cs
T

84 lines
2.1 KiB
C#

using System.IO;
using System.Reflection;
using Microsoft.AspNetCore.Mvc;
using PowCapServer.Abstractions;
using PowCapServer.Models;
using zero.Mvc;
namespace zero.Security;
[ApiController]
[Route("/api/captcha")]
public class CaptchaController(ICaptchaService captchaService) : ZeroController
{
[HttpPost("challenge")]
public async Task<IActionResult> PostChallenge()
{
ChallengeTokenInfo challengeTokenInfo = await captchaService.CreateChallengeAsync(HttpContext.RequestAborted);
return Json(challengeTokenInfo);
}
[HttpPost("{useCase}/challenge")]
public async Task<IActionResult> PostChallengeWithUseCase(string useCase)
{
ChallengeTokenInfo challengeTokenInfo = await captchaService.CreateChallengeAsync(useCase, HttpContext.RequestAborted);
return Json(challengeTokenInfo);
}
[HttpPost("redeem")]
public async Task<IActionResult> PostRedeem(ChallengeSolution model)
{
if (model == null)
{
return BadRequest();
}
RedeemChallengeResult result = await captchaService.RedeemChallengeAsync(model).ConfigureAwait(false);
return Json(result);
}
[HttpPost("{useCase}/redeem")]
public async Task<IActionResult> PostRedeemWithUseCase(string useCase, ChallengeSolution model)
{
if (model == null)
{
return BadRequest();
}
RedeemChallengeResult result = await captchaService.RedeemChallengeAsync(useCase, model).ConfigureAwait(false);
return Json(result);
}
[HttpGet("cap.wasm")]
public IActionResult GetWasmFile()
{
Assembly assembly = typeof(ZeroSecurityModule).GetTypeInfo().Assembly;
Stream resource = assembly.GetManifestResourceStream("zero.Resources.cap_wasm_bg_0_0_6.wasm");
if (resource is null)
{
return NotFound();
}
return File(resource, "application/wasm");
}
[HttpGet("cap.widget.js")]
public IActionResult GetWidgetJsFile()
{
Assembly assembly = typeof(ZeroSecurityModule).GetTypeInfo().Assembly;
Stream resource = assembly.GetManifestResourceStream("zero.Resources.cap_min_0_1_41.js");
if (resource is null)
{
return NotFound();
}
return File(resource, "text/javascript");
}
}