mastodon/app/services/activitypub/process_collection_synchronization_service.rb

36 lines
1,019 B
Ruby

# frozen_string_literal: true
class ActivityPub::ProcessCollectionSynchronizationService < BaseService
include JsonLdHelper
def call(account, value)
return unless collection_synchronization_enabled?
@account = account
@params = parse_value(value)
return if unknown_collection? || collection_up_to_date?
ActivityPub::FollowersSynchronizationWorker.perform_async(@account.id, @params['url'])
rescue Parslet::ParseFailed
Rails.logger.warn 'Error parsing Collection-Synchronization header'
end
private
def parse_value(value)
SignatureVerification::SignatureParamsTransformer.new.apply(SignatureVerification::SignatureParamsParser.new.parse(value))
end
def unknown_collection?
@params['collectionId'] != @account.followers_url || invalid_origin?(@params['url'])
end
def collection_up_to_date?
@account.local_followers_hash == @params['digest']
end
def collection_synchronization_enabled?
ENV['DISABLE_FOLLOWERS_SYNCHRONIZATION'] != 'true'
end
end