diff options
author | asonix <asonix@asonix.dog> | 2020-04-19 22:59:07 -0500 |
---|---|---|
committer | asonix <asonix@asonix.dog> | 2020-04-19 22:59:07 -0500 |
commit | ac43b86b6063ef1ac876122c390de83d6b34a8e6 (patch) | |
tree | ab329231a106d0f7141973f3cf02bd0faf807e32 | |
parent | f300c67a4d9674eef05d180a787cc8352092903d (diff) |
Change RateLimit to act as a middleware
-rw-r--r-- | server/Cargo.lock | 2 | ||||
-rw-r--r-- | server/Cargo.toml | 2 | ||||
-rw-r--r-- | server/src/api/comment.rs | 60 | ||||
-rw-r--r-- | server/src/api/community.rs | 115 | ||||
-rw-r--r-- | server/src/api/mod.rs | 10 | ||||
-rw-r--r-- | server/src/api/post.rs | 79 | ||||
-rw-r--r-- | server/src/api/site.rs | 115 | ||||
-rw-r--r-- | server/src/api/user.rs | 204 | ||||
-rw-r--r-- | server/src/main.rs | 14 | ||||
-rw-r--r-- | server/src/rate_limit/mod.rs | 173 | ||||
-rw-r--r-- | server/src/rate_limit/rate_limiter.rs | 2 | ||||
-rw-r--r-- | server/src/routes/api.rs | 195 | ||||
-rw-r--r-- | server/src/routes/mod.rs | 2 | ||||
-rw-r--r-- | server/src/routes/websocket.rs | 7 | ||||
-rw-r--r-- | server/src/websocket/mod.rs | 2 | ||||
-rw-r--r-- | server/src/websocket/server.rs | 867 |
16 files changed, 965 insertions, 884 deletions
diff --git a/server/Cargo.lock b/server/Cargo.lock index a33211dd..a83f6593 100644 --- a/server/Cargo.lock +++ b/server/Cargo.lock @@ -1410,6 +1410,7 @@ dependencies = [ "dotenv 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "hjson 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "htmlescape 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "isahc 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1427,6 +1428,7 @@ dependencies = [ "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "strum 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", "strum_macros 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] diff --git a/server/Cargo.toml b/server/Cargo.toml index 5a4fdcec..e15e90bf 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -37,3 +37,5 @@ hjson = "0.8.2" percent-encoding = "2.1.0" isahc = "0.9" comrak = "0.7" +tokio = "0.2.18" +futures = "0.3.4" diff --git a/server/src/api/comment.rs b/server/src/api/comment.rs index 8e398c9a..058c7267 100644 --- a/server/src/api/comment.rs +++ b/server/src/api/comment.rs @@ -59,12 +59,13 @@ pub struct GetCommentsResponse { comments: Vec<CommentView>, } -impl Perform<CommentResponse> for Oper<CreateComment> { +impl Perform for Oper<CreateComment> { + type Response = CommentResponse; + fn perform( &self, pool: Pool<ConnectionManager<PgConnection>>, websocket_info: Option<WebsocketInfo>, - rate_limit_info: Option<RateLimitInfo>, ) -> Result<CommentResponse, Error> { let data: &CreateComment = &self.data; @@ -77,13 +78,6 @@ impl Perform<CommentResponse> for Oper<CreateComment> { let hostname = &format!("https://{}", Settings::get().hostname); - if let Some(rl) = rate_limit_info { - rl.rate_limiter - .lock() - .unwrap() - .check_rate_limit_message(&rl.ip, false)?; - } - let conn = pool.get()?; // Check for a community ban @@ -253,12 +247,13 @@ impl Perform<CommentResponse> for Oper<CreateComment> { } } -impl Perform<CommentResponse> for Oper<EditComment> { +impl Perform for Oper<EditComment> { + type Response = CommentResponse; + fn perform( &self, pool: Pool<ConnectionManager<PgConnection>>, websocket_info: Option<WebsocketInfo>, - rate_limit_info: Option<RateLimitInfo>, ) -> Result<CommentResponse, Error> { let data: &EditComment = &self.data; @@ -269,13 +264,6 @@ impl Perform<CommentResponse> for Oper<EditComment> { let user_id = claims.id; - if let Some(rl) = rate_limit_info { - rl.rate_limiter - .lock() - .unwrap() - .check_rate_limit_message(&rl.ip, false)?; - } - let conn = pool.get()?; let orig_comment = CommentView::read(&conn, data.edit_id, None)?; @@ -411,12 +399,13 @@ impl Perform<CommentResponse> for Oper<EditComment> { } } -impl Perform<CommentResponse> for Oper<SaveComment> { +impl Perform for Oper<SaveComment> { + type Response = CommentResponse; + fn perform( &self, pool: Pool<ConnectionManager<PgConnection>>, _websocket_info: Option<WebsocketInfo>, - rate_limit_info: Option<RateLimitInfo>, ) -> Result<CommentResponse, Error> { let data: &SaveComment = &self.data; @@ -432,13 +421,6 @@ impl Perform<CommentResponse> for Oper<SaveComment> { user_id, }; - if let Some(rl) = rate_limit_info { - rl.rate_limiter - .lock() - .unwrap() - .check_rate_limit_message(&rl.ip, false)?; - } - let conn = pool.get()?; if data.save { @@ -462,12 +444,13 @@ impl Perform<CommentResponse> for Oper<SaveComment> { } } -impl Perform<CommentResponse> for Oper<CreateCommentLike> { +impl Perform for Oper<CreateCommentLike> { + type Response = CommentResponse; + fn perform( &self, pool: Pool<ConnectionManager<PgConnection>>, websocket_info: Option<WebsocketInfo>, - rate_limit_info: Option<RateLimitInfo>, ) -> Result<CommentResponse, Error> { let data: &CreateCommentLike = &self.data; @@ -480,13 +463,6 @@ impl Perform<CommentResponse> for Oper<CreateCommentLike> { let mut recipient_ids = Vec::new(); - if let Some(rl) = rate_limit_info { - rl.rate_limiter - .lock() - .unwrap() - .check_rate_limit_message(&rl.ip, false)?; - } - let conn = pool.get()?; // Don't do a downvote if site has downvotes disabled @@ -567,12 +543,13 @@ impl Perform<CommentResponse> for Oper<CreateCommentLike> { } } -impl Perform<GetCommentsResponse> for Oper<GetComments> { +impl Perform for Oper<GetComments> { + type Response = GetCommentsResponse; + fn perform( &self, pool: Pool<ConnectionManager<PgConnection>>, websocket_info: Option<WebsocketInfo>, - rate_limit_info: Option<RateLimitInfo>, ) -> Result<GetCommentsResponse, Error> { let data: &GetComments = &self.data; @@ -592,13 +569,6 @@ impl Perform<GetCommentsResponse> for Oper<GetComments> { let type_ = ListingType::from_str(&data.type_)?; let sort = SortType::from_str(&data.sort)?; - if let Some(rl) = rate_limit_info { - rl.rate_limiter - .lock() - .unwrap() - .check_rate_limit_message(&rl.ip, false)?; - } - let conn = pool.get()?; let comments = match CommentQueryBuilder::create(&conn) diff --git a/server/src/api/community.rs b/server/src/api/community.rs index 0f437693..df03546c 100644 --- a/server/src/api/community.rs +++ b/server/src/api/community.rs @@ -111,12 +111,13 @@ pub struct TransferCommunity { auth: String, } -impl Perform<GetCommunityResponse> for Oper<GetCommunity> { +impl Perform for Oper<GetCommunity> { + type Response = GetCommunityResponse; + fn perform( &self, pool: Pool<ConnectionManager<PgConnection>>, websocket_info: Option<WebsocketInfo>, - rate_limit_info: Option<RateLimitInfo>, ) -> Result<GetCommunityResponse, Error> { let data: &GetCommunity = &self.data; @@ -131,13 +132,6 @@ impl Perform<GetCommunityResponse> for Oper<GetCommunity> { None => None, }; - if let Some(rl) = rate_limit_info { - rl.rate_limiter - .lock() - .unwrap() - .check_rate_limit_message(&rl.ip, false)?; - } - let conn = pool.get()?; let community_id = match data.id { @@ -197,12 +191,13 @@ impl Perform<GetCommunityResponse> for Oper<GetCommunity> { } } -impl Perform<CommunityResponse> for Oper<CreateCommunity> { +impl Perform for Oper<CreateCommunity> { + type Response = CommunityResponse; + fn perform( &self, pool: Pool<ConnectionManager<PgConnection>>, _websocket_info: Option<WebsocketInfo>, - rate_limit_info: Option<RateLimitInfo>, ) -> Result<CommunityResponse, Error> { let data: &CreateCommunity = &self.data; @@ -227,13 +222,6 @@ impl Perform<CommunityResponse> for Oper<CreateCommunity> { let user_id = claims.id; - if let Some(rl) = &rate_limit_info { - rl.rate_limiter - .lock() - .unwrap() - .check_rate_limit_register(&rl.ip, true)?; - } - let conn = pool.get()?; // Check for a site ban @@ -283,25 +271,19 @@ impl Perform<CommunityResponse> for Oper<CreateCommunity> { let community_view = CommunityView::read(&conn, inserted_community.id, Some(user_id))?; - if let Some(rl) = rate_limit_info { - rl.rate_limiter - .lock() - .unwrap() - .check_rate_limit_register(&rl.ip, false)?; - } - Ok(CommunityResponse { community: community_view, }) } } -impl Perform<CommunityResponse> for Oper<EditCommunity> { +impl Perform for Oper<EditCommunity> { + type Response = CommunityResponse; + fn perform( &self, pool: Pool<ConnectionManager<PgConnection>>, websocket_info: Option<WebsocketInfo>, - rate_limit_info: Option<RateLimitInfo>, ) -> Result<CommunityResponse, Error> { let data: &EditCommunity = &self.data; @@ -326,13 +308,6 @@ impl Perform<CommunityResponse> for Oper<EditCommunity> { let user_id = claims.id; - if let Some(rl) = rate_limit_info { - rl.rate_limiter - .lock() - .unwrap() - .check_rate_limit_message(&rl.ip, false)?; - } - let conn = pool.get()?; // Check for a site ban @@ -410,12 +385,13 @@ impl Perform<CommunityResponse> for Oper<EditCommunity> { } } -impl Perform<ListCommunitiesResponse> for Oper<ListCommunities> { +impl Perform for Oper<ListCommunities> { + type Response = ListCommunitiesResponse; + fn perform( &self, pool: Pool<ConnectionManager<PgConnection>>, _websocket_info: Option<WebsocketInfo>, - rate_limit_info: Option<RateLimitInfo>, ) -> Result<ListCommunitiesResponse, Error> { let data: &ListCommunities = &self.data; @@ -439,13 +415,6 @@ impl Perform<ListCommunitiesResponse> for Oper<ListCommunities> { let sort = SortType::from_str(&data.sort)?; - if let Some(rl) = rate_limit_info { - rl.rate_limiter - .lock() - .unwrap() - .check_rate_limit_message(&rl.ip, false)?; - } - let conn = pool.get()?; let communities = CommunityQueryBuilder::create(&conn) @@ -461,12 +430,13 @@ impl Perform<ListCommunitiesResponse> for Oper<ListCommunities> { } } -impl Perform<CommunityResponse> for Oper<FollowCommunity> { +impl Perform for Oper<FollowCommunity> { + type Response = CommunityResponse; + fn perform( &self, pool: Pool<ConnectionManager<PgConnection>>, _websocket_info: Option<WebsocketInfo>, - rate_limit_info: Option<RateLimitInfo>, ) -> Result<CommunityResponse, Error> { let data: &FollowCommunity = &self.data; @@ -482,13 +452,6 @@ impl Perform<CommunityResponse> for Oper<FollowCommunity> { user_id, }; - if let Some(rl) = rate_limit_info { - rl.rate_limiter - .lock() - .unwrap() - .check_rate_limit_message(&rl.ip, false)?; - } - let conn = pool.get()?; if data.follow { @@ -511,12 +474,13 @@ impl Perform<CommunityResponse> for Oper<FollowCommunity> { } } -impl Perform<GetFollowedCommunitiesResponse> for Oper<GetFollowedCommunities> { +impl Perform for Oper<GetFollowedCommunities> { + type Response = GetFollowedCommunitiesResponse; + fn perform( &self, pool: Pool<ConnectionManager<PgConnection>>, _websocket_info: Option<WebsocketInfo>, - rate_limit_info: Option<RateLimitInfo>, ) -> Result<GetFollowedCommunitiesResponse, Error> { let data: &GetFollowedCommunities = &self.data; @@ -527,13 +491,6 @@ impl Perform<GetFollowedCommunitiesResponse> for Oper<GetFollowedCommunities> { let user_id = claims.id; - if let Some(rl) = rate_limit_info { - rl.rate_limiter - .lock() - .unwrap() - .check_rate_limit_message(&rl.ip, false)?; - } - let conn = pool.get()?; let communities: Vec<CommunityFollowerView> = @@ -547,12 +504,13 @@ impl Perform<GetFollowedCommunitiesResponse> for Oper<GetFollowedCommunities> { } } -impl Perform<BanFromCommunityResponse> for Oper<BanFromCommunity> { +impl Perform for Oper<BanFromCommunity> { + type Response = BanFromCommunityResponse; + fn perform( &self, pool: Pool<ConnectionManager<PgConnection>>, websocket_info: Option<WebsocketInfo>, - rate_limit_info: Option<RateLimitInfo>, ) -> Result<BanFromCommunityResponse, Error> { let data: &BanFromCommunity = &self.data; @@ -568,13 +526,6 @@ impl Perform<BanFromCommunityResponse> for Oper<BanFromCommunity> { user_id: data.user_id, }; - if let Some(rl) = rate_limit_info { - rl.rate_limiter - .lock() - .unwrap() - .check_rate_limit_message(&rl.ip, false)?; - } - let conn = pool.get()?; if data.ban { @@ -625,12 +576,13 @@ impl Perform<BanFromCommunityResponse> for Oper<BanFromCommunity> { } } -impl Perform<AddModToCommunityResponse> for Oper<AddModToCommunity> { +impl Perform for Oper<AddModToCommunity> { + type Response = AddModToCommunityResponse; + fn perform( &self, pool: Pool<ConnectionManager<PgConnection>>, websocket_info: Option<WebsocketInfo>, - rate_limit_info: Option<RateLimitInfo>, ) -> Result<AddModToCommunityResponse, Error> { let data: &AddModToCommunity = &self.data; @@ -646,13 +598,6 @@ impl Perform<AddModToCommunityResponse> for Oper<AddModToCommunity> { user_id: data.user_id, }; - if let Some(rl) = rate_limit_info { - rl.rate_limiter - .lock() - .unwrap() - .check_rate_limit_message(&rl.ip, false)?; - } - let conn = pool.get()?; if data.added { @@ -693,12 +638,13 @@ impl Perform<AddModToCommunityResponse> for Oper<AddModToCommunity> { } } -impl Perform<GetCommunityResponse> for Oper<TransferCommunity> { +impl Perform for Oper<TransferCommunity> { + type Response = GetCommunityResponse; + fn perform( &self, pool: Pool<ConnectionManager<PgConnection>>, _websocket_info: Option<WebsocketInfo>, - rate_limit_info: Option<RateLimitInfo>, ) -> Result<GetCommunityResponse, Error> { let data: &TransferCommunity = &self.data; @@ -709,13 +655,6 @@ impl Perform<GetCommunityResponse> for Oper<TransferCommunity> { let user_id = claims.id; - if let Some(rl) = rate_limit_info { - rl.rate_limiter - .lock() - .unwrap() - .check_rate_limit_message(&rl.ip, false)?; - } - let conn = pool.get()?; let read_community = Community::read(&conn, data.community_id)?; diff --git a/server/src/api/mod.rs b/server/src/api/mod.rs index e40d122c..aab00c04 100644 --- a/server/src/api/mod.rs +++ b/server/src/api/mod.rs @@ -22,7 +22,6 @@ use crate::{ naive_now, remove_slurs, send_email, slur_check, slurs_vec_to_str, }; -use crate::rate_limit::RateLimitInfo; use crate::settings::Settings; use crate::websocket::UserOperation; use crate::websocket::{ @@ -69,13 +68,12 @@ impl<T> Oper<T> { } } -pub trait Perform<T> { +pub trait Perform { + type Response: serde::ser::Serialize; + fn perform( &self, pool: Pool<ConnectionManager<PgConnection>>, websocket_info: Option<WebsocketInfo>, - rate_limit_info: Option<RateLimitInfo>, - ) -> Result<T, Error> - where - T: Sized; + ) -> Result<Self::Response, Error>; } diff --git a/server/src/api/post.rs b/server/src/api/post.rs index 19f16014..84ef89f1 100644 --- a/server/src/api/post.rs +++ b/server/src/api/post.rs @@ -77,12 +77,13 @@ pub struct SavePost { auth: String, } -impl Perform<PostResponse> for Oper<CreatePost> { +impl Perform for Oper<CreatePost> { + type Response = PostResponse; + fn perform( &self, pool: Pool<ConnectionManager<PgConnection>>, websocket_info: Option<WebsocketInfo>, - rate_limit_info: Option<RateLimitInfo>, ) -> Result<PostResponse, Error> { let data: &CreatePost = &self.data; @@ -103,13 +104,6 @@ impl Perform<PostResponse> for Oper<CreatePost> { let user_id = claims.id; - if let Some(rl) = &rate_limit_info { - rl.rate_limiter - .lock() - .unwrap() - .check_rate_limit_post(&rl.ip, true)?; - } - let conn = pool.get()?; // Check for a community ban @@ -176,13 +170,6 @@ impl Perform<PostResponse> for Oper<CreatePost> { Err(_e) => return Err(APIError::err("couldnt_find_post").into()), }; - if let Some(rl) = &rate_limit_info { - rl.rate_limiter - .lock() - .unwrap() - .check_rate_limit_post(&rl.ip, false)?; - } - let res = PostResponse { post: post_view }; if let Some(ws) = websocket_info { @@ -197,12 +184,13 @@ impl Perform<PostResponse> for Oper<CreatePost> { } } -impl Perform<GetPostResponse> for Oper<GetPost> { +impl Perform for Oper<GetPost> { + type Response = GetPostResponse; + fn perform( &self, pool: Pool<ConnectionManager<PgConnection>>, websocket_info: Option<WebsocketInfo>, - rate_limit_info: Option<RateLimitInfo>, ) -> Result<GetPostResponse, Error> { let data: &GetPost = &self.data; @@ -217,13 +205,6 @@ impl Perform<GetPostResponse> for Oper<GetPost> { None => None, }; - if let Some(rl) = rate_limit_info { - rl.rate_limiter - .lock() - .unwrap() - .check_rate_limit_message(&rl.ip, false)?; - } - let conn = pool.get()?; let post_view = match PostView::read(&conn, data.id, user_id) { @@ -277,12 +258,13 @@ impl Perform<GetPostResponse> for Oper<GetPost> { } } -impl Perform<GetPostsResponse> for Oper<GetPosts> { +impl Perform for Oper<GetPosts> { + type Response = GetPostsResponse; + fn perform( &self, pool: Pool<ConnectionManager<PgConnection>>, websocket_info: Option<WebsocketInfo>, - rate_limit_info: Option<RateLimitInfo>, ) -> Result<GetPostsResponse, Error> { let data: &GetPosts = &self.data; @@ -307,13 +289,6 @@ impl Perform<GetPostsResponse> for Oper<GetPosts> { let type_ = ListingType::from_str(&data.type_)?; let sort = SortType::from_str(&data.sort)?; - if let Some(rl) = rate_limit_info { - rl.rate_limiter - .lock() - .unwrap() - .check_rate_limit_message(&rl.ip, false)?; - } - let conn = pool.get()?; let posts = match PostQueryBuilder::create(&conn) @@ -348,12 +323,13 @@ impl Perform<GetPostsResponse> for Oper<GetPosts> { } } -impl Perform<PostResponse> for Oper<CreatePostLike> { +impl Perform for Oper<CreatePostLike> { + type Response = PostResponse; + fn perform( &self, pool: Pool<ConnectionManager<PgConnection>>, websocket_info: Option<WebsocketInfo>, - rate_limit_info: Option<RateLimitInfo>, ) -> Result<PostResponse, Error> { let data: &CreatePostLike = &self.data; @@ -364,13 +340,6 @@ impl Perform<PostResponse> for Oper<CreatePostLike> { let user_id = claims.id; - if let Some(rl) = rate_limit_info { - rl.rate_limiter - .lock() - .unwrap() - .check_rate_limit_message(&rl.ip, false)?; - } - let conn = pool.get()?; // Don't do a downvote if site has downvotes disabled @@ -429,12 +398,13 @@ impl Perform<PostResponse> for Oper<CreatePostLike> { } } -impl Perform<PostResponse> for Oper<EditPost> { +impl Perform for Oper<EditPost> { + type Response = PostResponse; + fn perform( &self, pool: Pool<ConnectionManager<PgConnection>>, websocket_info: Option<WebsocketInfo>, - rate_limit_info: Option<RateLimitInfo>, ) -> Result<PostResponse, Error> { let data: &EditPost = &self.data; @@ -455,13 +425,6 @@ impl Perform<PostResponse> for Oper<EditPost> { let user_id = claims.id; - if let Some(rl) = rate_limit_info { - rl.rate_limiter - .lock() - .unwrap() - .check_rate_limit_message(&rl.ip, false)?; - } - let conn = pool.get()?; // Verify its the creator or a mod or admin @@ -567,12 +530,13 @@ impl Perform<PostResponse> for Oper<EditPost> { } } -impl Perform<PostResponse> for Oper<SavePost> { +impl Perform for Oper<SavePost> { + type Response = PostResponse; + fn perform( &self, pool: Pool<ConnectionManager<PgConnection>>, _websocket_info: Option<WebsocketInfo>, - rate_limit_info: Option<RateLimitInfo>, ) -> Result<PostResponse, Error> { let data: &SavePost = &self.data; @@ -588,13 +552,6 @@ impl Perform<PostResponse> for Oper<SavePost> { user_id, }; - if let Some(rl) = rate_limit_info { - rl.rate_limiter - .lock() - .unwrap() - .check_rate_limit_message(&rl.ip, false)?; - } - let conn = pool.get()?; if data.save { diff --git a/server/src/api/site.rs b/server/src/api/site.rs index 891f52a4..e05487df 100644 --- a/server/src/api/site.rs +++ b/server/src/api/site.rs @@ -108,22 +108,16 @@ pub struct SaveSiteConfig { auth: String, } -impl Perform<ListCategoriesResponse> for Oper<ListCategories> { +impl Perform for Oper<ListCategories> { + type Response = ListCategoriesResponse; + fn perform( &self, pool: Pool<ConnectionManager<PgConnection>>, _websocket_info: Option<WebsocketInfo>, - rate_limit_info: Option<RateLimitInfo>, ) -> Result<ListCategoriesResponse, Error> { let _data: &ListCategories = &self.data; - if let Some(rl) = rate_limit_info { - rl.rate_limiter - .lock() - .unwrap() - .check_rate_limit_message(&rl.ip, false)?; - } - let conn = pool.get()?; let categories: Vec<Category> = Category::list_all(&conn)?; @@ -133,22 +127,16 @@ impl Perform<ListCategoriesResponse> for Oper<ListCategories> { } } -impl Perform<GetModlogResponse> for Oper<GetModlog> { +impl Perform for Oper<GetModlog> { + type Response = GetModlogResponse; + fn perform( &self, pool: Pool<ConnectionManager<PgConnection>>, _websocket_info: Option<WebsocketInfo>, - rate_limit_info: Option<RateLimitInfo>, ) -> Result<GetModlogResponse, Error> { let data: &GetModlog = &self.data; - if let Some(rl) = rate_limit_info { - rl.rate_limiter - .lock() - .unwrap() - .check_rate_limit_message(&rl.ip, false)?; - } - let conn = pool.get()?; let removed_posts = ModRemovePostView::list( @@ -220,12 +208,13 @@ impl Perform<GetModlogResponse> for Oper<GetModlog> { } } -impl Perform<SiteResponse> for Oper<CreateSite> { +impl Perform for Oper<CreateSite> { + type Response = SiteResponse; + fn perform( &self, pool: Pool<ConnectionManager<PgConnection>>, _websocket_info: Option<WebsocketInfo>, - rate_limit_info: Option<RateLimitInfo>, ) -> Result<SiteResponse, Error> { let data: &CreateSite = &self.data; @@ -246,13 +235,6 @@ impl Perform<SiteResponse> for Oper<CreateSite> { let user_id = claims.id; - if let Some(rl) = rate_limit_info { - rl.rate_limiter - .lock() - .unwrap() - .check_rate_limit_message(&rl.ip, false)?; - } - let conn = pool.get()?; // Make sure user is an admin @@ -281,12 +263,12 @@ impl Perform<SiteResponse> for Oper<CreateSite> { } } -impl Perform<SiteResponse> for Oper<EditSite> { +impl Perform for Oper<EditSite> { + type Response = SiteResponse; fn perform( &self, pool: Pool<ConnectionManager<PgConnection>>, websocket_info: Option<WebsocketInfo>, - rate_limit_info: Option<RateLimitInfo>, ) -> Result<SiteResponse, Error> { let data: &EditSite = &self.data; @@ -307,13 +289,6 @@ impl Perform<SiteResponse> for Oper<EditSite> { let user_id = claims.id; - if let Some(rl) = rate_limit_info { - rl.rate_limiter - .lock() - .unwrap() - .check_rate_limit_message(&rl.ip, false)?; - } - let conn = pool.get()?; // Make sure user is an admin @@ -354,22 +329,16 @@ impl Perform<SiteResponse> for Oper<EditSite> { } } -impl Perform<GetSiteResponse> for Oper<GetSite> { +impl Perform for Oper<GetSite> { + type Response = GetSiteResponse; + fn perform( &self, pool: Pool<ConnectionManager<PgConnection>>, websocket_info: Option<WebsocketInfo>, - rate_limit_info: Option<RateLimitInfo>, ) -> Result<GetSiteResponse, Error> { let _data: &GetSite = &self.data; - if let Some(rl) = &rate_limit_info { - rl.rate_limiter - .lock() - .unwrap() - .check_rate_limit_message(&rl.ip, false)?; - } - let conn = pool.get()?; // TODO refactor this a little @@ -385,11 +354,7 @@ impl Perform<GetSiteResponse> for Oper<GetSite> { admin: true, show_nsfw: true, }; - let login_response = Oper::new(register).perform( - pool.clone(), - websocket_info.clone(), - rate_limit_info.clone(), - )?; + let login_response = Oper::new(register).perform(pool.clone(), websocket_info.clone())?; info!("Admin {} created", setup.admin_username); let create_site = CreateSite { @@ -400,7 +365,7 @@ impl Perform<GetSiteResponse> for Oper<GetSite> { enable_nsfw: false, auth: login_response.jwt, }; - Oper::new(create_site).perform(pool, websocket_info.clone(), rate_limit_info)?; + Oper::new(create_site).perform(pool, websocket_info.clone())?; info!("Site {} created", setup.site_name); Some(SiteView::read(&conn)?) } else { @@ -437,12 +402,13 @@ impl Perform<GetSiteResponse> for Oper<GetSite> { } } -impl Perform<SearchResponse> for Oper<Search> { +impl Perform for Oper<Search> { + type Response = SearchResponse; + fn perform( &self, pool: Pool<ConnectionManager<PgConnection>>, _websocket_info: Option<WebsocketInfo>, - rate_limit_info: Option<RateLimitInfo>, ) -> Result<SearchResponse, Error> { let data: &Search = &self.data; @@ -467,13 +433,6 @@ impl Perform<SearchResponse> for Oper<Search> { // TODO no clean / non-nsfw searching rn - if let Some(rl) = rate_limit_info { - rl.rate_limiter - .lock() - .unwrap() - .check_rate_limit_message(&rl.ip, false)?; - } - let conn = pool.get()?; match type_ { @@ -569,12 +528,13 @@ impl Perform<SearchResponse> for Oper<Search> { } } -impl Perform<GetSiteResponse> for Oper<TransferSite> { +impl Perform for Oper<TransferSite> { + type Response = GetSiteResponse; + fn perform( &self, pool: Pool<ConnectionManager<PgConnection>>, _websocket_info: Option<WebsocketInfo>, - rate_limit_info: Option<RateLimitInfo>, ) -> Result<GetSiteResponse, Error> { let data: &TransferSite = &self.data; @@ -585,13 +545,6 @@ impl Perform<GetSiteResponse> for Oper<TransferSite> { let user_id = claims.id; - if let Some(rl) = rate_limit_info { - rl.rate_limiter - .lock() - .unwrap() - .check_rate_limit_message(&rl.ip, false)?; - } - let conn = pool.get()?; let read_site = Site::read(&conn, 1)?; @@ -646,12 +599,13 @@ impl Perform<GetSiteResponse> for Oper<TransferSite> { } } -impl Perform<GetSiteConfigResponse> for Oper<GetSiteConfig> { +impl Perform for Oper<GetSiteConfig> { + type Response = GetSiteConfigResponse; + fn perform( &self, pool: Pool<ConnectionManager<PgConnection>>, _websocket_info: Option<WebsocketInfo>, - rate_limit_info: Option<RateLimitInfo>, ) -> Result<GetSiteConfigResponse, Error> { let data: &GetSiteConfig = &self.data; @@ -662,13 +616,6 @@ impl Perform<GetSiteConfigResponse> for Oper<GetSiteConfig> { let user_id = claims.id; - if let Some(rl) = rate_limit_info { - rl.rate_limiter - .lock() - .unwrap() - .check_rate_limit_message(&rl.ip, false)?; - } - let conn = pool.get()?; // Only let admins read this @@ -685,12 +632,13 @@ impl Perform<GetSiteConfigResponse> for Oper<GetSiteConfig> { } } -impl Perform<GetSiteConfigResponse> for Oper<SaveSiteConfig> { +impl Perform for Oper<SaveSiteConfig> { + type Response = GetSiteConfigResponse; + fn perform( &self, pool: Pool<ConnectionManager<PgConnection>>, _websocket_info: Option<WebsocketInfo>, - rate_limit_info: Option<RateLimitInfo>, ) -> Result<GetSiteConfigResponse, Error> { let data: &SaveSiteConfig = &self.data; @@ -701,13 +649,6 @@ impl Perform<GetSiteConfigResponse> for Oper<SaveSiteConfig> { let user_id = claims.id; - if let Some(rl) = rate_limit_info { - rl.rate_limiter - .lock() - .unwrap() - .check_rate_limit_message(&rl.ip, false)?; - } - let conn = pool.get()?; // Only let admins read this diff --git a/server/src/api/user.rs b/server/src/api/user.rs index 31a0a4e7..c2734f51 100644 --- |