0
0
Fork 0

Raise Mastodon::HostValidationError when host for HTTP request is private (#6410)

This commit is contained in:
Akihiko Odaki 2018-02-25 03:16:11 +09:00 committed by Eugen Rochko
parent 7cb49eaa3a
commit 2e8a492e88
8 changed files with 69 additions and 9 deletions

View file

@ -4,6 +4,7 @@ module Mastodon
class Error < StandardError; end
class NotPermittedError < Error; end
class ValidationError < Error; end
class HostValidationError < ValidationError; end
class RaceConditionError < Error; end
class UnexpectedResponseError < Error

View file

@ -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

View file

@ -0,0 +1,11 @@
# frozen_string_literal: true
class SidekiqErrorHandler
def call(*)
yield
rescue Mastodon::HostValidationError => e
Rails.logger.error "#{e.class}: #{e.message}"
Rails.logger.error e.backtrace.join("\n")
# Do not retry
end
end