mirror of
https://github.com/discourse/discourse.git
synced 2026-08-04 10:39:43 +08:00
Followup 5823e4e3b2,
this commit allows the addition of users along with
groups to access control lists, modifying DAccessControl
to support selecting a user or group from the same
search input.
Shown here is a mix of user & group permissions in the
`DAccessControl` component:
<img width="611" height="664" alt="image"
src="https://github.com/user-attachments/assets/c25e13b0-8885-4ce7-972c-5116f3acb094"
/>
When the search opens, we show the site's groups that
the user can see as preloaded values, showing only the
group name for clarity:
<img width="612" height="389" alt="image"
src="https://github.com/user-attachments/assets/df93a94b-918e-4fed-b045-ac72f02aca41"
/>
When searching a GET request is sent and users are included
in search results.
<img width="608" height="404" alt="image"
src="https://github.com/user-attachments/assets/ff17e6c0-2505-480e-ae25-e6f8309555bc"
/>
---------
Co-authored-by: Jordan Vidrine <jordan@jordanvidrine.com>
70 lines
2.4 KiB
Ruby
Vendored
70 lines
2.4 KiB
Ruby
Vendored
# frozen_string_literal: true
|
|
module Acl
|
|
# This class is used to provide easy lookup methods for
|
|
# a single target's flattened ACL list, which consists
|
|
# of a mix of group and user IDs and their associated permissions,
|
|
# as an alternative to iterating through the flattened array.
|
|
class Target
|
|
attr_reader :group_lookup, :permission_lookup, :user_lookup
|
|
|
|
def initialize(flattened_acl_list)
|
|
@group_lookup = {}
|
|
@user_lookup = {}
|
|
@permission_lookup = {}
|
|
|
|
flattened_acl_list.each do |acl|
|
|
@permission_lookup[acl[:permission]] ||= { group_ids: [], user_ids: [] }
|
|
|
|
if acl[:type].to_sym == :group
|
|
@group_lookup[acl[:id]] ||= []
|
|
@group_lookup[acl[:id]] << acl[:permission]
|
|
|
|
@permission_lookup[acl[:permission]][:group_ids] << acl[:id]
|
|
end
|
|
|
|
if acl[:type].to_sym == :user
|
|
@user_lookup[acl[:id]] ||= []
|
|
@user_lookup[acl[:id]] << acl[:permission]
|
|
|
|
@permission_lookup[acl[:permission]][:user_ids] << acl[:id]
|
|
end
|
|
end
|
|
end
|
|
|
|
def group_has_permission?(group_or_id, permission)
|
|
@group_lookup[group_or_id.is_a?(Numeric) ? group_or_id : group_or_id&.id]&.include?(
|
|
permission,
|
|
)
|
|
end
|
|
|
|
def group_has_any_permission?(group_or_id, permissions)
|
|
group_permissions = @group_lookup[group_or_id.is_a?(Numeric) ? group_or_id : group_or_id&.id]
|
|
(group_permissions || []).any? { |permission| permissions.include?(permission) }
|
|
end
|
|
|
|
def permission_group_ids(permission)
|
|
((@permission_lookup[permission] || {}).dig(:group_ids) || []).dup
|
|
end
|
|
|
|
def group_ids_with_any_permission(permissions)
|
|
permissions.flat_map { |permission| permission_group_ids(permission) || [] }.uniq.dup
|
|
end
|
|
|
|
def user_has_permission?(user_or_id, permission)
|
|
@user_lookup[user_or_id.is_a?(Numeric) ? user_or_id : user_or_id&.id]&.include?(permission)
|
|
end
|
|
|
|
def user_has_any_permission?(user_or_id, permissions)
|
|
user_permissions = @user_lookup[user_or_id.is_a?(Numeric) ? user_or_id : user_or_id&.id]
|
|
(user_permissions || []).any? { |permission| permissions.include?(permission) }
|
|
end
|
|
|
|
def permission_user_ids(permission)
|
|
((@permission_lookup[permission] || {}).dig(:user_ids) || []).dup
|
|
end
|
|
|
|
def user_ids_with_any_permission(permissions)
|
|
permissions.flat_map { |permission| permission_user_ids(permission) || [] }.uniq.dup
|
|
end
|
|
end
|
|
end
|