From 72aed64e5b1792887fc47724f7d4243fe3347641 Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Fri, 15 Jul 2022 16:47:27 +0100 Subject: [PATCH] chore: allow banning users not in server --- crates/delta/src/routes/servers/ban_create.rs | 30 ++++++++++++++----- .../quark/src/impl/generic/servers/server.rs | 22 +++++++++----- 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/crates/delta/src/routes/servers/ban_create.rs b/crates/delta/src/routes/servers/ban_create.rs index 9664dfc6..f6cb4ef0 100644 --- a/crates/delta/src/routes/servers/ban_create.rs +++ b/crates/delta/src/routes/servers/ban_create.rs @@ -1,5 +1,5 @@ use revolt_quark::{ - models::{ServerBan, User}, + models::{server_member::MemberCompositeKey, ServerBan, User}, perms, Db, Error, Permission, Ref, Result, }; @@ -47,13 +47,27 @@ pub async fn req( .throw_permission(db, Permission::BanMembers) .await?; - let member = target.as_member(db, &server.id).await?; + // If member exists, check privileges against them + if let Ok(member) = target.as_member(db, &server.id).await { + if member.get_ranking(permissions.server.get().unwrap()) + <= permissions.get_member_rank().unwrap_or(i64::MIN) + { + return Err(Error::NotElevated); + } - if member.get_ranking(permissions.server.get().unwrap()) - <= permissions.get_member_rank().unwrap_or(i64::MIN) - { - return Err(Error::NotElevated); + server.ban_member(db, member, data.reason).await.map(Json) + } else { + let server_id = server.id.to_string(); + server + .ban_user( + db, + MemberCompositeKey { + server: server_id, + user: target.id, + }, + data.reason, + ) + .await + .map(Json) } - - server.ban_member(db, member, data.reason).await.map(Json) } diff --git a/crates/quark/src/impl/generic/servers/server.rs b/crates/quark/src/impl/generic/servers/server.rs index dfa3ca5a..6b522358 100644 --- a/crates/quark/src/impl/generic/servers/server.rs +++ b/crates/quark/src/impl/generic/servers/server.rs @@ -283,6 +283,18 @@ impl Server { Ok(()) } + /// Create ban + pub async fn ban_user( + self, + db: &Database, + id: MemberCompositeKey, + reason: Option, + ) -> Result { + let ban = ServerBan { id, reason }; + db.insert_ban(&ban).await?; + Ok(ban) + } + /// Ban a member from a server pub async fn ban_member( self, @@ -290,16 +302,10 @@ impl Server { member: Member, reason: Option, ) -> Result { - let ban = ServerBan { - id: member.id.clone(), - reason, - }; - - self.remove_member(db, member, RemovalIntention::Ban) + self.remove_member(db, member.clone(), RemovalIntention::Ban) .await?; - db.insert_ban(&ban).await?; - Ok(ban) + self.ban_user(db, member.id, reason).await } }