2014-11-22 01:16:06 +08:00
|
|
|
require_dependency 'ip_addr'
|
|
|
|
|
2013-04-12 04:04:20 +08:00
|
|
|
# Responsible for destroying a User record
|
|
|
|
class UserDestroyer
|
|
|
|
|
|
|
|
class PostsExistError < RuntimeError; end
|
|
|
|
|
2014-02-14 00:42:35 +08:00
|
|
|
def initialize(actor)
|
|
|
|
@actor = actor
|
|
|
|
raise Discourse::InvalidParameters.new('acting user is nil') unless @actor and @actor.is_a?(User)
|
|
|
|
@guardian = Guardian.new(actor)
|
2013-04-12 04:04:20 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
# Returns false if the user failed to be deleted.
|
|
|
|
# Returns a frozen instance of the User if the delete succeeded.
|
2013-07-25 01:48:55 +08:00
|
|
|
def destroy(user, opts={})
|
2013-04-12 04:04:20 +08:00
|
|
|
raise Discourse::InvalidParameters.new('user is nil') unless user and user.is_a?(User)
|
2014-02-14 00:42:35 +08:00
|
|
|
@guardian.ensure_can_delete_user!(user)
|
2014-08-19 00:07:21 +08:00
|
|
|
raise PostsExistError if !opts[:delete_posts] && user.posts.count != 0
|
2014-10-20 22:59:06 +08:00
|
|
|
|
2013-04-15 23:39:30 +08:00
|
|
|
User.transaction do
|
2015-04-25 04:04:44 +08:00
|
|
|
|
2015-08-24 14:05:08 +08:00
|
|
|
Draft.where(user_id: user.id).delete_all
|
2015-04-25 04:04:44 +08:00
|
|
|
QueuedPost.where(user_id: user.id).delete_all
|
|
|
|
|
2013-07-25 01:48:55 +08:00
|
|
|
if opts[:delete_posts]
|
|
|
|
user.posts.each do |post|
|
2014-10-20 22:59:06 +08:00
|
|
|
# agree with flags
|
|
|
|
PostAction.agree_flags!(post, @actor) if opts[:delete_as_spammer]
|
|
|
|
|
|
|
|
# block all external urls
|
2013-08-14 23:05:53 +08:00
|
|
|
if opts[:block_urls]
|
|
|
|
post.topic_links.each do |link|
|
|
|
|
unless link.internal or Oneboxer.oneboxer_exists_for_url?(link.url)
|
2013-08-23 07:04:17 +08:00
|
|
|
ScreenedUrl.watch(link.url, link.domain, ip_address: user.ip_address).try(:record_match!)
|
2013-08-14 23:05:53 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2014-10-20 22:59:06 +08:00
|
|
|
|
2014-02-14 04:51:19 +08:00
|
|
|
PostDestroyer.new(@actor.staff? ? @actor : Discourse.system_user, post).destroy
|
2014-10-20 22:59:06 +08:00
|
|
|
|
2015-04-24 01:33:29 +08:00
|
|
|
if post.topic and post.is_first_post?
|
2013-09-05 03:35:10 +08:00
|
|
|
Topic.unscoped.where(id: post.topic.id).update_all(user_id: nil)
|
|
|
|
end
|
2013-07-25 01:48:55 +08:00
|
|
|
end
|
|
|
|
end
|
2014-10-20 22:59:06 +08:00
|
|
|
|
2014-04-01 02:06:25 +08:00
|
|
|
user.post_actions.each do |post_action|
|
|
|
|
post_action.remove_act!(Discourse.system_user)
|
|
|
|
end
|
2014-10-20 22:59:06 +08:00
|
|
|
|
2013-04-15 23:39:30 +08:00
|
|
|
user.destroy.tap do |u|
|
|
|
|
if u
|
2014-11-22 01:16:06 +08:00
|
|
|
|
2013-07-26 03:30:03 +08:00
|
|
|
if opts[:block_email]
|
2013-08-23 07:04:17 +08:00
|
|
|
b = ScreenedEmail.block(u.email, ip_address: u.ip_address)
|
2013-07-26 03:30:03 +08:00
|
|
|
b.record_match! if b
|
|
|
|
end
|
2014-11-22 01:16:06 +08:00
|
|
|
|
2014-04-30 02:37:56 +08:00
|
|
|
if opts[:block_ip] && u.ip_address
|
2014-11-22 01:16:06 +08:00
|
|
|
b = ScreenedIpAddress.watch(u.ip_address)
|
|
|
|
b.record_match! if b
|
2014-04-30 02:37:56 +08:00
|
|
|
if u.registration_ip_address && u.ip_address != u.registration_ip_address
|
2014-11-22 01:16:06 +08:00
|
|
|
b = ScreenedIpAddress.watch(u.registration_ip_address)
|
|
|
|
b.record_match! if b
|
2014-04-30 02:37:56 +08:00
|
|
|
end
|
2013-10-22 02:49:51 +08:00
|
|
|
end
|
2014-11-22 01:16:06 +08:00
|
|
|
|
2013-09-04 05:19:29 +08:00
|
|
|
Post.with_deleted.where(user_id: user.id).update_all("user_id = NULL")
|
2013-11-02 04:55:56 +08:00
|
|
|
|
|
|
|
# If this user created categories, fix those up:
|
2013-11-06 03:35:28 +08:00
|
|
|
categories = Category.where(user_id: user.id)
|
2013-11-02 04:55:56 +08:00
|
|
|
categories.each do |c|
|
|
|
|
c.user_id = Discourse.system_user.id
|
|
|
|
c.save!
|
2014-05-06 21:41:59 +08:00
|
|
|
if topic = Topic.with_deleted.find_by(id: c.topic_id)
|
2013-11-02 04:55:56 +08:00
|
|
|
topic.try(:recover!)
|
|
|
|
topic.user_id = Discourse.system_user.id
|
|
|
|
topic.save!
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2014-02-14 00:42:35 +08:00
|
|
|
StaffActionLogger.new(@actor == user ? Discourse.system_user : @actor).log_user_deletion(user, opts.slice(:context))
|
2015-05-04 10:21:00 +08:00
|
|
|
MessageBus.publish "/file-change", ["refresh"], user_ids: [user.id]
|
2013-04-15 23:39:30 +08:00
|
|
|
end
|
2013-04-12 04:04:20 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-11-06 03:35:28 +08:00
|
|
|
end
|