36 lines
1,019 B
Ruby
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
|