Module: CompletionKit::ProviderEndpoint

Defined in:
app/services/completion_kit/provider_endpoint.rb

Constant Summary collapse

ZERO_NET =
IPAddr.new("0.0.0.0/8").freeze

Class Method Summary collapse

Class Method Details

.addresses(host) ⇒ Object



31
32
33
34
35
36
# File 'app/services/completion_kit/provider_endpoint.rb', line 31

def addresses(host)
  bare = host.delete_prefix("[").delete_suffix("]")
  [IPAddr.new(bare)]
rescue IPAddr::InvalidAddressError
  Resolv.getaddresses(host).map { |addr| IPAddr.new(addr) }
end

.parse(value) ⇒ Object



24
25
26
27
28
29
# File 'app/services/completion_kit/provider_endpoint.rb', line 24

def parse(value)
  uri = URI.parse(value.to_s.strip)
  uri if uri.is_a?(URI::HTTP) && uri.host.present?
rescue URI::InvalidURIError
  nil
end

.safe?(url) ⇒ Boolean

Returns:

  • (Boolean)


19
20
21
22
# File 'app/services/completion_kit/provider_endpoint.rb', line 19

def safe?(url)
  errors = validate(url)
  errors.empty? || errors == [:unresolvable]
end

.unsafe?(ip) ⇒ Boolean

Returns:

  • (Boolean)


38
39
40
41
42
43
44
45
# File 'app/services/completion_kit/provider_endpoint.rb', line 38

def unsafe?(ip)
  return true if ip.private?
  return true if ip.link_local?
  return true if ip.to_i.zero?
  return true if ip.ipv4? && ZERO_NET.include?(ip)
  return true if ip.loopback? && !CompletionKit.config.allow_loopback_endpoints
  false
end

.validate(url) ⇒ Object



10
11
12
13
14
15
16
17
# File 'app/services/completion_kit/provider_endpoint.rb', line 10

def validate(url)
  uri = parse(url)
  return [:invalid_url] unless uri
  addrs = addresses(uri.host)
  return [:unresolvable] if addrs.empty?
  return [:unsafe_host] if addrs.any? { |ip| unsafe?(ip) }
  []
end