2019-05-03 06:17:27 +08:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2015-03-07 05:44:54 +08:00
|
|
|
class UserAnonymizer
|
2018-03-06 03:38:18 +08:00
|
|
|
|
|
|
|
attr_reader :user_history
|
|
|
|
|
2018-05-01 01:42:51 +08:00
|
|
|
# opts:
|
|
|
|
# anonymize_ip - an optional new IP to update their logs with
|
|
|
|
def initialize(user, actor = nil, opts = nil)
|
2015-03-07 05:44:54 +08:00
|
|
|
@user = user
|
|
|
|
@actor = actor
|
2018-03-06 03:38:18 +08:00
|
|
|
@user_history = nil
|
2018-05-01 01:42:51 +08:00
|
|
|
@opts = opts || {}
|
2015-03-07 05:44:54 +08:00
|
|
|
end
|
|
|
|
|
2018-05-01 01:42:51 +08:00
|
|
|
def self.make_anonymous(user, actor = nil, opts = nil)
|
|
|
|
self.new(user, actor, opts).make_anonymous
|
2015-03-07 05:44:54 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
def make_anonymous
|
|
|
|
User.transaction do
|
2018-05-01 01:42:51 +08:00
|
|
|
@prev_email = @user.email
|
|
|
|
@prev_username = @user.username
|
2015-03-07 05:44:54 +08:00
|
|
|
|
2018-06-08 20:31:15 +08:00
|
|
|
unless UsernameChanger.new(@user, make_anon_username).change(run_update_job: false)
|
|
|
|
raise "Failed to change username"
|
|
|
|
end
|
2015-03-07 05:44:54 +08:00
|
|
|
|
|
|
|
@user.reload
|
|
|
|
@user.password = SecureRandom.hex
|
2016-03-17 14:43:21 +08:00
|
|
|
@user.name = SiteSetting.full_name_required ? @user.username : nil
|
2015-03-07 05:44:54 +08:00
|
|
|
@user.date_of_birth = nil
|
|
|
|
@user.title = nil
|
2018-06-08 20:31:15 +08:00
|
|
|
@user.uploaded_avatar_id = nil
|
2018-05-01 01:42:51 +08:00
|
|
|
|
2018-06-07 21:59:51 +08:00
|
|
|
if @opts.has_key?(:anonymize_ip)
|
|
|
|
@user.ip_address = @opts[:anonymize_ip]
|
|
|
|
@user.registration_ip_address = @opts[:anonymize_ip]
|
|
|
|
end
|
2018-05-01 01:42:51 +08:00
|
|
|
|
2019-01-30 22:14:36 +08:00
|
|
|
@user.save!
|
|
|
|
@user.primary_email.update_attribute(:email, "#{@user.username}@anonymized.invalid")
|
2015-03-07 05:44:54 +08:00
|
|
|
|
2016-02-17 12:46:19 +08:00
|
|
|
options = @user.user_option
|
|
|
|
options.mailing_list_mode = false
|
|
|
|
options.email_digests = false
|
2019-03-15 22:55:11 +08:00
|
|
|
options.email_level = UserOption.email_level_types[:never]
|
|
|
|
options.email_messages_level = UserOption.email_level_types[:never]
|
2019-01-30 22:14:36 +08:00
|
|
|
options.save!
|
2016-02-17 12:46:19 +08:00
|
|
|
|
2018-06-08 21:24:15 +08:00
|
|
|
if profile = @user.user_profile
|
2019-04-29 11:58:52 +08:00
|
|
|
profile.update!(
|
|
|
|
location: nil,
|
|
|
|
website: nil,
|
|
|
|
bio_raw: nil,
|
|
|
|
bio_cooked: nil,
|
|
|
|
profile_background_upload: nil,
|
|
|
|
card_background_upload: nil
|
|
|
|
)
|
2018-06-08 21:24:15 +08:00
|
|
|
end
|
2015-03-07 05:44:54 +08:00
|
|
|
|
|
|
|
@user.user_avatar.try(:destroy)
|
|
|
|
@user.github_user_info.try(:destroy)
|
|
|
|
@user.single_sign_on_record.try(:destroy)
|
2018-07-23 23:51:57 +08:00
|
|
|
@user.oauth2_user_infos.try(:destroy_all)
|
2018-11-28 23:49:24 +08:00
|
|
|
@user.user_associated_accounts.try(:destroy_all)
|
2018-03-01 19:10:27 +08:00
|
|
|
@user.instagram_user_info.try(:destroy)
|
2015-03-07 05:44:54 +08:00
|
|
|
@user.user_open_ids.find_each { |x| x.destroy }
|
2019-11-05 22:10:23 +08:00
|
|
|
@user.api_keys.find_each { |x| x.try(:destroy) }
|
2019-01-30 22:14:36 +08:00
|
|
|
@user.user_emails.secondary.destroy_all
|
2015-03-07 05:44:54 +08:00
|
|
|
|
2018-06-07 21:59:51 +08:00
|
|
|
@user_history = log_action
|
2015-03-07 05:44:54 +08:00
|
|
|
end
|
2018-05-03 00:25:06 +08:00
|
|
|
|
2018-06-08 20:31:15 +08:00
|
|
|
UsernameChanger.update_username(user_id: @user.id,
|
|
|
|
old_username: @prev_username,
|
|
|
|
new_username: @user.username,
|
|
|
|
avatar_template: @user.avatar_template)
|
|
|
|
|
2018-06-07 21:59:51 +08:00
|
|
|
Jobs.enqueue(:anonymize_user,
|
|
|
|
user_id: @user.id,
|
|
|
|
prev_email: @prev_email,
|
|
|
|
anonymize_ip: @opts[:anonymize_ip])
|
|
|
|
|
2018-05-03 00:25:06 +08:00
|
|
|
DiscourseEvent.trigger(:user_anonymized, user: @user, opts: @opts)
|
2015-03-07 05:44:54 +08:00
|
|
|
@user
|
|
|
|
end
|
|
|
|
|
2018-05-01 01:42:51 +08:00
|
|
|
private
|
|
|
|
|
2018-06-07 13:28:18 +08:00
|
|
|
def make_anon_username
|
|
|
|
100.times do
|
|
|
|
new_username = "anon#{(SecureRandom.random_number * 100000000).to_i}"
|
|
|
|
return new_username unless User.where(username_lower: new_username).exists?
|
2015-03-07 05:44:54 +08:00
|
|
|
end
|
2018-06-07 13:28:18 +08:00
|
|
|
raise "Failed to generate an anon username"
|
|
|
|
end
|
2018-05-01 01:42:51 +08:00
|
|
|
|
2018-06-07 21:59:51 +08:00
|
|
|
def log_action
|
|
|
|
history_details = {
|
|
|
|
action: UserHistory.actions[:anonymize_user],
|
|
|
|
target_user_id: @user.id,
|
|
|
|
acting_user_id: @actor ? @actor.id : @user.id,
|
|
|
|
}
|
2018-05-01 01:42:51 +08:00
|
|
|
|
2018-06-07 21:59:51 +08:00
|
|
|
if SiteSetting.log_anonymizer_details?
|
|
|
|
history_details[:email] = @prev_email
|
|
|
|
history_details[:details] = "username: #{@prev_username}"
|
|
|
|
end
|
2018-05-01 01:42:51 +08:00
|
|
|
|
2019-01-30 22:14:36 +08:00
|
|
|
UserHistory.create!(history_details)
|
2018-05-01 01:42:51 +08:00
|
|
|
end
|
2015-03-07 05:44:54 +08:00
|
|
|
end
|