Fix base64 image parsing and remove DBContext from rate limiter

This commit is contained in:
Slendy 2023-01-22 04:29:53 -06:00
commit 4107ecc654
No known key found for this signature in database
GPG key ID: 7288D68361B91428
2 changed files with 14 additions and 6 deletions

View file

@ -274,6 +274,13 @@ public static class FileHelper
private static readonly Regex base64Regex = new(@"data:([^\/]+)\/([^;]+);base64,(.*)", RegexOptions.Compiled); private static readonly Regex base64Regex = new(@"data:([^\/]+)\/([^;]+);base64,(.*)", RegexOptions.Compiled);
private static byte[]? TryParseBase64Data(string b64)
{
Span<byte> buffer = new(new byte[b64.Length]);
bool valid = Convert.TryFromBase64String(b64, buffer, out _);
return valid ? buffer.ToArray() : null;
}
public static async Task<string?> ParseBase64Image(string? image) public static async Task<string?> ParseBase64Image(string? image)
{ {
if (string.IsNullOrWhiteSpace(image)) return null; if (string.IsNullOrWhiteSpace(image)) return null;
@ -284,7 +291,8 @@ public static class FileHelper
if (match.Groups.Count != 4) return null; if (match.Groups.Count != 4) return null;
byte[] data = Convert.FromBase64String(match.Groups[3].Value); byte[]? data = TryParseBase64Data(match.Groups[3].Value);
if (data == null) return null;
LbpFile file = new(data); LbpFile file = new(data);

View file

@ -13,16 +13,16 @@ using Microsoft.AspNetCore.Http;
namespace LBPUnion.ProjectLighthouse.Middlewares; namespace LBPUnion.ProjectLighthouse.Middlewares;
public class RateLimitMiddleware : MiddlewareDBContext public class RateLimitMiddleware : Middleware
{ {
// (userId, requestData) // (ipAddress, requestData)
private static readonly ConcurrentDictionary<IPAddress, List<LighthouseRequest?>> recentRequests = new(); private static readonly ConcurrentDictionary<IPAddress, List<LighthouseRequest?>> recentRequests = new();
public RateLimitMiddleware(RequestDelegate next) : base(next) public RateLimitMiddleware(RequestDelegate next) : base(next)
{ } { }
public override async Task InvokeAsync(HttpContext ctx, Database database) public override async Task InvokeAsync(HttpContext ctx)
{ {
// We only want to rate limit POST requests // We only want to rate limit POST requests
if (ctx.Request.Method != "POST") if (ctx.Request.Method != "POST")
@ -51,9 +51,9 @@ public class RateLimitMiddleware : MiddlewareDBContext
if (GetNumRequestsForPath(address, path) >= GetMaxNumRequests(options)) if (GetNumRequestsForPath(address, path) >= GetMaxNumRequests(options))
{ {
Logger.Info($"Request limit reached for {address.ToString()} ({ctx.Request.Path})", LogArea.RateLimit); Logger.Info($"Request limit reached for {address} ({ctx.Request.Path})", LogArea.RateLimit);
long nextExpiration = recentRequests[address][0]?.Expiration ?? TimeHelper.TimestampMillis; long nextExpiration = recentRequests[address][0]?.Expiration ?? TimeHelper.TimestampMillis;
ctx.Response.Headers.Add("Retry-After", "" + Math.Ceiling((nextExpiration - TimeHelper.TimestampMillis) / 1000f)); ctx.Response.Headers.TryAdd("Retry-After", "" + Math.Ceiling((nextExpiration - TimeHelper.TimestampMillis) / 1000f));
ctx.Response.StatusCode = 429; ctx.Response.StatusCode = 429;
return; return;
} }