From a641b48884bd66fc8cac4476a69d7f93bf48f2c4 Mon Sep 17 00:00:00 2001 From: Matlink Date: Mon, 1 Jan 2024 15:46:03 +0100 Subject: [PATCH] Fix #3413: push to users accessing the collections using groups (#3757) * Fix #3413: push to users acessing the collections using groups * Notify groups only when enabled --- src/db/models/cipher.rs | 11 ++++++++++- src/db/models/organization.rs | 26 ++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/db/models/cipher.rs b/src/db/models/cipher.rs index bd3531a0..ec5c5d6a 100644 --- a/src/db/models/cipher.rs +++ b/src/db/models/cipher.rs @@ -273,7 +273,16 @@ impl Cipher { None => { // Belongs to Organization, need to update affected users if let Some(ref org_uuid) = self.organization_uuid { - for user_org in UserOrganization::find_by_cipher_and_org(&self.uuid, org_uuid, conn).await.iter() { + // users having access to the collection + let mut collection_users = + UserOrganization::find_by_cipher_and_org(&self.uuid, org_uuid, conn).await; + if CONFIG.org_groups_enabled() { + // members of a group having access to the collection + let group_users = + UserOrganization::find_by_cipher_and_org_with_group(&self.uuid, org_uuid, conn).await; + collection_users.extend(group_users); + } + for user_org in collection_users { User::update_uuid_revision(&user_org.user_uuid, conn).await; user_uuids.push(user_org.user_uuid.clone()) } diff --git a/src/db/models/organization.rs b/src/db/models/organization.rs index 9c908193..d78ac07c 100644 --- a/src/db/models/organization.rs +++ b/src/db/models/organization.rs @@ -768,6 +768,32 @@ impl UserOrganization { }} } + pub async fn find_by_cipher_and_org_with_group(cipher_uuid: &str, org_uuid: &str, conn: &mut DbConn) -> Vec { + db_run! { conn: { + users_organizations::table + .filter(users_organizations::org_uuid.eq(org_uuid)) + .inner_join(groups_users::table.on( + groups_users::users_organizations_uuid.eq(users_organizations::uuid) + )) + .left_join(collections_groups::table.on( + collections_groups::groups_uuid.eq(groups_users::groups_uuid) + )) + .left_join(groups::table.on(groups::uuid.eq(groups_users::groups_uuid))) + .left_join(ciphers_collections::table.on( + ciphers_collections::collection_uuid.eq(collections_groups::collections_uuid).and(ciphers_collections::cipher_uuid.eq(&cipher_uuid)) + + )) + .filter( + groups::access_all.eq(true).or( // AccessAll via groups + ciphers_collections::cipher_uuid.eq(&cipher_uuid) // ..or access to collection via group + ) + ) + .select(users_organizations::all_columns) + .distinct() + .load::(conn).expect("Error loading user organizations with groups").from_db() + }} + } + pub async fn user_has_ge_admin_access_to_cipher(user_uuid: &str, cipher_uuid: &str, conn: &mut DbConn) -> bool { db_run! { conn: { users_organizations::table