这是 Granular group-based permissions for anonymous and logged in users 的配套主题,目前仍在完善中(WIP)。
在核心、插件和主题的各个代码库中,仍有一些地方直接引用了 everyone 或组 ID 0,而没有考虑即将进行的这项更改,或者没有使用 user.in_any_groups? 或用于处理此问题的各种 guardian 方法。
作为快速参考,以下是一些自动组 ID:
0-everyone1-admins2-moderators3-staff4-anonymous_users5-logged_in_users
随着我们接近稳定版本,此主题将作为跟踪该系统修复工作的中心位置。Discourse 客户的自定义插件和主题不在此处跟踪,我将为此维护一个内部列表。
高优先级问题
Moin 提出的问题:
- 核心
- About -
apply_excluded_groups仅用于隐藏about_page_hidden_groups中选定组的版主和管理员。像0|4|5这样的伪组在这里没有意义,它们应该被添加到disallowed_groups中。我们还需要更新设置描述,因为它具有误导性。 - EditCategoryTabsController - 在
_wouldLoseAccess中(discourse/frontend/discourse/admin/controllers/edit-category/tabs.js at 86552acfbaf816db3b9db5f761f5e9f2bd221c21 · discourse/discourse · GitHub ACL 的evaluate的服务端检查。
- About -
核心插件
- Discourse Templates
-
can_use_private_templates?仍然直接引用everyone,并且没有使用站点设置的_map简写。
-
- Discourse AI
-
- guardian 扩展中的
can_see_summary?没有使用user.in_any_groups?
- guardian 扩展中的
-
- AiBot::Playground 中的
can_attach?没有使用user.in_any_groups?
- AiBot::Playground 中的
-
ai-translation-topic-admin中的addTopicAdminMenuButton在客户端查看currentUser.groups,这并不可靠,改为对content_localization_allowed_groups进行服务端检查。
-
- Discourse Assign。这里有不少问题。
- 在
AssignmentPermissions中,我们应该使用user_ids_in_groups而不是user_ids_in_groups(注:原文此处重复,可能意指应使用特定的方法而非直接引用)。 assign_allowed_on_groups应该将0|4|5添加到disallowed_groups,这些在这里都没有意义,只有具体组才重要。
- 在
其他插件
- Activity Pub
- 移除
showStatusToUser中对user.groups和everyone的客户端检查。将activity_pub_post_status_visibility_groups的默认值更改为4|5。
- 移除
- Suggested Edits
user_in_suggested_edits_group?需要在GuardianExtensions中使用user.in_any_groups?。将1添加到suggested_edits_review_groups的mandatory_groups中,并移除can_review_suggested_edits_in_topic_list中的管理员特殊情况。- 将
0|4|5添加到suggested_edits_review_groups和suggested_edits_suggest_groups的disallowed_groups中,此设置并不打算与这些伪组一起使用。
- Resenha
- 移除
public_room_message_bus_targets中的untargetable_group_ids变通方法,因为这已在 FIX: Handle new pseudogroups in message bus group IDs (#42610) · discourse/discourse@699ad46 · GitHub 中得到解决。 - 将
resenha_allowed_groups的默认值从0更改为4|5。
- 移除
主题
组件
低优先级问题
- 核心
TopicGuardian中的is_in_edit_topic_groups应该使用站点设置的_map扩展。Roleable#whisperer?应该使用user.in_any_groups?并移除管理员检查,将1添加到whispers_allowed_groups设置的mandatory_values中。- 将
0|4添加到allow_solved_in_groups站点设置的disallowed_groups中,这只涉及私信(PMs)。 - 将
0|4|5添加到about_page_extra_groups的disallowed_groups中,这应该只处理关于页面上的具体组。 - 在
PresenceChannel的can_view?中注明,当即将进行的更改移至Permanent时,我们需要移除Group::AUTO_GROUPS[:everyone]检查。
核心插件
- Chat
- 在聊天自动加入/离开逻辑和
users_with_unreads中的everyone_allowed各处注明,当即将进行的更改移至Permanent时,需要移除:everyone检查。 - 更新
Chat::Publisher中的chat_allowed_group_ids以移除特殊伪组,因为在 FIX: Handle new pseudogroups in message bus group IDs - Pull Request #42610 - discourse/discourse - GitHub 中,MessageBus 现在可以正确处理伪组。
- 在聊天自动加入/离开逻辑和
- Assign
- 移除 plugin.rb 中的
add_model_callback(Group),它是无关/死代码,查看的是组名称而不是 ID。
- 移除 plugin.rb 中的
其他插件
- Code Review
code_review_allowed_groups上的can_review_code?检查没有使用_map扩展,也没有使用user.in_any_groups?。将1添加到该设置的mandatory_groups中,并移除 guardian 中的特殊管理员检查。将0|4|5添加到disallowed_groups中。
- Needs Love
needs_love_allowed_groups上的can_needs_love?检查没有使用_map扩展,也没有使用user.in_any_groups?。将1添加到该设置的mandatory_groups中,并移除 guardian 中的特殊管理员检查。将0|4|5添加到disallowed_groups中。
- Staff Alias
staff_alias_allowed_groups上的can_post_as_staff_alias检查没有使用_map扩展,也没有使用user.in_any_groups?。将0|4|5添加到disallowed_groups中。
主题
组件
迁移的下一步
待定(TBA)