diff --git a/app/controllers/admin/configs_controller.rb b/app/controllers/admin/configs_controller.rb index e5f98ef4a..f97707cff 100644 --- a/app/controllers/admin/configs_controller.rb +++ b/app/controllers/admin/configs_controller.rb @@ -55,6 +55,7 @@ module Admin github_secret facebook_key facebook_secret + invite_only_mode allow_email_password_registration primary_brand_color_hex spam_trigger_terms diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index a590864d4..59440d4f6 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -106,7 +106,11 @@ module ApplicationHelper end end - def any_selfserve_auth? + def invite_only_mode? + SiteConfig.invite_only_mode? + end + + def any_enabled_auth_providers? authentication_enabled_providers.any? end diff --git a/app/javascript/admin/controllers/config_controller.js b/app/javascript/admin/controllers/config_controller.js new file mode 100644 index 000000000..709938f38 --- /dev/null +++ b/app/javascript/admin/controllers/config_controller.js @@ -0,0 +1,19 @@ +import { Controller } from 'stimulus'; + +export default class ConfigController extends Controller { + static targets = ['inviteOnlyMode', 'authenticationProviders']; + + disableAuthenticationOptions() { + if (this.inviteOnlyModeTarget.checked) { + this.authenticationProvidersTarget.disabled = true; + document.querySelector( + 'button[data-id=site_config_authentication_providers]', + ).disabled = true; + } else { + this.authenticationProvidersTarget.disabled = false; + document.querySelector( + 'button[data-id=site_config_authentication_providers]', + ).disabled = false; + } + } +} diff --git a/app/lib/constants/site_config.rb b/app/lib/constants/site_config.rb index f3816bc48..d73d1e8cc 100644 --- a/app/lib/constants/site_config.rb +++ b/app/lib/constants/site_config.rb @@ -122,6 +122,10 @@ module Constants description: "Used to authenticate with your health check endpoints.", placeholder: "a secure token" }, + invite_only_mode: { + description: "Only users invited by email can join this community.", + placeholder: "" + }, jobs_url: { description: "URL of the website where open positions are posted", placeholder: "Jobs URL" diff --git a/app/models/site_config.rb b/app/models/site_config.rb index 8381e5e38..66f2065e2 100644 --- a/app/models/site_config.rb +++ b/app/models/site_config.rb @@ -23,6 +23,7 @@ class SiteConfig < RailsSettings::Base # Authentication field :allow_email_password_registration, type: :boolean, default: false field :authentication_providers, type: :array, default: proc { Authentication::Providers.available } + field :invite_only_mode, type: :boolean, default: false field :twitter_key, type: :string, default: ApplicationConfig["TWITTER_KEY"] field :twitter_secret, type: :string, default: ApplicationConfig["TWITTER_SECRET"] field :github_key, type: :string, default: ApplicationConfig["GITHUB_KEY"] diff --git a/app/services/authentication/providers.rb b/app/services/authentication/providers.rb index 247cffeca..1275318d1 100644 --- a/app/services/authentication/providers.rb +++ b/app/services/authentication/providers.rb @@ -44,6 +44,8 @@ module Authentication # TODO: [@forem/oss] ideally this should be "available - disabled" # we can get there once we have feature flags def self.enabled + return [] if SiteConfig.invite_only_mode + SiteConfig.authentication_providers.map(&:to_sym).sort end diff --git a/app/views/admin/configs/show.html.erb b/app/views/admin/configs/show.html.erb index b26394dca..aed095f47 100644 --- a/app/views/admin/configs/show.html.erb +++ b/app/views/admin/configs/show.html.erb @@ -1,4 +1,4 @@ -
Only admins with explicit single resource admin role may make changes to site config. Even super admins require this permission. @@ -116,6 +116,11 @@ expanded: "false" } %>