1
0
mirror of https://github.com/LaCasemate/fab-manager.git synced 2024-12-04 15:24:23 +01:00
fab-manager/lib/omni_auth/strategies/sso_oauth2_provider.rb

111 lines
4.1 KiB
Ruby
Raw Normal View History

2016-03-23 18:39:41 +01:00
require 'omniauth-oauth2'
module OmniAuth
module Strategies
class SsoOauth2Provider < OmniAuth::Strategies::OAuth2
def self.active_provider
active_provider = AuthProvider.active
if active_provider.providable_type != OAuth2Provider.name
raise "Trying to instantiate the wrong provider: Expected OAuth2Provider, received #{active_provider.providable_type}"
end
active_provider
end
# Strategy name.
option :name, active_provider.strategy_name
option :client_options, {
:site => active_provider.providable.base_url,
:authorize_url => active_provider.providable.authorization_endpoint,
:token_url => active_provider.providable.token_endpoint
}
uid { parsed_info['user.uid'.to_sym] }
info do
{
:mapping => parsed_info
}
end
extra do
{
:raw_info => raw_info
}
end
# retrieve data from various url, querying each only once
def raw_info
@raw_info ||= Hash.new
unless @raw_info.size > 0
OmniAuth::Strategies::SsoOauth2Provider.active_provider.providable.o_auth2_mappings.each do |mapping|
unless @raw_info.has_key?(mapping.api_endpoint.to_sym)
@raw_info[mapping.api_endpoint.to_sym] = access_token.get(mapping.api_endpoint).parsed
end
end
end
@raw_info
end
def parsed_info
@parsed_info ||= Hash.new
unless @parsed_info.size > 0
OmniAuth::Strategies::SsoOauth2Provider.active_provider.providable.o_auth2_mappings.each do |mapping|
if mapping.transformation
case mapping.transformation['type']
## INTEGER
when 'integer'
mapping.transformation['mapping'].each do |m|
if m['from'] == raw_info[mapping.api_endpoint.to_sym][mapping.api_field]
@parsed_info[local_sym(mapping)] = m['to']
break
end
end
## BOOLEAN
when 'boolean'
@parsed_info[local_sym(mapping)] = !(raw_info[mapping.api_endpoint.to_sym][mapping.api_field] == mapping.transformation['false_value'])
@parsed_info[local_sym(mapping)] = (raw_info[mapping.api_endpoint.to_sym][mapping.api_field] == mapping.transformation['true_value'])
## DATE
when 'date'
case mapping.transformation['format']
when 'iso8601'
@parsed_info[local_sym(mapping)] = DateTime.iso8601(raw_info[mapping.api_endpoint.to_sym][mapping.api_field])
when 'rfc2822'
@parsed_info[local_sym(mapping)] = DateTime.rfc2822(raw_info[mapping.api_endpoint.to_sym][mapping.api_field])
when 'rfc3339'
@parsed_info[local_sym(mapping)] = DateTime.rfc3339(raw_info[mapping.api_endpoint.to_sym][mapping.api_field])
when 'timestamp-s'
@parsed_info[local_sym(mapping)] = DateTime.strptime(raw_info[mapping.api_endpoint.to_sym][mapping.api_field],'%s')
when 'timestamp-ms'
@parsed_info[local_sym(mapping)] = DateTime.strptime(raw_info[mapping.api_endpoint.to_sym][mapping.api_field],'%Q')
else
@parsed_info[local_sym(mapping)] = DateTime.parse(raw_info[mapping.api_endpoint.to_sym][mapping.api_field])
end
## OTHER TRANSFORMATIONS (not supported)
else
@parsed_info[local_sym(mapping)] = raw_info[mapping.api_endpoint.to_sym][mapping.api_field]
end
## NO TRANSFORMATION
else
@parsed_info[local_sym(mapping)] = raw_info[mapping.api_endpoint.to_sym][mapping.api_field]
end
2016-03-23 18:39:41 +01:00
end
end
@parsed_info
end
private
def local_sym(mapping)
(mapping.local_model+'.'+mapping.local_field).to_sym
end
2016-03-23 18:39:41 +01:00
end
end
end