diff --git a/crates/common_enums/src/enums.rs b/crates/common_enums/src/enums.rs index 169b3fab12..ae2fb28aae 100644 --- a/crates/common_enums/src/enums.rs +++ b/crates/common_enums/src/enums.rs @@ -2329,6 +2329,7 @@ pub enum RoleScope { Debug, Eq, PartialEq, + Hash, serde::Serialize, serde::Deserialize, strum::Display, diff --git a/crates/router/src/utils/user_role.rs b/crates/router/src/utils/user_role.rs index a0ac140058..8c2c293da9 100644 --- a/crates/router/src/utils/user_role.rs +++ b/crates/router/src/utils/user_role.rs @@ -1,3 +1,5 @@ +use std::collections::HashSet; + use api_models::user_role as user_role_api; use common_enums::PermissionGroup; use diesel_models::user_role::UserRole; @@ -51,11 +53,18 @@ pub fn validate_role_groups(groups: &[PermissionGroup]) -> UserResult<()> { .attach_printable("Role groups cannot be empty"); } - if groups.contains(&PermissionGroup::OrganizationManage) { + let unique_groups: HashSet<_> = groups.iter().cloned().collect(); + + if unique_groups.contains(&PermissionGroup::OrganizationManage) { return Err(UserErrors::InvalidRoleOperation.into()) .attach_printable("Organization manage group cannot be added to role"); } + if unique_groups.len() != groups.len() { + return Err(UserErrors::InvalidRoleOperation.into()) + .attach_printable("Duplicate permission group found"); + } + Ok(()) }