diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 135636ef7..7ea6b0665 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -17,11 +17,12 @@ class ApplicationController < ActionController::Base error_too_many_requests(exc) end - PUBLIC_CONTROLLERS = %w[shell async_info ga_events].freeze + PUBLIC_CONTROLLERS = %w[shell async_info ga_events service_worker omniauth_callbacks registrations].freeze private_constant :PUBLIC_CONTROLLERS def verify_private_forem return if controller_name.in?(PUBLIC_CONTROLLERS) + return if self.class.module_parent.to_s == "Admin" return if user_signed_in? || SiteConfig.public if api_action? diff --git a/app/controllers/concerns/verify_setup_completed.rb b/app/controllers/concerns/verify_setup_completed.rb index 7af57783f..e4e2803d8 100644 --- a/app/controllers/concerns/verify_setup_completed.rb +++ b/app/controllers/concerns/verify_setup_completed.rb @@ -34,9 +34,9 @@ module VerifySetupCompleted private def verify_setup_completed - return if config_path? || setup_completed? + return if config_path? || setup_completed? || SiteConfig.waiting_on_first_user - link = helpers.link_to("the configuration page", admin_config_path) + link = helpers.link_to("the configuration page", admin_config_path, "data-no-instant" => true) # rubocop:disable Rails/OutputSafety flash[:global_notice] = "Setup not completed yet, please visit #{link}.".html_safe # rubocop:enable Rails/OutputSafety diff --git a/app/controllers/registrations_controller.rb b/app/controllers/registrations_controller.rb index 1574c5105..a0c680589 100644 --- a/app/controllers/registrations_controller.rb +++ b/app/controllers/registrations_controller.rb @@ -10,7 +10,7 @@ class RegistrationsController < Devise::RegistrationsController end def create - not_authorized unless SiteConfig.allow_email_password_registration + not_authorized unless SiteConfig.allow_email_password_registration || SiteConfig.waiting_on_first_user build_resource(sign_up_params) resource.saw_onboarding = false @@ -18,9 +18,20 @@ class RegistrationsController < Devise::RegistrationsController resource.save if resource.email.present? yield resource if block_given? if resource.persisted? + update_first_user_permissions(resource) redirect_to "/confirm-email?email=#{resource.email}" else render action: "by_email" end end + + private + + def update_first_user_permissions(resource) + return unless SiteConfig.waiting_on_first_user + + resource.add_role(:super_admin) + resource.add_role(:single_resource_admin, Config) + SiteConfig.waiting_on_first_user = false + end end diff --git a/app/models/site_config.rb b/app/models/site_config.rb index c15ad6c69..764627dd1 100644 --- a/app/models/site_config.rb +++ b/app/models/site_config.rb @@ -11,6 +11,8 @@ class SiteConfig < RailsSettings::Base STACK_ICON = File.read(Rails.root.join("app/assets/images/stack.svg")).freeze LIGHTNING_ICON = File.read(Rails.root.join("app/assets/images/lightning.svg")).freeze + field :waiting_on_first_user, type: :boolean, default: !User.exists? + # API Tokens field :health_check_token, type: :string @@ -148,7 +150,7 @@ class SiteConfig < RailsSettings::Base field :feed_style, type: :string, default: "basic" # a non-public forem will redirect all unauthenticated pages to the registration page. # a public forem could have more fine-grained authentication (listings ar private etc.) in future - field :public, type: :boolean, default: 1 + field :public, type: :boolean, default: 0 # The default font for all users that have not chosen a custom font yet field :default_font, type: :string, default: "sans_serif" diff --git a/app/views/devise/registrations/new.html.erb b/app/views/devise/registrations/new.html.erb index c9728e060..91acae02b 100644 --- a/app/views/devise/registrations/new.html.erb +++ b/app/views/devise/registrations/new.html.erb @@ -1,5 +1,11 @@ -<% if params[:state] == "beta_email_signup" %> +<% if params[:state] == "beta_email_signup" && SiteConfig.allow_email_password_registration %> <%= render "shared/authentication/email_registration_form" %> +<% elsif params[:state] == "beta_email_signup" %> +
Create account from email... (beta)
- <% end %> -Create your account
<% end %> -
+ + Create an account. It will be the first super admin account. +
++ Once you sign up below, you can configure your community at admin/config. +
++ There is lots you can do as an admin, but there is a learning curve. +
++ Please reach out to the Forem team if you are unsure about anything! +
++ For Empowering Community 🌱 +
+ <%= render "shared/authentication/email_registration_form" %> +