mirror of
https://github.com/basecamp/once-campfire.git
synced 2026-03-20 13:09:04 +09:00
26 lines
588 B
Ruby
26 lines
588 B
Ruby
require "resolv"
|
|
|
|
module RestrictedHTTP
|
|
class Violation < StandardError; end
|
|
|
|
module PrivateNetworkGuard
|
|
extend self
|
|
|
|
LOCAL_IP = IPAddr.new("0.0.0.0/8") # "This" network
|
|
|
|
def resolve(hostname)
|
|
Resolv.getaddress(hostname).tap do |ip|
|
|
raise Violation.new("Attempt to access private IP via #{hostname}") if ip && private_ip?(ip)
|
|
end
|
|
end
|
|
|
|
def private_ip?(ip)
|
|
IPAddr.new(ip).then do |ipaddr|
|
|
ipaddr.private? || ipaddr.loopback? || LOCAL_IP.include?(ipaddr)
|
|
end
|
|
rescue IPAddr::InvalidAddressError
|
|
true
|
|
end
|
|
end
|
|
end
|