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
5 changed files with 15 additions and 4 deletions

View File

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

View File

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

View File

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

View File

@ -1159,7 +1159,7 @@ describe Guardian do
PostDestroyer.new(moderator, topic.first_post).destroy PostDestroyer.new(moderator, topic.first_post).destroy
topic.first_post.user.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 end
end end
@ -1199,7 +1199,7 @@ describe Guardian do
PostDestroyer.new(moderator, post).destroy PostDestroyer.new(moderator, post).destroy
post.user.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 end
end end

View File

@ -180,6 +180,15 @@ describe PostDestroyer do
expect(post_action).to be_present expect(post_action).to be_present
end 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 describe "post_count recovery" do
before do before do
post post