用户名中的大写字母导致编辑器中可达提及检查失效

在调查 Private Topics Plugin - #109 by thoka 时,我发现:如果用户名包含大写字母,在受限分类中提及该用户时不会被报告。

如果我提及 @SomeUser,编辑器会请求
/composer/mentions.json?names[]=SomeUser&topic_id=10728
在返回结果中,用户名以小写形式返回,且未设置 user_reasons

使用小写字母查询该用户名时,会返回 "user_reasons": {"someuser":"category"}

如果在编辑器中使用小写字母输入用户名,则会向权限不足的用户显示警告。

如果使用编辑器提供的自动补全功能,输入的小写用户名会被替换为大写形式,因此不会被报告。

2 个赞

找得好 @thoka

问题出在这里

users 返回的是 {"username_lower" => User 对象}

但如果 name 没有转换为小写,users[name] 就不存在。

修复方法:

if user = users[name.downcase]
...
elsif group = groups[name.downcase]
...

或者更好的做法:在方法开始时将所有名称统一转换为小写,因为该方法中存在不少问题。groups 已经很好地处理了 where("lower(name) IN (?)", @names.map(&:downcase)),但像 visible_group_ids_for_allowed_checktopic_allowed_group_idsmentionable_group_idsmembers_visible_group_ids 这样的函数都使用了 where(name: @names),这同样会引入大小写敏感的问题。

3 个赞