Files
baffle-hub/lib/tasks/users.rake

102 lines
2.9 KiB
Ruby

namespace :users do
desc "Reset password for a user"
task reset_password: :environment do
email = ENV['EMAIL']
new_password = ENV['PASSWORD']
if email.blank?
puts "Usage: EMAIL=user@example.com PASSWORD=newpassword rails users:reset_password"
exit 1
end
user = User.find_by(email_address: email)
if user.nil?
puts "Error: User with email '#{email}' not found."
exit 1
end
if new_password.blank?
puts "Error: PASSWORD environment variable is required."
exit 1
end
if user.password_digest.blank?
puts "Warning: User appears to be an OIDC user (no password set)."
print "Do you want to set a local password for this OIDC user? (y/N): "
response = STDIN.gets.chomp.downcase
unless response == 'y' || response == 'yes'
puts "Password reset cancelled."
exit 0
end
end
user.password = new_password
user.password_confirmation = new_password
if user.save
# Destroy all sessions to force re-login
user.sessions.destroy_all
puts "✅ Password successfully updated for #{user.email_address}"
puts " User: #{user.email_address} (#{user.role})"
puts " All existing sessions have been terminated."
puts " User will need to log in with the new password."
else
puts "❌ Failed to update password:"
user.errors.full_messages.each { |msg| puts " - #{msg}" }
exit 1
end
end
desc "List all users"
task list: :environment do
users = User.order(:role, :email_address)
puts "Users (#{users.count}):"
puts "=" * 60
users.each do |user|
has_password = user.password_digest.present? ? "local" : "OIDC"
last_login = user.sessions.maximum(:created_at)
puts "📧 #{user.email_address}"
puts " Role: #{user.role} | Auth: #{has_password}"
puts " Last login: #{last_login ? last_login.strftime('%Y-%m-%d %H:%M') : 'Never'}"
puts " Active sessions: #{user.sessions.count}"
puts
end
end
desc "Create admin user (only if no users exist)"
task create_admin: :environment do
if User.any?
puts "❌ Users already exist. Admin creation is disabled."
puts " Use 'rails users:reset_password' to reset an existing user's password."
exit 1
end
email = ENV['EMAIL']
password = ENV['PASSWORD']
if email.blank? || password.blank?
puts "Usage: EMAIL=admin@example.com PASSWORD=securepassword rails users:create_admin"
exit 1
end
user = User.new(
email_address: email,
password: password,
password_confirmation: password
)
if user.save
puts "✅ Admin user created successfully:"
puts " Email: #{user.email_address}"
puts " Role: #{user.role}"
puts " You can now log in to the application."
else
puts "❌ Failed to create admin user:"
user.errors.full_messages.each { |msg| puts " - #{msg}" }
exit 1
end
end
end