Export interaction policies for local posts over ActivityPub (#35697)
This commit is contained in:
@@ -3,7 +3,7 @@
|
|||||||
class ActivityPub::NoteSerializer < ActivityPub::Serializer
|
class ActivityPub::NoteSerializer < ActivityPub::Serializer
|
||||||
include FormattingHelper
|
include FormattingHelper
|
||||||
|
|
||||||
context_extensions :atom_uri, :conversation, :sensitive, :voters_count, :quotes
|
context_extensions :atom_uri, :conversation, :sensitive, :voters_count, :quotes, :interaction_policies
|
||||||
|
|
||||||
attributes :id, :type, :summary,
|
attributes :id, :type, :summary,
|
||||||
:in_reply_to, :published, :url,
|
:in_reply_to, :published, :url,
|
||||||
@@ -35,6 +35,8 @@ class ActivityPub::NoteSerializer < ActivityPub::Serializer
|
|||||||
attribute :quote, key: :quote_uri, if: :quote?
|
attribute :quote, key: :quote_uri, if: :quote?
|
||||||
attribute :quote_authorization, if: :quote_authorization?
|
attribute :quote_authorization, if: :quote_authorization?
|
||||||
|
|
||||||
|
attribute :interaction_policy, if: -> { Mastodon::Feature.outgoing_quotes_enabled? }
|
||||||
|
|
||||||
def id
|
def id
|
||||||
ActivityPub::TagManager.instance.uri_for(object)
|
ActivityPub::TagManager.instance.uri_for(object)
|
||||||
end
|
end
|
||||||
@@ -216,6 +218,23 @@ class ActivityPub::NoteSerializer < ActivityPub::Serializer
|
|||||||
ActivityPub::TagManager.instance.approval_uri_for(object.quote)
|
ActivityPub::TagManager.instance.approval_uri_for(object.quote)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def interaction_policy
|
||||||
|
approved_uris = []
|
||||||
|
|
||||||
|
# On outgoing posts, only automatic approval is supported
|
||||||
|
policy = object.quote_approval_policy >> 16
|
||||||
|
approved_uris << ActivityPub::TagManager::COLLECTIONS[:public] if policy.anybits?(Status::QUOTE_APPROVAL_POLICY_FLAGS[:public])
|
||||||
|
approved_uris << ActivityPub::TagManager.instance.followers_uri_for(object.account) if policy.anybits?(Status::QUOTE_APPROVAL_POLICY_FLAGS[:followers])
|
||||||
|
approved_uris << ActivityPub::TagManager.instance.following_uri_for(object.account) if policy.anybits?(Status::QUOTE_APPROVAL_POLICY_FLAGS[:followed])
|
||||||
|
approved_uris << ActivityPub::TagManager.instance.uri_for(object.account) if approved_uris.empty?
|
||||||
|
|
||||||
|
{
|
||||||
|
canQuote: {
|
||||||
|
automaticApproval: approved_uris,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
class MediaAttachmentSerializer < ActivityPub::Serializer
|
class MediaAttachmentSerializer < ActivityPub::Serializer
|
||||||
context_extensions :blurhash, :focal_point
|
context_extensions :blurhash, :focal_point
|
||||||
|
|
||||||
|
|||||||
@@ -56,4 +56,19 @@ RSpec.describe ActivityPub::NoteSerializer do
|
|||||||
})
|
})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'with a quote policy', feature: :outgoing_quotes do
|
||||||
|
let(:parent) { Fabricate(:status, quote_approval_policy: Status::QUOTE_APPROVAL_POLICY_FLAGS[:followers] << 16) }
|
||||||
|
|
||||||
|
it 'has the expected shape' do
|
||||||
|
expect(subject).to include({
|
||||||
|
'type' => 'Note',
|
||||||
|
'interactionPolicy' => a_hash_including(
|
||||||
|
'canQuote' => a_hash_including(
|
||||||
|
'automaticApproval' => [ActivityPub::TagManager.instance.followers_uri_for(parent.account)]
|
||||||
|
)
|
||||||
|
),
|
||||||
|
})
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user