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>
This commit is contained in:
Roman Rizzi 2020-04-01 09:20:45 -03:00 committed by GitHub
parent acc16dada3
commit b2f30aa0b5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 38 additions and 6 deletions

View File

@ -19,8 +19,6 @@ class SpamRule::FlagSockpuppets
def reply_is_from_sockpuppet?
return false if @post.try(:post_number) == 1
first_post = @post.topic.posts.by_post_number.first
return false if first_post.user.nil?
!first_post.user.staff? &&
@ -41,11 +39,22 @@ class SpamRule::FlagSockpuppets
locale: SiteSetting.default_locale
)
PostActionCreator.create(Discourse.system_user, @post, :spam, message: message)
flag_post(@post, message)
if (first_post = @post.topic.posts.by_post_number.first).try(:user).try(:new_user?)
PostActionCreator.create(Discourse.system_user, first_post, :spam, message: message)
end
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

View File

@ -150,5 +150,28 @@ describe SpamRule::FlagSockpuppets do
expect(PostAction.where(user: system, post: post2, post_action_type_id: spam).exists?).to eq(true)
expect(PostAction.where(user: system, post: post1, post_action_type_id: spam).exists?).to eq(false)
end
it "doesn't flag the first post if it was already rejected by staff before" do
flagged_post = Fabricate(
:reviewable_flagged_post,
target: post1, status: Reviewable.statuses[:rejected], target_created_by: post1.user
)
described_class.new(post2).perform
expect(flagged_post.reload.status).to eq(Reviewable.statuses[:rejected])
end
it "doesn't flag the post if another post of the same user was rejected by staff before" do
another_post = Fabricate(:post, user: user1)
flagged_post = Fabricate(
:reviewable_flagged_post,
target: another_post, status: Reviewable.statuses[:rejected], target_created_by: another_post.user
)
described_class.new(post2).perform
expect(ReviewableFlaggedPost.where(target_created_by: user1).count).to eq(1)
end
end
end