# Federated Computer, Inc. # David Sainty 2024 A.D. # Gossamer Threads to Discourse -- Reset Discourse Password and Clear Gossamer Password # v0.2 Full support require File.expand_path("../../../../config/environment", __FILE__) class GossamerResetPassword def reset_password(discourse_username, new_password) puts "Resetting password for Discourse username: '#{discourse_username}'" user = User.find_by(username: discourse_username) if user puts "New password: #{new_password} ..." # Delete Gossamer MD5 Password user.custom_fields.delete('md5_password') # This removes the field completely user.save! puts " STEP 1 COMPLETED: Gossamer MD5 Password custom field removed for username: #{discourse_username}" # Set the Discourse password with the `password=` method to properly hash the password user.password = new_password user.save! puts " STEP 2 COMPLETED: Discourse Password updated for username: #{discourse_username}" # Update other attributes (other than password which is already correct) user.active = true user.approved = true user.approved_at = Time.now user.approved_by_id = 1 user.save! puts " STEP 3 COMPLETED: Other attributes (active, approved, approved_at, approved_by_id) updated for username: #{discourse_username}" # Generate a new token, hash it, and create a confirmed email token for the user token = SecureRandom.hex(20) token_hash = EmailToken.hash_token(token) EmailToken.create!( user_id: user.id, email: user.email, token_hash: token_hash, confirmed: true ) puts " STEP 4 COMPLETED: New token generated, hashed and set as confirmed email token for username: #{discourse_username}" else puts "User not found: #{discourse_username}" end end end # Main execution if ARGV.length != 2 puts "Usage: #{$0} discourse_username n3w_p4ssword." exit 1 end discourse_username = ARGV[0] new_password = ARGV[1] # search_topic_by_title(search_string) GossamerResetPassword.new.reset_password(discourse_username, new_password)