Merge pull request #1907 from not-layla/main
Implement rate limits on comments
This commit is contained in:
commit
a56853be05
11 changed files with 42 additions and 1 deletions
|
@ -32,6 +32,10 @@
|
|||
image: 6
|
||||
# Interval length for image uploads, in seconds
|
||||
image_per_second: 3600
|
||||
# Maximum number of comments created in interval
|
||||
comment: 6
|
||||
# Interval length for comment limit, in seconds
|
||||
comment_per_second: 600
|
||||
}
|
||||
# Settings related to activitypub federation
|
||||
federation: {
|
||||
|
|
|
@ -49,6 +49,10 @@ impl RateLimit {
|
|||
self.kind(RateLimitType::Image)
|
||||
}
|
||||
|
||||
pub fn comment(&self) -> RateLimited {
|
||||
self.kind(RateLimitType::Comment)
|
||||
}
|
||||
|
||||
fn kind(&self, type_: RateLimitType) -> RateLimited {
|
||||
RateLimited {
|
||||
rate_limiter: self.rate_limiter.clone(),
|
||||
|
@ -115,6 +119,15 @@ impl RateLimited {
|
|||
false,
|
||||
)?;
|
||||
}
|
||||
RateLimitType::Comment => {
|
||||
limiter.check_rate_limit_full(
|
||||
self.type_,
|
||||
&ip_addr,
|
||||
rate_limit.comment,
|
||||
rate_limit.comment_per_second,
|
||||
false,
|
||||
)?;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -15,6 +15,7 @@ pub(crate) enum RateLimitType {
|
|||
Register,
|
||||
Post,
|
||||
Image,
|
||||
Comment,
|
||||
}
|
||||
|
||||
/// Rate limiting based on rate type and IP addr
|
||||
|
|
|
@ -149,6 +149,12 @@ pub struct RateLimitConfig {
|
|||
/// Interval length for image uploads, in seconds
|
||||
#[default(3600)]
|
||||
pub image_per_second: i32,
|
||||
/// Maximum number of comments created in interval
|
||||
#[default(6)]
|
||||
pub comment: i32,
|
||||
/// Interval length for comment limit, in seconds
|
||||
#[default(600)]
|
||||
pub comment_per_second: i32,
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize, Serialize, Clone, SmartDefault, Document)]
|
||||
|
|
|
@ -485,6 +485,7 @@ impl ChatServer {
|
|||
UserOperationCrud::Register => rate_limiter.register().wrap(ip, fut).await,
|
||||
UserOperationCrud::CreatePost => rate_limiter.post().wrap(ip, fut).await,
|
||||
UserOperationCrud::CreateCommunity => rate_limiter.register().wrap(ip, fut).await,
|
||||
UserOperationCrud::CreateComment => rate_limiter.comment().wrap(ip, fut).await,
|
||||
_ => rate_limiter.message().wrap(ip, fut).await,
|
||||
}
|
||||
} else {
|
||||
|
|
|
@ -33,5 +33,7 @@
|
|||
register_per_second: 3600
|
||||
image: 6
|
||||
image_per_second: 3600
|
||||
comment: 99999
|
||||
comment_per_second: 600
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,5 +32,7 @@
|
|||
register_per_second: 3600
|
||||
image: 6
|
||||
image_per_second: 3600
|
||||
comment: 99999
|
||||
comment_per_second: 600
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,5 +32,7 @@
|
|||
register_per_second: 3600
|
||||
image: 6
|
||||
image_per_second: 3600
|
||||
comment: 99999
|
||||
comment_per_second: 600
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,5 +32,7 @@
|
|||
register_per_second: 3600
|
||||
image: 6
|
||||
image_per_second: 3600
|
||||
comment: 99999
|
||||
comment_per_second: 600
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,5 +32,7 @@
|
|||
register_per_second: 3600
|
||||
image: 6
|
||||
image_per_second: 3600
|
||||
comment: 99999
|
||||
comment_per_second: 600
|
||||
}
|
||||
}
|
||||
|
|
|
@ -101,10 +101,16 @@ pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimit) {
|
|||
),
|
||||
)
|
||||
// Comment
|
||||
.service(
|
||||
// Handle POST to /comment separately to add the comment() rate limitter
|
||||
web::resource("/comment")
|
||||
.guard(guard::Post())
|
||||
.wrap(rate_limit.comment())
|
||||
.route(web::post().to(route_post_crud::<CreateComment>)),
|
||||
)
|
||||
.service(
|
||||
web::scope("/comment")
|
||||
.wrap(rate_limit.message())
|
||||
.route("", web::post().to(route_post_crud::<CreateComment>))
|
||||
.route("", web::put().to(route_post_crud::<EditComment>))
|
||||
.route("/delete", web::post().to(route_post_crud::<DeleteComment>))
|
||||
.route("/remove", web::post().to(route_post_crud::<RemoveComment>))
|
||||
|
|
Loading…
Reference in a new issue