215 lines
6.2 KiB
Ruby
215 lines
6.2 KiB
Ruby
|
|
#!script/rails runner
|
||
|
|
# usage:
|
||
|
|
# bundle exec rails c
|
||
|
|
# load "#{Rails.root}/script/get_user_data.rb"
|
||
|
|
|
||
|
|
include Rails.application.routes.url_helpers
|
||
|
|
|
||
|
|
# Base URL
|
||
|
|
default_url_options[:host] = ArchiveConfig.APP_URL
|
||
|
|
|
||
|
|
# Prompt for the username
|
||
|
|
print "Enter username: "
|
||
|
|
login = gets.chomp.downcase
|
||
|
|
|
||
|
|
# Find the user
|
||
|
|
u = User.find_by(login: login)
|
||
|
|
|
||
|
|
# Names of user's favorite tags
|
||
|
|
favorite_tags = u.favorite_tags.joins(:tag).pluck(:name)
|
||
|
|
|
||
|
|
# URLs of all comments
|
||
|
|
comment_urls = []
|
||
|
|
u.comments.pluck(:id)&.map do |id|
|
||
|
|
comment_urls << comment_url(id)
|
||
|
|
end
|
||
|
|
|
||
|
|
# URLs of all works user has kudosed
|
||
|
|
# Kudos can only be on works now, but there is a pull request for admin posts
|
||
|
|
kudosed_item_urls = []
|
||
|
|
u.kudos.pluck(:commentable_type, :commentable_id)&.map do |type, id|
|
||
|
|
kudosed_item_urls << "#{ArchiveConfig.APP_URL}/#{type.underscore.downcase}s/#{id}"
|
||
|
|
end
|
||
|
|
|
||
|
|
# URLs of all nominations made in tag sets
|
||
|
|
tag_set_nomination_urls = []
|
||
|
|
TagSetNomination.where(pseud_id: u.pseuds.pluck(:id)).pluck(:id, :owned_tag_set_id)&.map do |id, tag_set_id|
|
||
|
|
tag_set_nomination_urls << tag_set_nomination_url(tag_set_id: tag_set_id, id: id)
|
||
|
|
end
|
||
|
|
|
||
|
|
# Name of user's Fannish Next of Kin
|
||
|
|
if u.fannish_next_of_kin
|
||
|
|
next_of_kin = User.find(u.fannish_next_of_kin.pluck(:user_id)).login
|
||
|
|
end
|
||
|
|
|
||
|
|
# Names of people listing user as their FNOK
|
||
|
|
next_of_kin_for = []
|
||
|
|
FannishNextOfKin.where(kin_id: u.id).pluck(:user_id)&.map do |id|
|
||
|
|
next_of_kin_for << User.find(id).login
|
||
|
|
end
|
||
|
|
|
||
|
|
# List of roles in collections
|
||
|
|
collection_roles = []
|
||
|
|
u.pseuds.each do |pseud|
|
||
|
|
pseud.collection_participants.pluck(:participant_role, :collection_id)&.map do |role, collection_id|
|
||
|
|
collection_roles << "Role of #{role} in #{collection_url(Collection.find(collection_id).name)}"
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
# List of IP addresses
|
||
|
|
# We handle IPs from the audits table below
|
||
|
|
ips = []
|
||
|
|
u.comments.pluck(:ip_address)&.map { |ip| ips << ip unless ip.blank? }
|
||
|
|
u.works.pluck(:ip_address)&.map { |ip| ips << ip unless ip.blank? }
|
||
|
|
|
||
|
|
# List of user agents
|
||
|
|
user_agents = []
|
||
|
|
u.comments.pluck(:user_agent)&.map { |ua| user_agents << ua unless ua.blank? }
|
||
|
|
|
||
|
|
# Lists of IP addresses and previous email addresses and usernames
|
||
|
|
# Actions that are or may be taken by admins, e.g. account activation, are
|
||
|
|
# excluded to avoid revealing admins' IP addresses
|
||
|
|
# We migrated to Devise on 27 December, 2018
|
||
|
|
previous_usernames = []
|
||
|
|
previous_emails = []
|
||
|
|
audits = u.audits.pluck(:action, :audited_changes, :remote_address)
|
||
|
|
audits.map do |audit|
|
||
|
|
action = audit[0]
|
||
|
|
changes = audit[1]
|
||
|
|
ip = audit[2]
|
||
|
|
# Created account
|
||
|
|
if action == "create"
|
||
|
|
ips << ip unless ip.blank?
|
||
|
|
# Other account changes
|
||
|
|
elsif action == "update"
|
||
|
|
changes.each do |k, v|
|
||
|
|
case k
|
||
|
|
when "accepted_tos_version"
|
||
|
|
ips << ip unless ip.blank?
|
||
|
|
# Changed email address
|
||
|
|
when "email"
|
||
|
|
ips << ip unless ip.blank?
|
||
|
|
previous_emails << v[0] unless v[0].blank?
|
||
|
|
# Changed password, post-Devise
|
||
|
|
when "encrypted_password"
|
||
|
|
ips << ip unless ip.blank?
|
||
|
|
# Failed login attempt, post-Devise
|
||
|
|
# This is currently only recorded after a password reset or after the
|
||
|
|
# account is locked and unlocked
|
||
|
|
when "failed_attempts"
|
||
|
|
ips << ip unless ip.blank?
|
||
|
|
# Failed login attempt, pre-Devise
|
||
|
|
when "failed_login_count"
|
||
|
|
ips << ip unless ip.blank?
|
||
|
|
# Failed login attempt that resulted in account being locked, post-Devise
|
||
|
|
when "locked_at"
|
||
|
|
ips << ip unless ip.blank?
|
||
|
|
# Changed username
|
||
|
|
when "login"
|
||
|
|
ips << ip unless ip.blank?
|
||
|
|
previous_usernames << v[0] unless v[0].blank?
|
||
|
|
# Requested password reset email, pre-Devise
|
||
|
|
when "recently_reset"
|
||
|
|
ips << ip unless ip.blank?
|
||
|
|
# Submitted login form with "Remember me" checked, post-Devise
|
||
|
|
# This is recorded whether the login attempt was successful or not
|
||
|
|
when "remember_created_at"
|
||
|
|
ips << ip unless ip.blank?
|
||
|
|
# Requested password reset email, post-Devise
|
||
|
|
when "reset_password_sent_at"
|
||
|
|
ips << ip unless ip.blank?
|
||
|
|
# Logged in, post-Devise
|
||
|
|
when "sign_in_count"
|
||
|
|
ips << ip unless ip.blank?
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
puts "Data for #{u.login} (#{u.email})"
|
||
|
|
unless previous_usernames.empty?
|
||
|
|
puts
|
||
|
|
puts "Previous Usernames: #{previous_usernames.to_sentence}"
|
||
|
|
end
|
||
|
|
unless previous_emails.empty?
|
||
|
|
puts
|
||
|
|
puts "Previous Email Addresses: #{previous_emails.to_sentence}"
|
||
|
|
end
|
||
|
|
unless ips.empty?
|
||
|
|
puts
|
||
|
|
puts "IP Addresses:"
|
||
|
|
ips.uniq.map do |ip|
|
||
|
|
puts " #{ip}"
|
||
|
|
end
|
||
|
|
end
|
||
|
|
unless user_agents.empty?
|
||
|
|
puts
|
||
|
|
puts "User Agents:"
|
||
|
|
user_agents.uniq.map do |user_agent|
|
||
|
|
puts " #{user_agent}"
|
||
|
|
end
|
||
|
|
end
|
||
|
|
if u.fannish_next_of_kin || !next_of_kin_for.empty?
|
||
|
|
puts
|
||
|
|
puts "Fannish Next of Kin: #{next_of_kin}" if u.fannish_next_of_kin
|
||
|
|
puts "Fannish Next of Kin For: #{next_of_kin_for.to_sentence}" unless next_of_kin_for.empty?
|
||
|
|
end
|
||
|
|
puts
|
||
|
|
puts "Pseuds: #{user_pseuds_url(u)}"
|
||
|
|
puts "Profile: #{user_profile_url(u)}"
|
||
|
|
puts "Preferences: #{user_preferences_url(u)}"
|
||
|
|
puts
|
||
|
|
puts "Works: #{user_works_url(u)}"
|
||
|
|
puts "Drafts: #{drafts_user_works_url(u)}"
|
||
|
|
puts "Series: #{user_series_index_url(u)}"
|
||
|
|
puts "Bookmarks: #{user_bookmarks_url(u)}"
|
||
|
|
puts
|
||
|
|
puts "Collections: #{user_collections_url(u)}"
|
||
|
|
unless collection_roles.empty?
|
||
|
|
puts "Collection Roles: "
|
||
|
|
collection_roles.map do |role|
|
||
|
|
puts " #{role}"
|
||
|
|
end
|
||
|
|
end
|
||
|
|
puts
|
||
|
|
puts "Tag Sets: #{user_tag_sets_url(u)}"
|
||
|
|
unless tag_set_nomination_urls.empty?
|
||
|
|
puts "Tag Set Nominations: "
|
||
|
|
tag_set_nomination_urls.map do |url|
|
||
|
|
puts " #{url}"
|
||
|
|
end
|
||
|
|
end
|
||
|
|
puts
|
||
|
|
puts "Challenge Sign-ups: #{user_signups_url(u)}"
|
||
|
|
puts "Gift Exchange Assignments: #{user_assignments_url(u)}"
|
||
|
|
puts "Prompt Meme Claims: #{user_claims_url(u)}"
|
||
|
|
puts
|
||
|
|
puts "History and Marked for Later: #{user_readings_url(u)}"
|
||
|
|
puts "Subscriptions: #{user_subscriptions_url(u)}"
|
||
|
|
puts
|
||
|
|
puts "Gifts: #{user_gifts_url(u)}"
|
||
|
|
puts "Related Works: #{user_related_works_url(u)}"
|
||
|
|
puts
|
||
|
|
puts "Skins: #{user_skins_url(u)}"
|
||
|
|
puts
|
||
|
|
puts "Invitations: #{user_invitations_url(u)}"
|
||
|
|
unless favorite_tags.empty?
|
||
|
|
puts
|
||
|
|
puts "Favorite Tags: #{favorite_tags.to_sentence}"
|
||
|
|
end
|
||
|
|
unless comment_urls.empty?
|
||
|
|
puts
|
||
|
|
puts "Comments Left: "
|
||
|
|
comment_urls.map do |url|
|
||
|
|
puts " #{url}"
|
||
|
|
end
|
||
|
|
end
|
||
|
|
unless kudosed_item_urls.empty?
|
||
|
|
puts
|
||
|
|
puts "Kudos Given To: "
|
||
|
|
kudosed_item_urls.map do |url|
|
||
|
|
puts " #{url}"
|
||
|
|
end
|
||
|
|
end
|