You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.4 KiB
60 lines
1.4 KiB
# frozen_string_literal: true |
|
|
|
class ActivityPub::Dereferencer |
|
include JsonLdHelper |
|
|
|
def initialize(uri, permitted_origin: nil, signature_actor: nil) |
|
@uri = uri |
|
@permitted_origin = permitted_origin |
|
@signature_actor = signature_actor |
|
end |
|
|
|
def object |
|
@object ||= fetch_object! |
|
end |
|
|
|
private |
|
|
|
def bear_cap? |
|
@uri.start_with?('bear:') |
|
end |
|
|
|
def fetch_object! |
|
if bear_cap? |
|
fetch_with_token! |
|
else |
|
fetch_with_signature! |
|
end |
|
end |
|
|
|
def fetch_with_token! |
|
perform_request(bear_cap['u'], headers: { 'Authorization' => "Bearer #{bear_cap['t']}" }) |
|
end |
|
|
|
def fetch_with_signature! |
|
perform_request(@uri) |
|
end |
|
|
|
def bear_cap |
|
@bear_cap ||= Addressable::URI.parse(@uri).query_values |
|
end |
|
|
|
def perform_request(uri, headers: nil) |
|
return if non_matching_uri_hosts?(@permitted_origin, uri) |
|
|
|
req = Request.new(:get, uri) |
|
|
|
req.add_headers('Accept' => 'application/activity+json, application/ld+json') |
|
req.add_headers(headers) if headers |
|
req.on_behalf_of(@signature_actor) if @signature_actor |
|
|
|
req.perform do |res| |
|
if res.code == 200 |
|
json = body_to_json(res.body_with_limit) |
|
json if json.present? && json['id'] == uri |
|
else |
|
raise Mastodon::UnexpectedResponseError, res unless response_successful?(res) || response_error_unsalvageable?(res) |
|
end |
|
end |
|
end |
|
end
|
|
|