此主题已关闭:
但在我们的安装版本(最新的 Discourse)中,TL3+ 用户仍然可以(或再次)进行此操作。
TL3 用户甚至可以在已锁定的帖子中修改原帖标题、分类和标签。
管理员锁定帖子:
TL3 用户仍然可以编辑/修改已锁定的帖子:
这是预期行为吗(希望不是),还是旧 bug 又出现在代码中了?
此主题已关闭:
但在我们的安装版本(最新的 Discourse)中,TL3+ 用户仍然可以(或再次)进行此操作。
TL3 用户甚至可以在已锁定的帖子中修改原帖标题、分类和标签。
管理员锁定帖子:
TL3 用户仍然可以编辑/修改已锁定的帖子:
这是预期行为吗(希望不是),还是旧 bug 又出现在代码中了?
如果我理解正确的话,这段代码至少是按“预期”工作的:
TL3 用户只有在话题已归档或为私信时,才无法编辑。
如果您想禁用此行为,可以修改 trusted_users_can_edit_others 设置。据我所知,trusted_users_can_edit_others 的默认值并非 false,这是为了与该设置引入之前的行为保持一致。
那么锁定帖子的目的是什么呢?似乎没有目的。或者我尚未找到任何目的,因此该功能要么已过时、无法正常工作,或者至少令人困惑。

文本明确写着“工作人员已锁定此帖子,禁止编辑”。如果锁定的目的与保护帖子/话题的原作者(OP)不被编辑完全不同,那么这段文字应该被修改。
锁定后的帖子不应允许非工作人员用户编辑,即使设置了高信任等级用户可以编辑帖子(我们通常支持这一设置,但对于锁定帖子当然例外)。
从下方的代码来看,目前“锁定”一个帖子仅意味着该帖子的原作者(OP)无法再编辑它。TL3、TL4(以及工作人员)仍然可以编辑锁定后的帖子(如果相关设置已启用)。
这极大地限制了锁定功能的使用场景,使其仅适用于极个别情况。
我该如何保护一条非常重要的官方管理员公告,防止某个不守规矩的 TL3 用户将其篡改为“这是一条米老鼠帖子”,错误地打标签并移动到不相关的分类中,同时仍希望 TL3/TL4 用户具备一般帖子的编辑能力?
“锁定”应意味着除工作人员外,所有人都无法编辑。
def can_edit_topic?(topic)
return false if Discourse.static_doc_topic_ids.include?(topic.id) && !is_admin?
return false unless can_see?(topic)
return true if is_admin?
return true if is_moderator? && can_create_post?(topic)
# 无法编辑安全分类中的话题,除非你有权在该分类创建话题
# 但有一个极小的边界情况:如果话题未分类,而你正尝试修复它,但未分类功能已禁用
if (
SiteSetting.allow_uncategorized_topics ||
topic.category_id != SiteSetting.uncategorized_category_id
)
return false if !can_create_topic_on_category?(topic.category)
end
# TL4 用户可以编辑已归档的话题,但不能编辑私信
return true if (
SiteSetting.trusted_users_can_edit_others? &&
topic.archived &&
!topic.private_message? &&
user.has_trust_level?(TrustLevel[4]) &&
can_create_post?(topic)
)
# TL3 用户不能编辑已归档的话题和私信
return true if (
SiteSetting.trusted_users_can_edit_others? &&
!topic.archived &&
!topic.private_message? &&
user.has_trust_level?(TrustLevel[3]) &&
can_create_post?(topic)
)
return false if topic.archived
is_my_own?(topic) &&
!topic.edit_time_limit_expired?(user) &&
**!Post.where(topic_id: topic.id, post_number: 1).where.not(locked_by_id: nil).exists**
end
这变得更加令人困惑……
“主题守护者”允许 TL3 和 TL4 用户编辑已锁定的主题/帖子(即第 1 号帖子),但“帖子守护者”(参见下方代码)却禁止 TL3 和 TL4 用户编辑已锁定的非首帖:
def can_edit_post?(post)
if Discourse.static_doc_topic_ids.include?(post.topic_id) && !is_admin?
return false
end
return true if is_admin?
# 必须为工作人员才能编辑已锁定的帖子
return false if post.locked? && !is_staff?
@eviltrout 这是否是预期行为?依我之见,更合理(且作为锁定功能更有价值)的做法是让“主题守护者”像“帖子守护者”尊重锁定状态那样运作。如前所述,我乐见 TL3 和 TL4 用户编辑未锁定的帖子,但不包括已锁定的帖子(含首帖)。
值得查看 rspec 文件。
我已经做了。但仅仅看看两个守卫处理锁定状态的方式有多么不同,本身就令人困惑。
处理方式应该像帖子守卫那样,即 # 必须是工作人员才能编辑已锁定的帖子。
我的意思是,目前非首帖的已锁定帖子确实是锁定的(TL3+ 用户无法编辑或修改),而已锁定的首帖(OP)却完全没被锁定(除了 OP 本人外,TL3+ 用户仍然可以编辑或修改)。这对我来说完全说不通,特别是因为 TL3 和 TL4 都没有锁定帖子或话题的权限。
鉴于此,已锁定的首帖也应真正禁止 TL3+ 用户编辑,即使设置允许他们编辑(未锁定的)帖子和话题。
这确实像是一个 bug @j.jaffeux —— 锁定的帖子除了工作人员外,任何人都应该无法编辑,否则还有什么意义呢?
感谢确认这一点 @codinghorror
是的,这是一个漏洞,两位守护者无论帖子位置和允许 TL3 和 TL4 编辑帖子的设置如何,都应该真正锁定帖子。我已经竭尽全力,详细解释了所有情况。
你能把这个分配给 @eviltrout 吗?我觉得当前的行为似乎不太对。
我在此处提交了一个拉取请求
已合并,关闭此主题。