Class: Banzai::Filter::AssetProxyFilter

Inherits:
HTML::Pipeline::CamoFilter
  • Object
show all
Defined in:
lib/banzai/filter/asset_proxy_filter.rb

Overview

Proxy's images/assets to another server. Reduces mixed content warnings as well as hiding the customer's IP address when requesting images. Copies the original img `src` to `data-canonical-src` then replaces the `src` with a new url to the proxy server.

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(text, context = nil, result = nil) ⇒ AssetProxyFilter

Returns a new instance of AssetProxyFilter.


10
11
12
# File 'lib/banzai/filter/asset_proxy_filter.rb', line 10

def initialize(text, context = nil, result = nil)
  super
end

Class Method Details

.compile_whitelist(domain_list) ⇒ Object


54
55
56
57
58
59
# File 'lib/banzai/filter/asset_proxy_filter.rb', line 54

def self.compile_whitelist(domain_list)
  return if domain_list.empty?

  escaped = domain_list.map { |domain| Regexp.escape(domain).gsub('\*', '.*?') }
  Regexp.new("^(#{escaped.join('|')})$", Regexp::IGNORECASE)
end

.determine_whitelist(application_settings) ⇒ Object


61
62
63
# File 'lib/banzai/filter/asset_proxy_filter.rb', line 61

def self.determine_whitelist(application_settings)
  application_settings.asset_proxy_whitelist.presence || [Gitlab.config.gitlab.host]
end

.initialize_settingsObject

called during an initializer. Caching the values in Gitlab.config significantly increased performance, rather than querying Gitlab::CurrentSettings.current_application_settings over and over. However, this does mean that the Rails servers need to get restarted whenever the application settings are changed


39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/banzai/filter/asset_proxy_filter.rb', line 39

def self.initialize_settings
  application_settings           = Gitlab::CurrentSettings.current_application_settings
  Gitlab.config['asset_proxy'] ||= Settingslogic.new({})

  if application_settings.respond_to?(:asset_proxy_enabled)
    Gitlab.config.asset_proxy['enabled']       = application_settings.asset_proxy_enabled
    Gitlab.config.asset_proxy['url']           = application_settings.asset_proxy_url
    Gitlab.config.asset_proxy['secret_key']    = application_settings.asset_proxy_secret_key
    Gitlab.config.asset_proxy['whitelist']     = determine_whitelist(application_settings)
    Gitlab.config.asset_proxy['domain_regexp'] = compile_whitelist(Gitlab.config.asset_proxy.whitelist)
  else
    Gitlab.config.asset_proxy['enabled']       = ::ApplicationSetting.defaults[:asset_proxy_enabled]
  end
end

.transform_context(context) ⇒ Object


22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/banzai/filter/asset_proxy_filter.rb', line 22

def self.transform_context(context)
  context[:disable_asset_proxy] = !Gitlab.config.asset_proxy.enabled

  unless context[:disable_asset_proxy]
    context[:asset_proxy_enabled]       = !context[:disable_asset_proxy]
    context[:asset_proxy]               = Gitlab.config.asset_proxy.url
    context[:asset_proxy_secret_key]    = Gitlab.config.asset_proxy.secret_key
    context[:asset_proxy_domain_regexp] = Gitlab.config.asset_proxy.domain_regexp
  end

  context
end

Instance Method Details

#asset_host_whitelisted?(host) ⇒ Boolean

Returns:

  • (Boolean)

18
19
20
# File 'lib/banzai/filter/asset_proxy_filter.rb', line 18

def asset_host_whitelisted?(host)
  context[:asset_proxy_domain_regexp] ? context[:asset_proxy_domain_regexp].match?(host) : false
end

#validateObject


14
15
16
# File 'lib/banzai/filter/asset_proxy_filter.rb', line 14

def validate
  needs(:asset_proxy, :asset_proxy_secret_key) if asset_proxy_enabled?
end