通往稳定版,再到永久版的 granular_anonymous_and_logged_in_groups_permissions 之路

这是 Granular group-based permissions for anonymous and logged in users 的配套主题,目前仍在开发中(WIP)。


在核心、插件和主题的各个代码库中,仍有一些地方直接引用了 everyone 或组 ID (0),而没有考虑即将进行的这项更改,也没有使用 user.in_any_groups? 或用于处理此问题的各种 guardian 方法。

为方便快速参考,以下是一些自动组 ID:

  • 0 - everyone
  • 1 - admins
  • 2 - moderators
  • 3 - staff
  • 4 - anonymous_users
  • 5 - logged_in_users

本主题旨在作为一个中心位置,用于跟踪在我们接近稳定版本时对该系统的修复。Discourse 客户的自定义插件和主题不在此处跟踪,我内部会为此维护一个单独的列表。

高优先级问题

Moin 提出的问题:

核心插件

  • Discourse Templates
      • can_use_private_templates? 仍然直接引用 everyone,并且未在站点设置中使用 _map 简写。
  • Discourse AI
      • guardian 扩展中的 can_see_summary? 未使用 user.in_any_groups?
      • AiBot::Playground 中的 can_attach? 未使用 user.in_any_groups?
      • 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 应在 disallowed_groups 中添加 0|4|5,这些在此处都没有意义,只有具体组才重要。

其他插件

  • 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?。在 suggested_edits_review_groups 的 mandatory_groups 中添加 1,并在 can_review_suggested_edits_in_topic_list 中移除管理员的特殊情况处理
    • 在 suggested_edits_review_groups 和 suggested_edits_suggest_groups 的 disallowed_groups 中添加 0|4|5,该设置并不打算与这些伪组一起使用
  • Live

主题

组件

低优先级问题

  • 核心
    • TopicGuardian 中的 is_in_edit_topic_groups 应使用站点设置的 _map 扩展
    • Roleable#whisperer? 应使用 user.in_any_groups? 并移除管理员检查,在 whispers_allowed_groups 设置的 mandatory_values 中添加 1
    • 在 allow_solved_in_groups 站点设置的 disallowed_groups 中添加 0|4,该设置仅处理私信
    • 在 about_page_extra_groups 的 disallowed_groups 中添加 0|4|5,该设置旨在仅在关于页面处理具体组
    • 在 PresenceChannel 的 can_view? 中注明,当即将进行的更改移至 Permanent 时,我们需要移除 Group::AUTO_GROUPS[:everyone] 检查

核心插件

  • Chat
  • Assign
    • 移除 plugin.rb 中的 add_model_callback(Group),它是无关/死代码,因为它查看的是组名称而不是 ID

其他插件

  • Code Review
    • 对 code_review_allowed_groups 的 can_review_code? 检查未使用 _map 扩展,也未使用 user.in_any_groups?。在该设置的 mandatory_groups 中添加 1,并在 guardian 中移除特殊的管理员检查。在 disallowed_groups 中添加 0|4|5。
  • Needs Love
    • 对 needs_love_allowed_groups 的 can_needs_love? 检查未使用 _map 扩展,也未使用 user.in_any_groups?。在该设置的 mandatory_groups 中添加 1,并在 guardian 中移除特殊的管理员检查。在 disallowed_groups 中添加 0|4|5。
  • Staff Alias
    • 对 staff_alias_allowed_groups 的 can_post_as_staff_alias 检查未使用 _map 扩展,也未使用 user.in_any_groups?。在 disallowed_groups 中添加 0|4|5

主题

组件

迁移的后续步骤

  • 迁移 AiAgent 模型的 allowed_group_ids

已在此处完成 FIX: everyone pseudogroup roadmap part 1 - Pull Request #43798 - discourse/discourse - GitHub