From 405d9bdb8c82b84364c6a9efb573bea82d5ec1fb Mon Sep 17 00:00:00 2001 From: Zomatree Date: Mon, 24 Aug 2026 19:07:09 +0100 Subject: [PATCH] fix: send relationship info for bots (#935) * fix: send relationship info for bots Signed-off-by: Zomatree * fix: dont allow bots to block users Signed-off-by: Zomatree * fix: always allow users to view bot's profile Signed-off-by: Zomatree --------- Signed-off-by: Zomatree --- crates/core/database/src/util/bridge/v0.rs | 8 ++------ crates/core/permissions/src/impl.rs | 20 +++++++------------ crates/delta/src/routes/users/block_user.rs | 6 +++++- crates/delta/src/routes/users/unblock_user.rs | 6 +++++- 4 files changed, 19 insertions(+), 21 deletions(-) diff --git a/crates/core/database/src/util/bridge/v0.rs b/crates/core/database/src/util/bridge/v0.rs index 88dbaee5..3677ef46 100644 --- a/crates/core/database/src/util/bridge/v0.rs +++ b/crates/core/database/src/util/bridge/v0.rs @@ -1045,9 +1045,7 @@ impl crate::User { P: Into>, { let perspective = perspective.into(); - let (relationship, can_see_profile) = if self.bot.is_some() { - (RelationshipStatus::None, true) - } else if let Some(perspective) = perspective { + let (relationship, can_see_profile) = if let Some(perspective) = perspective { let mut query = DatabasePermissionQuery::new(db, perspective).user(&self); if perspective.id == self.id { @@ -1126,9 +1124,7 @@ impl crate::User { P: Into>, { let perspective = perspective.into(); - let (relationship, can_see_profile) = if self.bot.is_some() { - (RelationshipStatus::None, true) - } else if let Some(perspective) = perspective { + let (relationship, can_see_profile) = if let Some(perspective) = perspective { if perspective.id == self.id { (RelationshipStatus::User, true) } else { diff --git a/crates/core/permissions/src/impl.rs b/crates/core/permissions/src/impl.rs index f73d0a08..ac890a14 100644 --- a/crates/core/permissions/src/impl.rs +++ b/crates/core/permissions/src/impl.rs @@ -6,11 +6,7 @@ use crate::{ /// Calculate permissions against a user pub async fn calculate_user_permissions(query: &mut P) -> PermissionValue { - if query.are_we_privileged().await { - return u64::MAX.into(); - } - - if query.are_the_users_same().await { + if query.are_we_privileged().await || query.are_the_users_same().await { return u64::MAX.into(); } @@ -26,17 +22,15 @@ pub async fn calculate_user_permissions(query: &mut P) -> Pe _ => {} } - if query.have_mutual_connection().await { + if query.have_mutual_connection().await || query.user_is_bot().await { permissions = UserPermission::Access as u64 + UserPermission::ViewProfile as u64; + }; - if query.user_is_bot().await || query.are_we_a_bot().await { - permissions += UserPermission::SendMessage as u64; - } + if query.have_mutual_connection().await && (query.are_we_a_bot().await || query.user_is_bot().await) { + permissions += UserPermission::SendMessage as u64; + }; - permissions.into() - } else { - permissions.into() - } + permissions.into() // TODO: add boolean switch for permission for users to globally message a user // maybe an enum? diff --git a/crates/delta/src/routes/users/block_user.rs b/crates/delta/src/routes/users/block_user.rs index cfce993c..852d9fa1 100644 --- a/crates/delta/src/routes/users/block_user.rs +++ b/crates/delta/src/routes/users/block_user.rs @@ -1,7 +1,7 @@ use revolt_database::util::reference::Reference; use revolt_database::{Database, User}; use revolt_models::v0; -use revolt_result::Result; +use revolt_result::{create_error, Result}; use rocket::serde::json::Json; use rocket::State; @@ -15,6 +15,10 @@ pub async fn block( mut user: User, target: Reference<'_>, ) -> Result> { + if user.bot.is_some() { + return Err(create_error!(IsBot)); + } + let mut target = target.as_user(db).await?; user.block_user(db, &mut target).await?; diff --git a/crates/delta/src/routes/users/unblock_user.rs b/crates/delta/src/routes/users/unblock_user.rs index a464ecc5..c3e748e2 100644 --- a/crates/delta/src/routes/users/unblock_user.rs +++ b/crates/delta/src/routes/users/unblock_user.rs @@ -1,7 +1,7 @@ use revolt_database::util::reference::Reference; use revolt_database::{Database, User}; use revolt_models::v0; -use revolt_result::Result; +use revolt_result::{create_error, Result}; use rocket::serde::json::Json; use rocket::State; @@ -15,6 +15,10 @@ pub async fn unblock( mut user: User, target: Reference<'_>, ) -> Result> { + if user.bot.is_some() { + return Err(create_error!(IsBot)); + } + let mut target = target.as_user(db).await?; user.unblock_user(db, &mut target).await?;