From f15d463eb8a73edd180ec0d6f3eff15187eded51 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9gis=20Hanol?= <regis@hanol.fr>
Date: Fri, 18 Mar 2016 12:16:37 +0100
Subject: [PATCH] FIX: user 'UserBlocker' when blocking a new user

---
 app/models/queued_post.rb            | 4 +---
 app/services/spam_rule/auto_block.rb | 2 +-
 app/services/user_blocker.rb         | 4 ++--
 lib/new_post_manager.rb              | 9 +++------
 spec/services/auto_block_spec.rb     | 4 ++--
 5 files changed, 9 insertions(+), 14 deletions(-)

diff --git a/app/models/queued_post.rb b/app/models/queued_post.rb
index 66e75e960..9dd479a73 100644
--- a/app/models/queued_post.rb
+++ b/app/models/queued_post.rb
@@ -64,9 +64,7 @@ class QueuedPost < ActiveRecord::Base
     QueuedPost.transaction do
       change_to!(:approved, approved_by)
 
-      if user.blocked?
-        user.update_columns(blocked: false)
-      end
+      UserBlocker.unblock(user, approved_by) if user.blocked?
 
       creator = PostCreator.new(user, create_options.merge(skip_validations: true))
       created_post = creator.create
diff --git a/app/services/spam_rule/auto_block.rb b/app/services/spam_rule/auto_block.rb
index 8a6cea9f3..6c5d50187 100644
--- a/app/services/spam_rule/auto_block.rb
+++ b/app/services/spam_rule/auto_block.rb
@@ -38,7 +38,7 @@ class SpamRule::AutoBlock
 
   def block_user
     Post.transaction do
-      if UserBlocker.block(@user, nil, {message: :too_many_spam_flags}) and SiteSetting.notify_mods_when_user_blocked
+      if UserBlocker.block(@user, Discourse.system_user, message: :too_many_spam_flags) && SiteSetting.notify_mods_when_user_blocked
         GroupMessage.create(Group[:moderators].name, :user_automatically_blocked, {user: @user, limit_once_per: false})
       end
     end
diff --git a/app/services/user_blocker.rb b/app/services/user_blocker.rb
index 1ff9983b7..ee9ee1b68 100644
--- a/app/services/user_blocker.rb
+++ b/app/services/user_blocker.rb
@@ -27,8 +27,8 @@ class UserBlocker
 
   def hide_posts
     Post.where(user_id: @user.id).update_all(["hidden = true, hidden_reason_id = COALESCE(hidden_reason_id, ?)", Post.hidden_reasons[:new_user_spam_threshold_reached]])
-    topic_ids = Post.where('user_id = ? and post_number = ?', @user.id, 1).pluck(:topic_id)
-    Topic.where(id: topic_ids).update_all({ visible: false }) unless topic_ids.empty?
+    topic_ids = Post.where(user_id: @user.id, post_number: 1).pluck(:topic_id)
+    Topic.where(id: topic_ids).update_all(visible: false) unless topic_ids.empty?
   end
 
   def unblock
diff --git a/lib/new_post_manager.rb b/lib/new_post_manager.rb
index 923315d91..f354a277a 100644
--- a/lib/new_post_manager.rb
+++ b/lib/new_post_manager.rb
@@ -82,14 +82,11 @@ class NewPostManager
 
       result = manager.enqueue('default')
 
-      block = is_fast_typer?(manager)
-
-      block ||= matches_auto_block_regex?(manager)
-
-      manager.user.update_columns(blocked: true) if block
+      if is_fast_typer?(manager) || matches_auto_block_regex?(manager)
+        UserBlocker.block(manager.user, Discourse.system_user, keep_posts: true)
+      end
 
       result
-
     end
   end
 
diff --git a/spec/services/auto_block_spec.rb b/spec/services/auto_block_spec.rb
index dcecb04c8..d23738835 100644
--- a/spec/services/auto_block_spec.rb
+++ b/spec/services/auto_block_spec.rb
@@ -100,7 +100,7 @@ describe SpamRule::AutoBlock do
 
     context 'user is not blocked' do
       before do
-        UserBlocker.expects(:block).with(user, nil, has_entries(message: :too_many_spam_flags)).returns(true)
+        UserBlocker.expects(:block).with(user, Discourse.system_user, message: :too_many_spam_flags).returns(true)
       end
 
       it 'prevents the user from making new posts' do
@@ -126,7 +126,7 @@ describe SpamRule::AutoBlock do
 
     context 'user is already blocked' do
       before do
-        UserBlocker.expects(:block).with(user, nil, has_entries(message: :too_many_spam_flags)).returns(false)
+        UserBlocker.expects(:block).with(user, Discourse.system_user, message: :too_many_spam_flags).returns(false)
       end
 
       it "doesn't send a pm to moderators if the user is already blocked" do