2023-03-29 18:01:16 +02:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
# Deals with the yml file keeping the configuration of the current authentication provider
|
|
|
|
class ProviderConfig
|
|
|
|
def initialize
|
2023-03-30 10:28:31 +02:00
|
|
|
@config = if File.exist?('config/auth_provider.yml')
|
|
|
|
YAML.safe_load_file('config/auth_provider.yml').with_indifferent_access
|
|
|
|
else
|
|
|
|
{ providable_type: 'DatabaseProvider', name: 'DatabaseProvider::SimpleAuthProvider' }
|
|
|
|
end
|
2023-03-29 18:01:16 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
def db
|
|
|
|
AuthProvider.find(@config[:id])
|
|
|
|
end
|
|
|
|
|
|
|
|
def oidc_config
|
|
|
|
return nil unless @config[:providable_type] == 'OpenIdConnectProvider'
|
|
|
|
|
|
|
|
(@config[:providable_attributes].keys.filter { |n| !n.start_with?('client__') && n != 'profile_url' }.map do |n|
|
|
|
|
val = @config[:providable_attributes][n]
|
|
|
|
val.join(' ') if n == 'scope'
|
|
|
|
[n, val]
|
|
|
|
end).push(
|
|
|
|
['client_options', @config[:providable_attributes].keys.filter { |n| n.start_with?('client__') }.to_h do |n|
|
|
|
|
[n.sub('client__', ''), @config[:providable_attributes][n]]
|
|
|
|
end]
|
|
|
|
).to_h
|
|
|
|
end
|
|
|
|
|
|
|
|
def method_missing(method, *args)
|
|
|
|
return map_value(@config[method]) if @config.key?(method)
|
|
|
|
|
|
|
|
return map_value(@config["#{method}_attributes"]) if @config.key?("#{method}_attributes")
|
|
|
|
|
|
|
|
super
|
|
|
|
end
|
|
|
|
|
|
|
|
def respond_to_missing?(name)
|
|
|
|
@config.key?(name) || @config.key("#{name}_attributes")
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.write_active_provider
|
|
|
|
data = ApplicationController.render(
|
|
|
|
template: 'auth_provider/provider',
|
|
|
|
locals: { provider: AuthProvider.active },
|
|
|
|
handlers: [:jbuilder],
|
|
|
|
formats: [:json]
|
|
|
|
)
|
|
|
|
file_path = Rails.root.join('config/auth_provider.yml')
|
|
|
|
File.open(file_path, File::WRONLY | File::CREAT) do |file|
|
|
|
|
file.write(JSON.parse(data).to_yaml)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def map_value(item)
|
|
|
|
return Struct.new(*item.symbolize_keys.keys).new(*item.values) if item.is_a?(Hash)
|
|
|
|
|
|
|
|
return item.map { |v| map_value(v) } if item.is_a?(Array)
|
|
|
|
|
|
|
|
item
|
|
|
|
end
|
|
|
|
end
|