diff --git a/crates/core/config/Revolt.toml b/crates/core/config/Revolt.toml index 85823e63..2d8953fd 100644 --- a/crates/core/config/Revolt.toml +++ b/crates/core/config/Revolt.toml @@ -47,6 +47,8 @@ webhooks_enabled = false [features.limits] [features.limits.default] +outgoing_friend_requests = 10 + group_size = 100 bots = 5 message_length = 2000 diff --git a/crates/core/config/src/lib.rs b/crates/core/config/src/lib.rs index 60fe88fb..13d2ffa5 100644 --- a/crates/core/config/src/lib.rs +++ b/crates/core/config/src/lib.rs @@ -106,6 +106,8 @@ pub struct Api { #[derive(Deserialize, Debug, Clone)] pub struct FeaturesLimits { + pub outgoing_friend_requests: usize, + pub group_size: usize, pub bots: usize, pub message_length: usize, diff --git a/crates/core/database/src/models/users/model.rs b/crates/core/database/src/models/users/model.rs index 63749941..30581791 100644 --- a/crates/core/database/src/models/users/model.rs +++ b/crates/core/database/src/models/users/model.rs @@ -470,6 +470,24 @@ impl User { /// Add another user as a friend pub async fn add_friend(&mut self, db: &Database, target: &mut User) -> Result<()> { + let count = self + .relations + .as_ref() + .map(|relations| { + relations + .iter() + .filter(|r| matches!(r.status, RelationshipStatus::Outgoing)) + .count() + }) + .unwrap_or_default(); + + let config = config().await; + if count >= config.features.limits.default.outgoing_friend_requests { + return Err(create_error!(TooManyPendingFriendRequests { + max: config.features.limits.default.outgoing_friend_requests + })); + } + match self.relationship_with(&target.id) { RelationshipStatus::User => Err(create_error!(NoEffect)), RelationshipStatus::Friend => Err(create_error!(AlreadyFriends)), diff --git a/crates/core/result/src/lib.rs b/crates/core/result/src/lib.rs index 1f40be19..b444d66b 100644 --- a/crates/core/result/src/lib.rs +++ b/crates/core/result/src/lib.rs @@ -60,6 +60,9 @@ pub enum ErrorType { Blocked, BlockedByOther, NotFriends, + TooManyPendingFriendRequests { + max: usize, + }, // ? Channel related errors UnknownChannel, diff --git a/crates/core/result/src/rocket.rs b/crates/core/result/src/rocket.rs index d5ca3493..272cfc42 100644 --- a/crates/core/result/src/rocket.rs +++ b/crates/core/result/src/rocket.rs @@ -25,6 +25,7 @@ impl<'r> Responder<'r, 'static> for Error { ErrorType::Blocked => Status::Conflict, ErrorType::BlockedByOther => Status::Forbidden, ErrorType::NotFriends => Status::Forbidden, + ErrorType::TooManyPendingFriendRequests { .. } => Status::BadRequest, ErrorType::UnknownChannel => Status::NotFound, ErrorType::UnknownMessage => Status::NotFound,