You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
2.4 KiB
96 lines
2.4 KiB
# frozen_string_literal: true |
|
|
|
class ContentSecurityPolicy |
|
def base_host |
|
Rails.configuration.x.web_domain |
|
end |
|
|
|
def assets_host |
|
url_from_configured_asset_host || url_from_base_host |
|
end |
|
|
|
def media_hosts |
|
[assets_host, cdn_host_value, paperclip_root_url].concat(extra_media_hosts).compact |
|
end |
|
|
|
def sso_host |
|
return unless ENV['ONE_CLICK_SSO_LOGIN'] == 'true' && ENV['OMNIAUTH_ONLY'] == 'true' && Devise.omniauth_providers.length == 1 |
|
|
|
provider = Devise.omniauth_configs[Devise.omniauth_providers[0]] |
|
@sso_host ||= begin |
|
case provider.provider |
|
when :cas |
|
provider.cas_url |
|
when :saml |
|
provider.options[:idp_sso_target_url] |
|
when :openid_connect |
|
provider.options.dig(:client_options, :authorization_endpoint) || OpenIDConnect::Discovery::Provider::Config.discover!(provider.options[:issuer]).authorization_endpoint |
|
end |
|
end |
|
end |
|
|
|
private |
|
|
|
def extra_media_hosts |
|
ENV.fetch('EXTRA_MEDIA_HOSTS', '').split(/(?:\s*,\s*|\s+)/) |
|
end |
|
|
|
def url_from_configured_asset_host |
|
Rails.configuration.action_controller.asset_host |
|
end |
|
|
|
def cdn_host_value |
|
s3_alias_host || s3_cloudfront_host || azure_alias_host || s3_hostname_host || swift_object_url |
|
end |
|
|
|
def paperclip_root_url |
|
root_url = ENV.fetch('PAPERCLIP_ROOT_URL', nil) |
|
return if root_url.blank? |
|
|
|
(Addressable::URI.parse(assets_host) + root_url).tap do |uri| |
|
uri.path += '/' unless uri.path.blank? || uri.path.end_with?('/') |
|
end.to_s |
|
end |
|
|
|
def url_from_base_host |
|
host_to_url(base_host) |
|
end |
|
|
|
def host_to_url(host_string) |
|
uri_from_configuration_and_string(host_string) if host_string.present? |
|
end |
|
|
|
def s3_alias_host |
|
host_to_url ENV.fetch('S3_ALIAS_HOST', nil) |
|
end |
|
|
|
def s3_cloudfront_host |
|
host_to_url ENV.fetch('S3_CLOUDFRONT_HOST', nil) |
|
end |
|
|
|
def azure_alias_host |
|
host_to_url ENV.fetch('AZURE_ALIAS_HOST', nil) |
|
end |
|
|
|
def s3_hostname_host |
|
host_to_url ENV.fetch('S3_HOSTNAME', nil) |
|
end |
|
|
|
def swift_object_url |
|
url = ENV.fetch('SWIFT_OBJECT_URL', nil) |
|
return if url.blank? || !url.start_with?('https://') |
|
|
|
url += '/' unless url.end_with?('/') |
|
url |
|
end |
|
|
|
def uri_from_configuration_and_string(host_string) |
|
Addressable::URI.parse("#{host_protocol}://#{host_string}").tap do |uri| |
|
uri.path += '/' unless uri.path.blank? || uri.path.end_with?('/') |
|
end.to_s |
|
end |
|
|
|
def host_protocol |
|
Rails.configuration.x.use_https ? 'https' : 'http' |
|
end |
|
end
|
|
|