Raise Mastodon::HostValidationError when host for HTTP request is private (#6410)
This commit is contained in:
parent
7cb49eaa3a
commit
2e8a492e88
8 changed files with 69 additions and 9 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
11
app/lib/sidekiq_error_handler.rb
Normal file
11
app/lib/sidekiq_error_handler.rb
Normal 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
|
Loading…
Add table
Add a link
Reference in a new issue