2017-08-08 22:52:15 +03:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
class ActivityPub::FetchRemoteStatusService < BaseService
|
|
|
|
include JsonLdHelper
|
|
|
|
|
|
|
|
# Should be called when uri has already been checked for locality
|
2017-08-14 03:29:36 +03:00
|
|
|
def call(uri, prefetched_json = nil)
|
|
|
|
@json = body_to_json(prefetched_json) || fetch_resource(uri)
|
2017-08-08 22:52:15 +03:00
|
|
|
|
2017-08-24 17:21:42 +03:00
|
|
|
return unless supported_context?
|
2017-08-08 22:52:15 +03:00
|
|
|
|
2017-08-24 17:21:42 +03:00
|
|
|
activity = activity_json
|
|
|
|
actor_id = value_or_id(activity['actor'])
|
2017-08-08 22:52:15 +03:00
|
|
|
|
2017-08-24 17:21:42 +03:00
|
|
|
return unless expected_type?(activity) && trustworthy_attribution?(uri, actor_id)
|
2017-08-08 22:52:15 +03:00
|
|
|
|
2017-08-24 17:21:42 +03:00
|
|
|
actor = ActivityPub::TagManager.instance.uri_to_resource(actor_id, Account)
|
|
|
|
actor = ActivityPub::FetchRemoteAccountService.new.call(actor_id) if actor.nil?
|
2017-08-08 22:52:15 +03:00
|
|
|
|
2017-08-24 17:21:42 +03:00
|
|
|
ActivityPub::Activity.factory(activity, actor).perform
|
2017-08-08 22:52:15 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
2017-08-24 17:21:42 +03:00
|
|
|
def activity_json
|
|
|
|
if %w(Note Article).include? @json['type']
|
|
|
|
{
|
|
|
|
'type' => 'Create',
|
|
|
|
'actor' => first_of_value(@json['attributedTo']),
|
|
|
|
'object' => @json,
|
|
|
|
}
|
|
|
|
else
|
|
|
|
@json
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-08-08 22:52:15 +03:00
|
|
|
def trustworthy_attribution?(uri, attributed_to)
|
|
|
|
Addressable::URI.parse(uri).normalized_host.casecmp(Addressable::URI.parse(attributed_to).normalized_host).zero?
|
|
|
|
end
|
|
|
|
|
|
|
|
def supported_context?
|
|
|
|
super(@json)
|
|
|
|
end
|
|
|
|
|
2017-08-24 17:21:42 +03:00
|
|
|
def expected_type?(json)
|
|
|
|
%w(Create Announce).include? json['type']
|
2017-08-08 22:52:15 +03:00
|
|
|
end
|
|
|
|
end
|