fix: normalize malformed pairing requests
This commit is contained in:
parent
4e4c90e675
commit
061c3baab3
@ -1,3 +1,4 @@
|
|||||||
|
using System.Text.Json;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using TermRemoteCtl.Agent.Security;
|
using TermRemoteCtl.Agent.Security;
|
||||||
|
|
||||||
@ -26,12 +27,13 @@ public static class PairingEndpoints
|
|||||||
});
|
});
|
||||||
|
|
||||||
group.MapPost("/redeem", async (
|
group.MapPost("/redeem", async (
|
||||||
[FromBody] RedeemPairingRequest? request,
|
HttpRequest httpRequest,
|
||||||
PairingService pairingService,
|
PairingService pairingService,
|
||||||
AuditLog auditLog,
|
AuditLog auditLog,
|
||||||
IClock clock,
|
IClock clock,
|
||||||
CancellationToken cancellationToken) =>
|
CancellationToken cancellationToken) =>
|
||||||
{
|
{
|
||||||
|
var request = await ReadRedeemRequestAsync(httpRequest, cancellationToken);
|
||||||
var validationError = ValidateRedeemRequest(request);
|
var validationError = ValidateRedeemRequest(request);
|
||||||
if (validationError is not null)
|
if (validationError is not null)
|
||||||
{
|
{
|
||||||
@ -56,6 +58,24 @@ public static class PairingEndpoints
|
|||||||
return endpoints;
|
return endpoints;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static async Task<RedeemPairingRequest?> ReadRedeemRequestAsync(
|
||||||
|
HttpRequest httpRequest,
|
||||||
|
CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return await httpRequest.ReadFromJsonAsync<RedeemPairingRequest>(cancellationToken);
|
||||||
|
}
|
||||||
|
catch (JsonException)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
catch (BadHttpRequestException)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static RedeemPairingResponse? ValidateRedeemRequest(RedeemPairingRequest? request)
|
private static RedeemPairingResponse? ValidateRedeemRequest(RedeemPairingRequest? request)
|
||||||
{
|
{
|
||||||
if (request is null)
|
if (request is null)
|
||||||
|
|||||||
@ -43,8 +43,13 @@ public sealed class PairingEndpointsTests
|
|||||||
using var content = new StringContent("{\"code\":", Encoding.UTF8, "application/json");
|
using var content = new StringContent("{\"code\":", Encoding.UTF8, "application/json");
|
||||||
|
|
||||||
using var response = await client.PostAsync("/api/pairing/redeem", content);
|
using var response = await client.PostAsync("/api/pairing/redeem", content);
|
||||||
|
var payload = await response.Content.ReadFromJsonAsync<RedeemResponse>();
|
||||||
|
|
||||||
Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);
|
Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);
|
||||||
|
Assert.NotNull(payload);
|
||||||
|
Assert.False(payload.Success);
|
||||||
|
Assert.Equal("invalid_request", payload.ErrorCode);
|
||||||
|
Assert.Equal("rejected", payload.Status);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user