mirror of
https://github.com/discourse/discourse.git
synced 2025-05-24 01:03:41 +08:00
FIX: Don't enqueue posts if the user can't create them (ex: closed)
This commit is contained in:
@ -20,6 +20,7 @@ module TopicGuardian
|
|||||||
|
|
||||||
def can_create_post_on_topic?(topic)
|
def can_create_post_on_topic?(topic)
|
||||||
# No users can create posts on deleted topics
|
# No users can create posts on deleted topics
|
||||||
|
return false if topic.blank?
|
||||||
return false if topic.trashed?
|
return false if topic.trashed?
|
||||||
return true if is_admin?
|
return true if is_admin?
|
||||||
|
|
||||||
|
@ -80,6 +80,17 @@ class NewPostManager
|
|||||||
def self.default_handler(manager)
|
def self.default_handler(manager)
|
||||||
if user_needs_approval?(manager)
|
if user_needs_approval?(manager)
|
||||||
|
|
||||||
|
# Can the user create the post in the first place?
|
||||||
|
if manager.args[:topic_id]
|
||||||
|
topic = Topic.unscoped.where(id: manager.args[:topic_id]).first
|
||||||
|
|
||||||
|
unless manager.user.guardian.can_create_post_on_topic?(topic)
|
||||||
|
result = NewPostResult.new(:created_post, false)
|
||||||
|
result.errors[:base] << I18n.t(:topic_not_found)
|
||||||
|
return result
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
result = manager.enqueue('default')
|
result = manager.enqueue('default')
|
||||||
|
|
||||||
if is_fast_typer?(manager) || matches_auto_block_regex?(manager)
|
if is_fast_typer?(manager) || matches_auto_block_regex?(manager)
|
||||||
|
@ -233,16 +233,16 @@ describe NewPostManager do
|
|||||||
default = NewPostManager.new(u,{})
|
default = NewPostManager.new(u,{})
|
||||||
expect(NewPostManager.user_needs_approval?(default)).to eq(false)
|
expect(NewPostManager.user_needs_approval?(default)).to eq(false)
|
||||||
|
|
||||||
with_check = NewPostManager.new(u,{first_post_checks: true})
|
with_check = NewPostManager.new(u, first_post_checks: true)
|
||||||
expect(NewPostManager.user_needs_approval?(with_check)).to eq(true)
|
expect(NewPostManager.user_needs_approval?(with_check)).to eq(true)
|
||||||
|
|
||||||
u.user_stat.post_count = 1
|
u.user_stat.post_count = 1
|
||||||
with_check_and_post = NewPostManager.new(u,{first_post_checks: true})
|
with_check_and_post = NewPostManager.new(u, first_post_checks: true)
|
||||||
expect(NewPostManager.user_needs_approval?(with_check_and_post)).to eq(false)
|
expect(NewPostManager.user_needs_approval?(with_check_and_post)).to eq(false)
|
||||||
|
|
||||||
u.user_stat.post_count = 0
|
u.user_stat.post_count = 0
|
||||||
u.trust_level = 1
|
u.trust_level = 1
|
||||||
with_check_tl1 = NewPostManager.new(u,{first_post_checks: true})
|
with_check_tl1 = NewPostManager.new(u, first_post_checks: true)
|
||||||
expect(NewPostManager.user_needs_approval?(with_check_tl1)).to eq(false)
|
expect(NewPostManager.user_needs_approval?(with_check_tl1)).to eq(false)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -584,7 +584,6 @@ describe PostsController do
|
|||||||
end
|
end
|
||||||
|
|
||||||
it 'queues the post if min_first_post_typing_time is not met' do
|
it 'queues the post if min_first_post_typing_time is not met' do
|
||||||
|
|
||||||
SiteSetting.min_first_post_typing_time = 3000
|
SiteSetting.min_first_post_typing_time = 3000
|
||||||
# our logged on user here is tl1
|
# our logged on user here is tl1
|
||||||
SiteSetting.auto_block_fast_typers_max_trust_level = 1
|
SiteSetting.auto_block_fast_typers_max_trust_level = 1
|
||||||
@ -606,7 +605,23 @@ describe PostsController do
|
|||||||
|
|
||||||
user.reload
|
user.reload
|
||||||
expect(user.blocked).to eq(false)
|
expect(user.blocked).to eq(false)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "doesn't enqueue replies when the topic is closed" do
|
||||||
|
SiteSetting.min_first_post_typing_time = 3000
|
||||||
|
SiteSetting.auto_block_fast_typers_max_trust_level = 1
|
||||||
|
|
||||||
|
topic = Fabricate(:closed_topic)
|
||||||
|
|
||||||
|
xhr :post, :create, {
|
||||||
|
raw: 'this is the test content',
|
||||||
|
title: 'this is the test title for the topic',
|
||||||
|
topic_id: topic.id
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(response).not_to be_success
|
||||||
|
parsed = ::JSON.parse(response.body)
|
||||||
|
expect(parsed["action"]).not_to eq("enqueued")
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'blocks correctly based on auto_block_first_post_regex' do
|
it 'blocks correctly based on auto_block_first_post_regex' do
|
||||||
|
@ -8,6 +8,10 @@ Fabricator(:deleted_topic, from: :topic) do
|
|||||||
deleted_at Time.now
|
deleted_at Time.now
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Fabricator(:closed_topic, from: :topic) do
|
||||||
|
closed true
|
||||||
|
end
|
||||||
|
|
||||||
Fabricator(:topic_allowed_user) do
|
Fabricator(:topic_allowed_user) do
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user