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 'connection_pool', require: false
|
||||||
gem 'xorcist', '~> 1.1'
|
gem 'xorcist', '~> 1.1'
|
||||||
gem 'cocoon', '~> 1.2'
|
gem 'cocoon', '~> 1.2'
|
||||||
|
|
||||||
|
gem 'random_name_generator'
|
||||||
|
|
|
@ -549,6 +549,7 @@ GEM
|
||||||
thor (~> 1.0)
|
thor (~> 1.0)
|
||||||
rainbow (3.1.1)
|
rainbow (3.1.1)
|
||||||
rake (13.0.6)
|
rake (13.0.6)
|
||||||
|
random_name_generator (2.0.1)
|
||||||
rdf (3.2.9)
|
rdf (3.2.9)
|
||||||
link_header (~> 0.0, >= 0.0.8)
|
link_header (~> 0.0, >= 0.0.8)
|
||||||
rdf-normalize (0.5.1)
|
rdf-normalize (0.5.1)
|
||||||
|
@ -849,6 +850,7 @@ DEPENDENCIES
|
||||||
rails-controller-testing (~> 1.0)
|
rails-controller-testing (~> 1.0)
|
||||||
rails-i18n (~> 6.0)
|
rails-i18n (~> 6.0)
|
||||||
rails-settings-cached (~> 0.6)
|
rails-settings-cached (~> 0.6)
|
||||||
|
random_name_generator
|
||||||
rdf-normalize (~> 0.5)
|
rdf-normalize (~> 0.5)
|
||||||
redcarpet (~> 3.6)
|
redcarpet (~> 3.6)
|
||||||
redis (~> 4.5)
|
redis (~> 4.5)
|
||||||
|
@ -886,3 +888,9 @@ DEPENDENCIES
|
||||||
webpacker (~> 5.4)
|
webpacker (~> 5.4)
|
||||||
webpush!
|
webpush!
|
||||||
xorcist (~> 1.1)
|
xorcist (~> 1.1)
|
||||||
|
|
||||||
|
RUBY VERSION
|
||||||
|
ruby 3.0.4p208
|
||||||
|
|
||||||
|
BUNDLED WITH
|
||||||
|
2.2.33
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'random_name_generator'
|
||||||
|
require 'securerandom'
|
||||||
|
|
||||||
class Auth::RegistrationsController < Devise::RegistrationsController
|
class Auth::RegistrationsController < Devise::RegistrationsController
|
||||||
include RegistrationSpamConcern
|
include RegistrationSpamConcern
|
||||||
|
|
||||||
|
@ -45,6 +48,21 @@ class Auth::RegistrationsController < Devise::RegistrationsController
|
||||||
end
|
end
|
||||||
|
|
||||||
def build_resource(hash = nil)
|
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)
|
super(hash)
|
||||||
|
|
||||||
resource.locale = I18n.locale
|
resource.locale = I18n.locale
|
||||||
|
@ -62,7 +80,9 @@ class Auth::RegistrationsController < Devise::RegistrationsController
|
||||||
end
|
end
|
||||||
|
|
||||||
def after_sign_up_path_for(_resource)
|
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
|
end
|
||||||
|
|
||||||
def after_sign_in_path_for(_resource)
|
def after_sign_in_path_for(_resource)
|
||||||
|
@ -156,4 +176,11 @@ class Auth::RegistrationsController < Devise::RegistrationsController
|
||||||
def set_cache_headers
|
def set_cache_headers
|
||||||
response.headers['Cache-Control'] = 'private, no-store'
|
response.headers['Cache-Control'] = 'private, no-store'
|
||||||
end
|
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
|
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
|
= render 'application/card', account: @invite.user.account
|
||||||
|
|
||||||
.fields-group
|
.fields-group
|
||||||
= f.simple_fields_for :account do |ff|
|
= 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
|
||||||
= 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') }
|
= 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' }
|
||||||
= 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' }
|
|
||||||
|
|
||||||
- if approved_registrations? && !@invite.present?
|
- if approved_registrations? && !@invite.present?
|
||||||
.fields-group
|
.fields-group
|
||||||
|
|
|
@ -69,7 +69,8 @@ Rails.application.configure do
|
||||||
# If using a Heroku, Vagrant or generic remote development environment,
|
# If using a Heroku, Vagrant or generic remote development environment,
|
||||||
# use letter_opener_web, accessible at /letter_opener.
|
# use letter_opener_web, accessible at /letter_opener.
|
||||||
# Otherwise, use letter_opener, which launches a browser window to view sent mail.
|
# 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
|
config.after_initialize do
|
||||||
Bullet.enable = true
|
Bullet.enable = true
|
||||||
|
|
|
@ -120,7 +120,7 @@ Rails.application.configure do
|
||||||
read_timeout: 20,
|
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 = {
|
config.action_dispatch.default_headers = {
|
||||||
'Server' => 'Mastodon',
|
'Server' => 'Mastodon',
|
||||||
|
|
Loading…
Reference in a new issue