discourse/app/services/spam_rule/flag_sockpuppets.rb
Roman Rizzi b2f30aa0b5
FIX: FlagSockpuppets should not flag a post if a post of that user was already rejected by staff (#9328)
* FIX: FlagSockpuppets should not flag a post if a post of that user was already rejected by staff

* Update spec/services/flag_sockpuppets_spec.rb

Co-Authored-By: Robin Ward <robin.ward@gmail.com>

Co-authored-by: Robin Ward <robin.ward@gmail.com>
2020-04-01 09:20:45 -03:00

61 lines
1.4 KiB
Ruby

# frozen_string_literal: true
class SpamRule::FlagSockpuppets
def initialize(post)
@post = post
end
def perform
I18n.with_locale(SiteSetting.default_locale) do
if SiteSetting.flag_sockpuppets && reply_is_from_sockpuppet?
flag_sockpuppet_users
true
else
false
end
end
end
def reply_is_from_sockpuppet?
return false if @post.try(:post_number) == 1
return false if first_post.user.nil?
!first_post.user.staff? &&
!@post.user.staff? &&
!first_post.user.staged? &&
!@post.user.staged? &&
@post.user != first_post.user &&
@post.user.ip_address == first_post.user.ip_address &&
@post.user.new_user? &&
!ScreenedIpAddress.is_whitelisted?(@post.user.ip_address)
end
def flag_sockpuppet_users
message = I18n.t(
'flag_reason.sockpuppet',
ip_address: @post.user.ip_address,
base_path: Discourse.base_path,
locale: SiteSetting.default_locale
)
flag_post(@post, message)
flag_post(first_post, message) if first_post&.user&.new_user?
end
private
def flag_post(post, message)
can_trust_user = ReviewableFlaggedPost.where(status: Reviewable.statuses[:rejected], target_created_by: post.user).exists?
return if can_trust_user
PostActionCreator.create(Discourse.system_user, post, :spam, message: message)
end
def first_post
@first_post ||= @post.topic.posts.by_post_number.first
end
end