chore: Enforce custom role permissions on conversation access (#12583)
## Summary - ensure conversation lookup uses the permission filter before fetching records - add request specs covering custom role access to unassigned conversations ## Testing - bundle exec rspec spec/enterprise/controllers/api/v1/accounts/conversations_controller_spec.rb ------ https://chatgpt.com/codex/tasks/task_e_68de1f62b9b883268a54882e608a8bb8
This commit is contained in:
42
enterprise/app/policies/enterprise/conversation_policy.rb
Normal file
42
enterprise/app/policies/enterprise/conversation_policy.rb
Normal file
@@ -0,0 +1,42 @@
|
||||
module Enterprise::ConversationPolicy
|
||||
def show?
|
||||
return false unless super
|
||||
return true unless custom_role_permissions?
|
||||
|
||||
permissions = custom_role_permissions
|
||||
return true if manage_all_conversations?(permissions)
|
||||
return true if permits_unassigned_manage?(permissions)
|
||||
|
||||
permits_participating?(permissions)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def manage_all_conversations?(permissions)
|
||||
permissions.include?('conversation_manage')
|
||||
end
|
||||
|
||||
def permits_unassigned_manage?(permissions)
|
||||
return false unless permissions.include?('conversation_unassigned_manage')
|
||||
|
||||
unassigned_conversation? || assigned_to_user?
|
||||
end
|
||||
|
||||
def permits_participating?(permissions)
|
||||
return false unless permissions.include?('conversation_participating_manage')
|
||||
|
||||
assigned_to_user? || participant?
|
||||
end
|
||||
|
||||
def unassigned_conversation?
|
||||
record.assignee_id.nil?
|
||||
end
|
||||
|
||||
def custom_role_permissions?
|
||||
account_user&.custom_role_id.present?
|
||||
end
|
||||
|
||||
def custom_role_permissions
|
||||
account_user&.custom_role&.permissions || []
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user