diff --git a/Iceshrimp.Backend/Controllers/Web/SettingsController.cs b/Iceshrimp.Backend/Controllers/Web/SettingsController.cs index c6ef4b64..9052800f 100644 --- a/Iceshrimp.Backend/Controllers/Web/SettingsController.cs +++ b/Iceshrimp.Backend/Controllers/Web/SettingsController.cs @@ -86,6 +86,7 @@ public class SettingsController(DatabaseContext db, ImportExportService importEx } [HttpPost("import/following")] + [EnableRateLimiting("imports")] [ProducesResults(HttpStatusCode.Accepted)] public async Task ImportFollowing(IFormFile file) { diff --git a/Iceshrimp.Backend/Core/Extensions/ServiceExtensions.cs b/Iceshrimp.Backend/Core/Extensions/ServiceExtensions.cs index 6ff2aa46..53c12680 100644 --- a/Iceshrimp.Backend/Core/Extensions/ServiceExtensions.cs +++ b/Iceshrimp.Backend/Core/Extensions/ServiceExtensions.cs @@ -292,10 +292,20 @@ public static class ServiceExtensions QueueLimit = 0 }; + var imports = new SlidingWindowRateLimiterOptions + { + PermitLimit = 2, + SegmentsPerWindow = 30, + Window = TimeSpan.FromMinutes(30), + QueueProcessingOrder = QueueProcessingOrder.OldestFirst, + QueueLimit = 0 + }; + // @formatter:off options.AddPolicy("sliding", ctx => RateLimitPartition.GetSlidingWindowLimiter(ctx.GetRateLimitPartition(false),_ => sliding)); options.AddPolicy("auth", ctx => RateLimitPartition.GetSlidingWindowLimiter(ctx.GetRateLimitPartition(false), _ => auth)); options.AddPolicy("strict", ctx => RateLimitPartition.GetSlidingWindowLimiter(ctx.GetRateLimitPartition(true), _ => strict)); + options.AddPolicy("imports", ctx => RateLimitPartition.GetSlidingWindowLimiter(ctx.GetRateLimitPartition(true), _ => imports)); // @formatter:on options.OnRejected = async (context, token) =>