docbrown/app/services/authentication/providers.rb
Michael Kohl 5406b0576e
Split Settings::Authentication from SiteConfig (#13095)
* Split Settings::Authentication from SiteConfig

* Move specs

* Sort fields

* Update settings usages

* Update recaptcha usages

* Add data update script

* Update spec

* Rename SiteConfigParams concern

* Fixes, new route, new controller

* Controller and service refactoring

* More controller and service updates

* Spec updates

* More spec fixes

* Move file

* Fix FeedbackMessagesController

* Update admin/configs_spec

* Fix remaining specs in admin/configs_spec

* Fix configs API

* Formatting

* Clean up old service object

* Various fixes

* Update DUS

* Add model argument to admin_config_label

* Fix key name

* Fix specs

* Add distinct request caches for settings classes

* Fix e2e tests

* Fix remaining system spec

* Make DUS idempotent

* Move routes block

* Cleanup

* Switch to ActiveSupport::CurrentAttributes

* Pinned rails-settings-cached

* Update e2e test

* Update lib/data_update_scripts/20210316091354_move_authentication_settings.rb

Co-authored-by: rhymes <rhymes@hey.com>

* Add guard to DUS

* Temporarily re-add two SiteConfig fields

* Fix config show view

Co-authored-by: rhymes <rhymes@hey.com>
2021-04-12 09:41:09 +02:00

69 lines
1.9 KiB
Ruby

# We require all authentication modules to make sure providers
# are correctly preloaded and ready to be used at this point as the loading
# order is important
require_dependency Rails.root.join("app/services/authentication/providers/provider.rb")
Dir[Rails.root.join("app/services/authentication/**/*.rb")].each do |f|
require_dependency(f)
end
module Authentication
module Providers
# Retrieves a provider that is both available and enabled
def self.get!(provider_name)
name = provider_name.to_s.titleize
unless available?(provider_name)
raise(
::Authentication::Errors::ProviderNotFound,
"Provider #{name} is not available!",
)
end
unless enabled?(provider_name)
raise(
::Authentication::Errors::ProviderNotEnabled,
"Provider #{name} is not enabled!",
)
end
Authentication::Providers.const_get(name)
end
def self.available
Authentication::Providers::Provider.subclasses.map do |subclass|
subclass.name.demodulize.downcase.to_sym
end.sort
end
def self.available?(provider_name)
Authentication::Providers.const_defined?(provider_name.to_s.titleize)
end
# Returns enabled providers
# TODO: [@forem/oss] ideally this should be "available - disabled"
# we can get there once we have feature flags
def self.enabled
return [] if Settings::Authentication.invite_only_mode
Settings::Authentication.providers.map(&:to_sym).sort
end
def self.enabled_for_user(user)
return [] unless user
providers = enabled & user.identities.pluck(:provider).map(&:to_sym)
providers.sort.map do |provider_name|
get!(provider_name)
end
end
def self.enabled?(provider_name)
enabled.include?(provider_name.to_sym)
end
def self.username_fields
Authentication::Providers::Provider.subclasses.map(&:user_username_field).sort
end
end
end