0aa744a8e3
Using _: property names is discouraged, as in the future, canonicalization may throw an error when encountering that instead of discarding it silently like it does now. We are defining some ActivityStreams properties which we expect to land in ActivityStreams eventually, to ensure that future versions of Mastodon will remain compatible with this even once that happens. Those would be `locked`, `sensitive` and `Hashtag` We are defining a custom context inline for some properties which we do not expect to land in any other context. `atomUri`, `inReplyToAtomUri` and `conversation` are part of the custom defined OStatus context.
48 lines
1.2 KiB
Ruby
48 lines
1.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class ActivityPub::FetchRemoteStatusService < BaseService
|
|
include JsonLdHelper
|
|
|
|
# Should be called when uri has already been checked for locality
|
|
def call(uri, prefetched_json = nil)
|
|
@json = body_to_json(prefetched_json) || fetch_resource(uri)
|
|
|
|
return unless supported_context?
|
|
|
|
activity = activity_json
|
|
actor_id = value_or_id(activity['actor'])
|
|
|
|
return unless expected_type?(activity) && trustworthy_attribution?(uri, actor_id)
|
|
|
|
actor = ActivityPub::TagManager.instance.uri_to_resource(actor_id, Account)
|
|
actor = ActivityPub::FetchRemoteAccountService.new.call(actor_id) if actor.nil?
|
|
|
|
ActivityPub::Activity.factory(activity, actor).perform
|
|
end
|
|
|
|
private
|
|
|
|
def activity_json
|
|
if %w(Note Article).include? @json['type']
|
|
{
|
|
'type' => 'Create',
|
|
'actor' => first_of_value(@json['attributedTo']),
|
|
'object' => @json,
|
|
}
|
|
else
|
|
@json
|
|
end
|
|
end
|
|
|
|
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
|
|
|
|
def expected_type?(json)
|
|
%w(Create Announce).include? json['type']
|
|
end
|
|
end
|