Files
danbooru/app/logical/user_deletion.rb
evazion 53b761dfe9 user deletions: fix rename conflict logic.
Remove the 10-try limit when there's a name conflict during renaming. We
forgot to increment the loop counter so this did nothing. This wasn't
necessary anyway since the loop will always terminate eventually because
names have finite length.
2020-04-03 23:44:02 -05:00

69 lines
1.5 KiB
Ruby

class UserDeletion
class ValidationError < StandardError; end
attr_reader :user, :password
def initialize(user, password)
@user = user
@password = password
end
def delete!
validate
clear_user_settings
remove_favorites
clear_saved_searches
rename
reset_password
create_mod_action
end
private
def create_mod_action
ModAction.log("user ##{user.id} deleted", :user_delete)
end
def clear_saved_searches
SavedSearch.where(user_id: user.id).destroy_all
end
def clear_user_settings
user.email_address = nil
user.last_logged_in_at = nil
user.last_forum_read_at = nil
user.favorite_tags = ''
user.blacklisted_tags = ''
user.hide_deleted_posts = false
user.show_deleted_children = false
user.time_zone = "Eastern Time (US & Canada)"
user.save!
end
def reset_password
user.update!(password: SecureRandom.hex(16))
end
def remove_favorites
DeleteFavoritesJob.perform_later(user)
end
def rename
name = "user_#{user.id}"
name += "~" while User.exists?(name: name)
request = UserNameChangeRequest.new(user: user, desired_name: name, original_name: user.name)
request.save!(validate: false) # XXX don't validate so that the 1 name change per week rule doesn't interfere
end
def validate
if !user.authenticate_password(password)
raise ValidationError.new("Password is incorrect")
end
if user.level >= User::Levels::ADMIN
raise ValidationError.new("Admins cannot delete their account")
end
end
end