2026-03-09 15:59:57 +01:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
|
|
class ActivityPub::VerifyFeaturedItemService
|
|
|
|
|
include JsonLdHelper
|
|
|
|
|
|
2026-03-17 16:14:30 +01:00
|
|
|
def call(collection_item, approval_uri)
|
2026-03-09 15:59:57 +01:00
|
|
|
@collection_item = collection_item
|
2026-03-17 16:14:30 +01:00
|
|
|
@authorization = fetch_resource(approval_uri, true, raise_on_error: :temporary)
|
2026-03-09 15:59:57 +01:00
|
|
|
|
|
|
|
|
if @authorization.nil?
|
|
|
|
|
@collection_item.update!(state: :rejected)
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
2026-03-17 16:14:30 +01:00
|
|
|
return if non_matching_uri_hosts?(approval_uri, @authorization['interactionTarget'])
|
2026-03-09 15:59:57 +01:00
|
|
|
return unless matching_type? && matching_collection_uri?
|
|
|
|
|
|
|
|
|
|
account = Account.where(uri: @collection_item.object_uri).first
|
|
|
|
|
account ||= ActivityPub::FetchRemoteAccountService.new.call(@collection_item.object_uri)
|
|
|
|
|
return if account.blank?
|
|
|
|
|
|
2026-03-17 16:14:30 +01:00
|
|
|
@collection_item.update!(account:, approval_uri:, state: :accepted)
|
2026-03-09 15:59:57 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
|
|
def matching_type?
|
|
|
|
|
supported_context?(@authorization) && equals_or_includes?(@authorization['type'], 'FeatureAuthorization')
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def matching_collection_uri?
|
|
|
|
|
@collection_item.collection.uri == @authorization['interactingObject']
|
|
|
|
|
end
|
|
|
|
|
end
|