1
0
mirror of https://github.com/LaCasemate/fab-manager.git synced 2024-12-01 12:24:28 +01:00
fab-manager/lib/provider_config.rb

66 lines
1.9 KiB
Ruby

# frozen_string_literal: true
# Deals with the yml file keeping the configuration of the current authentication provider
class ProviderConfig
def initialize
@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
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