one-click sign-up with autogenerated usernames
This commit is contained in:
parent
b8e6a01833
commit
71df2a12e1
7 changed files with 87 additions and 11 deletions
2
Gemfile
2
Gemfile
|
@ -158,3 +158,5 @@ gem 'concurrent-ruby', require: false
|
|||
gem 'connection_pool', require: false
|
||||
gem 'xorcist', '~> 1.1'
|
||||
gem 'cocoon', '~> 1.2'
|
||||
|
||||
gem 'random_name_generator'
|
||||
|
|
|
@ -549,6 +549,7 @@ GEM
|
|||
thor (~> 1.0)
|
||||
rainbow (3.1.1)
|
||||
rake (13.0.6)
|
||||
random_name_generator (2.0.1)
|
||||
rdf (3.2.9)
|
||||
link_header (~> 0.0, >= 0.0.8)
|
||||
rdf-normalize (0.5.1)
|
||||
|
@ -849,6 +850,7 @@ DEPENDENCIES
|
|||
rails-controller-testing (~> 1.0)
|
||||
rails-i18n (~> 6.0)
|
||||
rails-settings-cached (~> 0.6)
|
||||
random_name_generator
|
||||
rdf-normalize (~> 0.5)
|
||||
redcarpet (~> 3.6)
|
||||
redis (~> 4.5)
|
||||
|
@ -886,3 +888,9 @@ DEPENDENCIES
|
|||
webpacker (~> 5.4)
|
||||
webpush!
|
||||
xorcist (~> 1.1)
|
||||
|
||||
RUBY VERSION
|
||||
ruby 3.0.4p208
|
||||
|
||||
BUNDLED WITH
|
||||
2.2.33
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'random_name_generator'
|
||||
require 'securerandom'
|
||||
|
||||
class Auth::RegistrationsController < Devise::RegistrationsController
|
||||
include RegistrationSpamConcern
|
||||
|
||||
|
@ -45,6 +48,21 @@ class Auth::RegistrationsController < Devise::RegistrationsController
|
|||
end
|
||||
|
||||
def build_resource(hash = nil)
|
||||
|
||||
# hack to always use auto-generated usernames and passwords
|
||||
if !hash.nil?
|
||||
username = generate_name
|
||||
password = SecureRandom.hex
|
||||
|
||||
hash["account_attributes"] = {
|
||||
"username": username.parameterize(separator: '_'),
|
||||
"display_name": username
|
||||
}
|
||||
hash["email"] = "#{hash["account_attributes"]["username"]}@#{Rails.configuration.x.web_domain}"
|
||||
hash["password"] = password
|
||||
hash["password_confirmation"] = password
|
||||
end
|
||||
|
||||
super(hash)
|
||||
|
||||
resource.locale = I18n.locale
|
||||
|
@ -62,7 +80,9 @@ class Auth::RegistrationsController < Devise::RegistrationsController
|
|||
end
|
||||
|
||||
def after_sign_up_path_for(_resource)
|
||||
auth_setup_path
|
||||
# Hack to automatically visit the confirmation link after successful sign-up.
|
||||
# This way we can use the default configuration but still get away without an email server.
|
||||
"/auth/confirmation?confirmation_token=#{@user.confirmation_token}"
|
||||
end
|
||||
|
||||
def after_sign_in_path_for(_resource)
|
||||
|
@ -156,4 +176,11 @@ class Auth::RegistrationsController < Devise::RegistrationsController
|
|||
def set_cache_headers
|
||||
response.headers['Cache-Control'] = 'private, no-store'
|
||||
end
|
||||
|
||||
@@first_name_generator = RandomNameGenerator.new(File.new("#{File.dirname(__FILE__)}/roman.txt"))
|
||||
@@last_name_generator = RandomNameGenerator.new(RandomNameGenerator::FANTASY)
|
||||
|
||||
def generate_name
|
||||
"#{@@first_name_generator.compose(3)} #{@@last_name_generator.compose(2)}"
|
||||
end
|
||||
end
|
||||
|
|
44
app/controllers/auth/roman.txt
Normal file
44
app/controllers/auth/roman.txt
Normal file
|
@ -0,0 +1,44 @@
|
|||
-a
|
||||
-al
|
||||
-au +c
|
||||
-an
|
||||
-ba
|
||||
-be
|
||||
-bi
|
||||
-br +v
|
||||
-da
|
||||
-di
|
||||
-do
|
||||
-du
|
||||
-e
|
||||
-eu +c
|
||||
-fa
|
||||
bi
|
||||
be
|
||||
bo
|
||||
bu
|
||||
nul +v
|
||||
gu
|
||||
da
|
||||
au +c -c
|
||||
fri
|
||||
gus
|
||||
+tus
|
||||
+ta
|
||||
+lus
|
||||
+la
|
||||
+lius
|
||||
+lia
|
||||
+nus
|
||||
+na
|
||||
+es
|
||||
+ius -c
|
||||
+ia -c
|
||||
+cus
|
||||
+ca
|
||||
+tor
|
||||
+cio
|
||||
+cia
|
||||
+tin
|
||||
+tia
|
||||
+ssia -v
|
|
@ -16,14 +16,8 @@
|
|||
= render 'application/card', account: @invite.user.account
|
||||
|
||||
.fields-group
|
||||
= f.simple_fields_for :account do |ff|
|
||||
= ff.input :display_name, wrapper: :with_label, label: false, required: false, input_html: { 'aria-label': t('simple_form.labels.defaults.display_name'), autocomplete: 'off', placeholder: t('simple_form.labels.defaults.display_name') }
|
||||
= ff.input :username, wrapper: :with_label, label: false, required: true, input_html: { 'aria-label': t('simple_form.labels.defaults.username'), autocomplete: 'off', placeholder: t('simple_form.labels.defaults.username'), pattern: '[a-zA-Z0-9_]+', maxlength: 30 }, append: "@#{site_hostname}", hint: false
|
||||
= f.input :email, placeholder: t('simple_form.labels.defaults.email'), required: true, input_html: { 'aria-label': t('simple_form.labels.defaults.email'), autocomplete: 'username' }, hint: false
|
||||
= f.input :password, placeholder: t('simple_form.labels.defaults.password'), required: true, input_html: { 'aria-label': t('simple_form.labels.defaults.password'), autocomplete: 'new-password', minlength: User.password_length.first, maxlength: User.password_length.last }, hint: false
|
||||
= f.input :password_confirmation, placeholder: t('simple_form.labels.defaults.confirm_password'), required: true, input_html: { 'aria-label': t('simple_form.labels.defaults.confirm_password'), autocomplete: 'new-password' }, hint: false
|
||||
= f.input :confirm_password, as: :string, placeholder: t('simple_form.labels.defaults.honeypot', label: t('simple_form.labels.defaults.password')), required: false, input_html: { 'aria-label': t('simple_form.labels.defaults.honeypot', label: t('simple_form.labels.defaults.password')), autocomplete: 'off' }, hint: false
|
||||
= f.input :website, as: :url, wrapper: :with_label, label: t('simple_form.labels.defaults.honeypot', label: 'Website'), required: false, input_html: { 'aria-label': t('simple_form.labels.defaults.honeypot', label: 'Website'), autocomplete: 'off' }
|
||||
= f.input :confirm_password, as: :string, placeholder: t('simple_form.labels.defaults.honeypot', label: t('simple_form.labels.defaults.password')), required: false, input_html: { 'aria-label' => t('simple_form.labels.defaults.honeypot', label: t('simple_form.labels.defaults.password')), :autocomplete => 'off' }, hint: false
|
||||
= f.input :website, as: :url, wrapper: :with_label, label: t('simple_form.labels.defaults.honeypot', label: 'Website'), required: false, input_html: { 'aria-label' => t('simple_form.labels.defaults.honeypot', label: 'Website'), :autocomplete => 'off' }
|
||||
|
||||
- if approved_registrations? && !@invite.present?
|
||||
.fields-group
|
||||
|
|
|
@ -69,7 +69,8 @@ Rails.application.configure do
|
|||
# If using a Heroku, Vagrant or generic remote development environment,
|
||||
# use letter_opener_web, accessible at /letter_opener.
|
||||
# Otherwise, use letter_opener, which launches a browser window to view sent mail.
|
||||
config.action_mailer.delivery_method = (ENV['HEROKU'] || ENV['VAGRANT'] || ENV['REMOTE_DEV']) ? :letter_opener_web : :letter_opener
|
||||
# config.action_mailer.delivery_method = (ENV['HEROKU'] || ENV['VAGRANT'] || ENV['REMOTE_DEV']) ? :letter_opener_web : :letter_opener
|
||||
config.action_mailer.delivery_method = :file
|
||||
|
||||
config.after_initialize do
|
||||
Bullet.enable = true
|
||||
|
|
|
@ -120,7 +120,7 @@ Rails.application.configure do
|
|||
read_timeout: 20,
|
||||
}
|
||||
|
||||
config.action_mailer.delivery_method = ENV.fetch('SMTP_DELIVERY_METHOD', 'smtp').to_sym
|
||||
config.action_mailer.delivery_method = :file
|
||||
|
||||
config.action_dispatch.default_headers = {
|
||||
'Server' => 'Mastodon',
|
||||
|
|
Loading…
Reference in a new issue