discourse/app/services/user_anonymizer.rb

68 lines
2.0 KiB
Ruby

class UserAnonymizer
def initialize(user, actor = nil)
@user = user
@actor = actor
end
def self.make_anonymous(user, actor = nil)
self.new(user, actor).make_anonymous
end
def make_anonymous
User.transaction do
prev_email = @user.email
prev_username = @user.username
if !UsernameChanger.change(@user, make_anon_username)
raise "Failed to change username"
end
@user.reload
@user.password = SecureRandom.hex
@user.email = "#{@user.username}@example.com"
@user.name = SiteSetting.full_name_required ? @user.username : nil
@user.date_of_birth = nil
@user.title = nil
@user.uploaded_avatar_id = nil
@user.save
options = @user.user_option
options.email_always = false
options.mailing_list_mode = false
options.email_digests = false
options.email_private_messages = false
options.email_direct = false
options.save
profile = @user.user_profile
profile.destroy if profile
@user.create_user_profile
@user.user_avatar.try(:destroy)
@user.twitter_user_info.try(:destroy)
@user.google_user_info.try(:destroy)
@user.github_user_info.try(:destroy)
@user.facebook_user_info.try(:destroy)
@user.single_sign_on_record.try(:destroy)
@user.oauth2_user_info.try(:destroy)
@user.user_open_ids.find_each { |x| x.destroy }
@user.api_key.try(:destroy)
UserHistory.create(action: UserHistory.actions[:anonymize_user],
target_user_id: @user.id,
acting_user_id: @actor ? @actor.id : @user.id,
email: prev_email,
details: "username: #{prev_username}")
end
@user
end
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?
end
raise "Failed to generate an anon username"
end
end