[backend/api] Limit follow list imports to twice every 30 mins

This commit is contained in:
pancakes 2024-10-28 22:56:15 +10:00 committed by Laura Hausmann
parent 95ae04e4af
commit 71a12261a4
No known key found for this signature in database
GPG key ID: D044E84C5BE01605
2 changed files with 11 additions and 0 deletions

View file

@ -86,6 +86,7 @@ public class SettingsController(DatabaseContext db, ImportExportService importEx
} }
[HttpPost("import/following")] [HttpPost("import/following")]
[EnableRateLimiting("imports")]
[ProducesResults(HttpStatusCode.Accepted)] [ProducesResults(HttpStatusCode.Accepted)]
public async Task<AcceptedResult> ImportFollowing(IFormFile file) public async Task<AcceptedResult> ImportFollowing(IFormFile file)
{ {

View file

@ -292,10 +292,20 @@ public static class ServiceExtensions
QueueLimit = 0 QueueLimit = 0
}; };
var imports = new SlidingWindowRateLimiterOptions
{
PermitLimit = 2,
SegmentsPerWindow = 30,
Window = TimeSpan.FromMinutes(30),
QueueProcessingOrder = QueueProcessingOrder.OldestFirst,
QueueLimit = 0
};
// @formatter:off // @formatter:off
options.AddPolicy("sliding", ctx => RateLimitPartition.GetSlidingWindowLimiter(ctx.GetRateLimitPartition(false),_ => sliding)); options.AddPolicy("sliding", ctx => RateLimitPartition.GetSlidingWindowLimiter(ctx.GetRateLimitPartition(false),_ => sliding));
options.AddPolicy("auth", ctx => RateLimitPartition.GetSlidingWindowLimiter(ctx.GetRateLimitPartition(false), _ => auth)); options.AddPolicy("auth", ctx => RateLimitPartition.GetSlidingWindowLimiter(ctx.GetRateLimitPartition(false), _ => auth));
options.AddPolicy("strict", ctx => RateLimitPartition.GetSlidingWindowLimiter(ctx.GetRateLimitPartition(true), _ => strict)); options.AddPolicy("strict", ctx => RateLimitPartition.GetSlidingWindowLimiter(ctx.GetRateLimitPartition(true), _ => strict));
options.AddPolicy("imports", ctx => RateLimitPartition.GetSlidingWindowLimiter(ctx.GetRateLimitPartition(true), _ => imports));
// @formatter:on // @formatter:on
options.OnRejected = async (context, token) => options.OnRejected = async (context, token) =>