Raise Mastodon::HostValidationError when host for HTTP request is private (#6410)
This commit is contained in:
committed by
Eugen Rochko
parent
7cb49eaa3a
commit
2e8a492e88
@ -1,5 +1,8 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'ipaddr'
|
||||
require 'socket'
|
||||
|
||||
class Request
|
||||
REQUEST_TARGET = '(request-target)'
|
||||
|
||||
@ -8,7 +11,7 @@ class Request
|
||||
def initialize(verb, url, **options)
|
||||
@verb = verb
|
||||
@url = Addressable::URI.parse(url).normalize
|
||||
@options = options
|
||||
@options = options.merge(socket_class: Socket)
|
||||
@headers = {}
|
||||
|
||||
set_common_headers!
|
||||
@ -87,4 +90,18 @@ class Request
|
||||
def http_client
|
||||
HTTP.timeout(:per_operation, timeout).follow(max_hops: 2)
|
||||
end
|
||||
|
||||
class Socket < TCPSocket
|
||||
class << self
|
||||
def open(host, *args)
|
||||
address = IPSocket.getaddress(host)
|
||||
raise Mastodon::HostValidationError if PrivateAddressCheck.private_address? IPAddr.new(address)
|
||||
super address, *args
|
||||
end
|
||||
|
||||
alias new open
|
||||
end
|
||||
end
|
||||
|
||||
private_constant :Socket
|
||||
end
|
||||
|
Reference in New Issue
Block a user