FIX: Recovered posts with no user will be taken over by system user (#8834)

This commit is contained in:
Dan Ungureanu 2020-02-06 10:19:04 +02:00 committed by GitHub
parent 8ca9ad887d
commit c5e3faac00
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 15 additions and 4 deletions

View File

@ -187,7 +187,7 @@ module PostGuardian
# Recovery Method
def can_recover_post?(post)
if is_staff?
post.deleted_at && post.user
!!post.deleted_at
else
is_my_own?(post) && post.user_deleted && !post.deleted_at
end

View File

@ -113,7 +113,7 @@ module TopicGuardian
# Recovery Method
def can_recover_topic?(topic)
if is_staff?
!!(topic && topic.deleted_at && topic.user)
!!(topic && topic.deleted_at)
else
topic && can_recover_post?(topic.ordered_posts.first)
end

View File

@ -91,6 +91,7 @@ class PostDestroyer
user_recovered
end
topic = Topic.with_deleted.find @post.topic_id
topic.update_column(:user_id, Discourse::SYSTEM_USER_ID) if !topic.user_id
topic.recover!(@user) if @post.is_first_post?
topic.update_statistics
UserActionManager.post_created(@post)
@ -103,6 +104,7 @@ class PostDestroyer
end
def staff_recovered
@post.update_column(:user_id, Discourse::SYSTEM_USER_ID) if !@post.user_id
@post.recover!
mark_topic_changed

View File

@ -1159,7 +1159,7 @@ describe Guardian do
PostDestroyer.new(moderator, topic.first_post).destroy
topic.first_post.user.destroy!
expect(Guardian.new(moderator).can_recover_topic?(topic.reload)).to be_falsey
expect(Guardian.new(moderator).can_recover_topic?(topic.reload)).to be_truthy
end
end
end
@ -1199,7 +1199,7 @@ describe Guardian do
PostDestroyer.new(moderator, post).destroy
post.user.destroy!
expect(Guardian.new(moderator).can_recover_post?(post.reload)).to be_falsey
expect(Guardian.new(moderator).can_recover_post?(post.reload)).to be_truthy
end
end
end

View File

@ -180,6 +180,15 @@ describe PostDestroyer do
expect(post_action).to be_present
end
it "works with topics and posts with no user" do
post = Fabricate(:post)
UserDestroyer.new(Discourse.system_user).destroy(post.user, delete_posts: true)
expect { PostDestroyer.new(Fabricate(:admin), post.reload).recover }
.to change { post.reload.user_id }.to(Discourse.system_user.id)
.and change { post.topic.user_id }.to(Discourse.system_user.id)
end
describe "post_count recovery" do
before do
post