Class: ForestAdminAgent::Services::IpWhitelist

Inherits:
Object
  • Object
show all
Defined in:
lib/forest_admin_agent/services/ip_whitelist.rb

Constant Summary collapse

RULE_MATCH_IP =
0
RULE_MATCH_RANGE =
1
RULE_MATCH_SUBNET =
2
CACHE_KEY =
'forest.ip_whitelist'.freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeIpWhitelist

Returns a new instance of IpWhitelist.



15
16
17
18
19
20
21
22
# File 'lib/forest_admin_agent/services/ip_whitelist.rb', line 15

def initialize
  @forest_api = ForestAdminAgent::Http::ForestAdminApiRequester.new
  @cache = FileCache.new(
    'ip_whitelist',
    Facades::Container.config_from_cache[:cache_dir].to_s,
    Facades::Container.config_from_cache[:permission_expiration]
  )
end

Instance Attribute Details

#cacheObject (readonly)

Returns the value of attribute cache.



13
14
15
# File 'lib/forest_admin_agent/services/ip_whitelist.rb', line 13

def cache
  @cache
end

#forest_apiObject (readonly)

Returns the value of attribute forest_api.



13
14
15
# File 'lib/forest_admin_agent/services/ip_whitelist.rb', line 13

def forest_api
  @forest_api
end

Class Method Details

.invalidate_cacheObject



24
25
26
27
28
29
30
31
# File 'lib/forest_admin_agent/services/ip_whitelist.rb', line 24

def self.invalidate_cache
  cache = FileCache.new(
    'ip_whitelist',
    Facades::Container.config_from_cache[:cache_dir].to_s,
    Facades::Container.config_from_cache[:permission_expiration]
  )
  cache.delete(CACHE_KEY) unless cache.get(CACHE_KEY).nil?
end

Instance Method Details

#both_loopback?(ip1, ip2) ⇒ Boolean

Returns:

  • (Boolean)


82
83
84
# File 'lib/forest_admin_agent/services/ip_whitelist.rb', line 82

def both_loopback?(ip1, ip2)
  IPAddress(ip1).loopback? && IPAddress(ip2).loopback?
end

#enabled?Boolean

Returns:

  • (Boolean)


43
44
45
# File 'lib/forest_admin_agent/services/ip_whitelist.rb', line 43

def enabled?
  use_ip_whitelist && !rules.empty?
end

#ip_match_ip?(ip1, ip2) ⇒ Boolean

Returns:

  • (Boolean)


64
65
66
67
68
69
70
71
72
# File 'lib/forest_admin_agent/services/ip_whitelist.rb', line 64

def ip_match_ip?(ip1, ip2)
  return both_loopback?(ip1, ip2) unless same_ip_version?(ip1, ip2)

  if ip1 == ip2
    true
  else
    both_loopback?(ip1, ip2)
  end
end

#ip_match_range?(ip, min, max) ⇒ Boolean

Returns:

  • (Boolean)


86
87
88
89
90
91
92
93
94
# File 'lib/forest_admin_agent/services/ip_whitelist.rb', line 86

def ip_match_range?(ip, min, max)
  return false unless same_ip_version?(ip, min)

  ip_range_minimum = (IPAddress min)
  ip_range_maximum = (IPAddress max)
  ip_value = (IPAddress ip)

  ip_value.between?(ip_range_minimum, ip_range_maximum)
end

#ip_match_subnet?(ip, subnet) ⇒ Boolean

Returns:

  • (Boolean)


96
97
98
99
100
# File 'lib/forest_admin_agent/services/ip_whitelist.rb', line 96

def ip_match_subnet?(ip, subnet)
  return false unless same_ip_version?(ip, subnet)

  IPAddress(subnet).include?(IPAddress(ip))
end

#ip_matches_any_rule?(ip) ⇒ Boolean

Returns:

  • (Boolean)


47
48
49
# File 'lib/forest_admin_agent/services/ip_whitelist.rb', line 47

def ip_matches_any_rule?(ip)
  rules.any? { |rule| ip_matches_rule?(ip, rule) }
end

#ip_matches_rule?(ip, rule) ⇒ Boolean

Returns:

  • (Boolean)


51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/forest_admin_agent/services/ip_whitelist.rb', line 51

def ip_matches_rule?(ip, rule)
  case rule['type']
  when RULE_MATCH_IP
    ip_match_ip?(ip, rule['ip'])
  when RULE_MATCH_RANGE
    ip_match_range?(ip, rule['ipMinimum'], rule['ipMaximum'])
  when RULE_MATCH_SUBNET
    ip_match_subnet?(ip, rule['range'])
  else
    raise ForestAdminAgent::Http::Exceptions::InternalServerError, 'Invalid rule type'
  end
end

#ip_version(ip) ⇒ Object



78
79
80
# File 'lib/forest_admin_agent/services/ip_whitelist.rb', line 78

def ip_version(ip)
  (IPAddress ip).is_a?(IPAddress::IPv4) ? :ip_v4 : :ip_v6
end

#rulesObject



38
39
40
41
# File 'lib/forest_admin_agent/services/ip_whitelist.rb', line 38

def rules
  fetch_rules if @rules.nil?
  @rules ||= []
end

#same_ip_version?(ip1, ip2) ⇒ Boolean

Returns:

  • (Boolean)


74
75
76
# File 'lib/forest_admin_agent/services/ip_whitelist.rb', line 74

def same_ip_version?(ip1, ip2)
  ip_version(ip1) == ip_version(ip2)
end

#use_ip_whitelistObject



33
34
35
36
# File 'lib/forest_admin_agent/services/ip_whitelist.rb', line 33

def use_ip_whitelist
  fetch_rules if @use_ip_whitelist.nil?
  @use_ip_whitelist ||= false
end