diff --git a/crates/delta/src/routes/channels/message_send.rs b/crates/delta/src/routes/channels/message_send.rs index 355feff0..f5d96ad7 100644 --- a/crates/delta/src/routes/channels/message_send.rs +++ b/crates/delta/src/routes/channels/message_send.rs @@ -7,7 +7,7 @@ use revolt_quark::{ }, perms, web::idempotency::IdempotencyKey, - Db, Error, Permission, Ref, Result, + Db, Error, Permission, Ref, Result, variables::delta::{MAX_ATTACHMENT_COUNT, MAX_REPLY_COUNT}, }; use regex::Regex; @@ -139,8 +139,8 @@ pub async fn message_send( // 4. Verify replies are valid. let mut replies = HashSet::new(); if let Some(entries) = data.replies { - if entries.len() > 5 { - return Err(Error::TooManyReplies); + if entries.len() > *MAX_REPLY_COUNT { + return Err(Error::TooManyReplies { max: *MAX_REPLY_COUNT }); } for Reply { id, mention } in entries { @@ -191,8 +191,8 @@ pub async fn message_send( } // ! FIXME: move this to app config - if ids.len() > 5 { - return Err(Error::TooManyAttachments); + if ids.len() > *MAX_ATTACHMENT_COUNT { + return Err(Error::TooManyAttachments { max: *MAX_ATTACHMENT_COUNT} ); } for attachment_id in ids { diff --git a/crates/delta/src/routes/customisation/emoji_create.rs b/crates/delta/src/routes/customisation/emoji_create.rs index 339a4cd6..25ba7bf5 100644 --- a/crates/delta/src/routes/customisation/emoji_create.rs +++ b/crates/delta/src/routes/customisation/emoji_create.rs @@ -1,5 +1,6 @@ use revolt_quark::models::emoji::EmojiParent; use revolt_quark::models::{Emoji, File, User}; +use revolt_quark::variables::delta::MAX_EMOJI_COUNT; use revolt_quark::{perms, Db, Error, Permission, Result}; use serde::Deserialize; use validator::Validate; @@ -55,8 +56,8 @@ pub async fn create_emoji( // Check that there are no more than 100 emoji // ! FIXME: hardcoded upper limit let emojis = db.fetch_emoji_by_parent_id(&server.id).await?; - if emojis.len() > 99 { - return Err(Error::TooManyEmoji); + if emojis.len() > *MAX_EMOJI_COUNT { + return Err(Error::TooManyEmoji { max: *MAX_EMOJI_COUNT }); } } EmojiParent::Detached => return Err(Error::InvalidOperation), diff --git a/crates/delta/src/routes/servers/channel_create.rs b/crates/delta/src/routes/servers/channel_create.rs index 1c777639..51e856be 100644 --- a/crates/delta/src/routes/servers/channel_create.rs +++ b/crates/delta/src/routes/servers/channel_create.rs @@ -2,7 +2,7 @@ use std::collections::HashMap; use revolt_quark::{ models::{server::PartialServer, Channel, User}, - perms, Db, Error, Permission, Ref, Result, + perms, Db, Error, Permission, Ref, Result, variables::delta::MAX_CHANNEL_COUNT, }; use rocket::serde::json::Json; @@ -58,6 +58,10 @@ pub async fn req( .throw_permission(db, Permission::ManageChannel) .await?; + if server.channels.len() > *MAX_CHANNEL_COUNT { + return Err(Error::TooManyChannels { max: *MAX_CHANNEL_COUNT }) + }; + let id = Ulid::new().to_string(); let mut channels = server.channels.clone(); channels.push(id.clone()); diff --git a/crates/delta/src/routes/servers/roles_create.rs b/crates/delta/src/routes/servers/roles_create.rs index c620b6c7..54e01637 100644 --- a/crates/delta/src/routes/servers/roles_create.rs +++ b/crates/delta/src/routes/servers/roles_create.rs @@ -1,6 +1,6 @@ use revolt_quark::{ models::{server::Role, User}, - perms, Db, Error, Permission, Ref, Result, + perms, Db, Error, Permission, Ref, Result, variables::delta::MAX_ROLE_COUNT, }; use rocket::serde::json::Json; @@ -50,6 +50,10 @@ pub async fn req( .throw_permission(db, Permission::ManageRole) .await?; + if server.roles.len() > *MAX_ROLE_COUNT { + return Err(Error::TooManyRoles { max: *MAX_ROLE_COUNT }) + }; + let member_rank = permissions.get_member_rank(); let rank = if let Some(given_rank) = data.rank { if given_rank <= member_rank.unwrap_or(i64::MIN) { diff --git a/crates/quark/src/util/result.rs b/crates/quark/src/util/result.rs index 66613527..8fb449d0 100644 --- a/crates/quark/src/util/result.rs +++ b/crates/quark/src/util/result.rs @@ -3,7 +3,6 @@ use revolt_rocket_okapi::revolt_okapi::openapi3; use rocket::{ http::{ContentType, Status}, response::{self, Responder}, - serde::json::serde_json::json, Request, Response, }; use schemars::schema::Schema; @@ -39,8 +38,15 @@ pub enum Error { UnknownMessage, CannotEditMessage, CannotJoinCall, - TooManyAttachments, - TooManyReplies, + TooManyAttachments { + max: usize + }, + TooManyReplies { + max: usize + }, + TooManyChannels { + max: usize + }, EmptyMessage, PayloadTooLarge, CannotRemoveYourself, @@ -57,7 +63,12 @@ pub enum Error { TooManyServers { max: usize, }, - TooManyEmoji, + TooManyEmoji { + max: usize + }, + TooManyRoles { + max: usize + }, // ? Bot related errors ReachedMaximumBots, @@ -151,8 +162,8 @@ impl<'r> Responder<'r, 'static> for Error { Error::UnknownAttachment => Status::BadRequest, Error::CannotEditMessage => Status::Forbidden, Error::CannotJoinCall => Status::BadRequest, - Error::TooManyAttachments => Status::BadRequest, - Error::TooManyReplies => Status::BadRequest, + Error::TooManyAttachments { .. } => Status::BadRequest, + Error::TooManyReplies { .. } => Status::BadRequest, Error::EmptyMessage => Status::UnprocessableEntity, Error::PayloadTooLarge => Status::UnprocessableEntity, Error::CannotRemoveYourself => Status::BadRequest, @@ -163,8 +174,11 @@ impl<'r> Responder<'r, 'static> for Error { Error::UnknownServer => Status::NotFound, Error::InvalidRole => Status::NotFound, Error::Banned => Status::Forbidden, - Error::TooManyServers { .. } => Status::Forbidden, - Error::TooManyEmoji => Status::BadRequest, + + Error::TooManyServers { .. } => Status::BadRequest, + Error::TooManyEmoji { .. } => Status::BadRequest, + Error::TooManyChannels { .. } => Status::BadRequest, + Error::TooManyRoles { .. } => Status::BadRequest, Error::ReachedMaximumBots => Status::BadRequest, Error::IsBot => Status::BadRequest, @@ -193,7 +207,7 @@ impl<'r> Responder<'r, 'static> for Error { }; // Serialize the error data structure into JSON. - let string = json!(self).to_string(); + let string = serde_json::to_string(&self).unwrap(); // Build and send the request. Response::build() diff --git a/crates/quark/src/util/variables/delta.rs b/crates/quark/src/util/variables/delta.rs index 3981b77d..3733a12d 100644 --- a/crates/quark/src/util/variables/delta.rs +++ b/crates/quark/src/util/variables/delta.rs @@ -44,6 +44,12 @@ pub static MAX_GROUP_SIZE: Lazy = Lazy::new(|| env::var("REVOLT_MAX_GROUP pub static MAX_BOT_COUNT: Lazy = Lazy::new(|| env::var("REVOLT_MAX_BOT_COUNT").unwrap_or_else(|_| "5".to_string()).parse().unwrap()); pub static MAX_EMBED_COUNT: Lazy = Lazy::new(|| env::var("REVOLT_MAX_EMBED_COUNT").unwrap_or_else(|_| "5".to_string()).parse().unwrap()); pub static MAX_SERVER_COUNT: Lazy = Lazy::new(|| env::var("REVOLT_MAX_SERVER_COUNT").unwrap_or_else(|_| "100".to_string()).parse().unwrap()); +pub static MAX_CHANNEL_COUNT: Lazy = Lazy::new(|| env::var("REVOLT_MAX_CHANNEL_COUNT").unwrap_or_else(|_| "200".to_string()).parse().unwrap()); +pub static MAX_ROLE_COUNT: Lazy = Lazy::new(|| env::var("REVOLT_MAX_ROLE_COUNT").unwrap_or_else(|_| "200".to_string()).parse().unwrap()); +pub static MAX_EMOJI_COUNT: Lazy = Lazy::new(|| env::var("REVOLT_MAX_EMOJI_COUNT").unwrap_or_else(|_| "100".to_string()).parse().unwrap()); +pub static MAX_ATTACHMENT_COUNT: Lazy = Lazy::new(|| env::var("REVOLT_MAX_ATTACHMENT_COUNT").unwrap_or_else(|_| "5".to_string()).parse().unwrap()); +pub static MAX_REPLY_COUNT: Lazy = Lazy::new(|| env::var("REVOLT_MAX_REPLY_COUNT").unwrap_or_else(|_| "5".to_string()).parse().unwrap()); + pub static EARLY_ADOPTER_BADGE: Lazy = Lazy::new(|| env::var("REVOLT_EARLY_ADOPTER_BADGE").unwrap_or_else(|_| "0".to_string()).parse().unwrap()); pub fn preflight_checks() {