FIX: When disagreeing with a flag that silenced a user, unsilence them

Previously it would unhide their post but leave them silenced.

This fix also cleans up some of the helper classes to make it easier
to pass extra data to the silencing code (for example, a link to the
post that caused the user to be silenced.)

This patch also refactors the auto_silence specs to avoid using
stubs.
This commit is contained in:
Robin Ward
2019-02-07 13:46:05 -05:00
parent 44d9bc12c9
commit bc3efab816
14 changed files with 186 additions and 174 deletions

View File

@@ -1,37 +1,38 @@
class SpamRule::AutoSilence
def initialize(user)
attr_reader :group_message
def initialize(user, post = nil)
@user = user
end
def self.silence?(user)
self.new(user).silence?
end
def self.punish!(user)
self.new(user).silence_user
@post = post
end
def perform
silence_user if silence?
I18n.with_locale(SiteSetting.default_locale) do
silence_user if should_autosilence?
end
end
def silence?
return true if @user.silenced?
def self.prevent_posting?(user)
user.blank? || user.silenced? || new(user).should_autosilence?
end
def should_autosilence?
return false if @user.blank?
return false if @user.staged?
return false if @user.has_trust_level?(TrustLevel[1])
if SiteSetting.num_spam_flags_to_silence_new_user > (0) &&
SiteSetting.num_users_to_silence_new_user > (0) &&
num_spam_flags_against_user >= (SiteSetting.num_spam_flags_to_silence_new_user) &&
num_users_who_flagged_spam_against_user >= (SiteSetting.num_users_to_silence_new_user)
if SiteSetting.num_spam_flags_to_silence_new_user > 0 &&
SiteSetting.num_users_to_silence_new_user > 0 &&
num_spam_flags_against_user >= SiteSetting.num_spam_flags_to_silence_new_user &&
num_users_who_flagged_spam_against_user >= SiteSetting.num_users_to_silence_new_user
return true
end
if SiteSetting.num_tl3_flags_to_silence_new_user > (0) &&
SiteSetting.num_tl3_users_to_silence_new_user > (0) &&
num_tl3_flags_against_user >= (SiteSetting.num_tl3_flags_to_silence_new_user) &&
num_tl3_users_who_flagged >= (SiteSetting.num_tl3_users_to_silence_new_user)
if SiteSetting.num_tl3_flags_to_silence_new_user > 0 &&
SiteSetting.num_tl3_users_to_silence_new_user > 0 &&
num_tl3_flags_against_user >= SiteSetting.num_tl3_flags_to_silence_new_user &&
num_tl3_users_who_flagged >= SiteSetting.num_tl3_users_to_silence_new_user
return true
end
@@ -72,8 +73,16 @@ class SpamRule::AutoSilence
def silence_user
Post.transaction do
if UserSilencer.silence(@user, Discourse.system_user, message: :too_many_spam_flags) && SiteSetting.notify_mods_when_user_silenced
GroupMessage.create(Group[:moderators].name, :user_automatically_silenced, user: @user, limit_once_per: false)
silencer = UserSilencer.new(
@user,
Discourse.system_user,
message: :too_many_spam_flags,
post_id: @post&.id
)
if silencer.silence && SiteSetting.notify_mods_when_user_silenced
@group_message = GroupMessage.create(Group[:moderators].name, :user_automatically_silenced, user: @user, limit_once_per: false)
end
end
end

View File

@@ -5,11 +5,13 @@ class SpamRule::FlagSockpuppets
end
def perform
if SiteSetting.flag_sockpuppets && reply_is_from_sockpuppet?
flag_sockpuppet_users
true
else
false
I18n.with_locale(SiteSetting.default_locale) do
if SiteSetting.flag_sockpuppets && reply_is_from_sockpuppet?
flag_sockpuppet_users
true
else
false
end
end
end