102 lines
2.9 KiB
Ruby
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 |