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
- .addresses(host) ⇒ Object
- .parse(value) ⇒ Object
- .safe?(url) ⇒ Boolean
- .unsafe?(ip) ⇒ Boolean
- .validate(url) ⇒ Object
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) = host.delete_prefix("[").delete_suffix("]") [IPAddr.new()] 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
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
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 |