From c37b283865ac564cdf16b9e16d482677c077e76b Mon Sep 17 00:00:00 2001 From: Jacob Herrington Date: Mon, 12 Oct 2020 10:27:22 -0500 Subject: [PATCH] Allow Forem admins to enable an invite only mode. (#10758) * Add invite only mode field to SiteConfig * Add UI elements for invite only mode --- app/controllers/admin/configs_controller.rb | 1 + app/helpers/application_helper.rb | 6 +++++- .../admin/controllers/config_controller.js | 19 +++++++++++++++++++ app/lib/constants/site_config.rb | 4 ++++ app/models/site_config.rb | 1 + app/services/authentication/providers.rb | 2 ++ app/views/admin/configs/show.html.erb | 10 ++++++++-- .../articles/_sidebar_additional.html.erb | 2 +- .../registrations/_registration_form.html.erb | 6 +++++- .../shared/_authorization_error.html.erb | 2 +- spec/requests/admin/configs_spec.rb | 19 +++++++++++++++++++ .../user_logs_in_with_facebook_spec.rb | 12 ++++++++++++ .../user_logs_in_with_github_spec.rb | 12 ++++++++++++ .../user_logs_in_with_twitter_spec.rb | 12 ++++++++++++ 14 files changed, 102 insertions(+), 6 deletions(-) create mode 100644 app/javascript/admin/controllers/config_controller.js 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 @@ -
+