class ActivityPub::Activity::Create < ActivityPub::Activity
def perform
- return if unsupported_object_type? || invalid_origin?(@object['id'])
- return if Tombstone.exists?(uri: @object['id'])
+ return if unsupported_object_type? || invalid_origin?(@object['id']) || Tombstone.exists?(uri: @object['id']) || !related_to_local_activity?
RedisLock.acquire(lock_options) do |lock|
if lock.acquired?
!replied_to_status.nil? && replied_to_status.account.local?
end
+ def related_to_local_activity?
+ fetch? || followed_by_local_accounts? || requested_through_relay? ||
+ responds_to_followed_account? || addresses_local_accounts?
+ end
+
+ def fetch?
+ !@options[:delivery]
+ end
+
+ def followed_by_local_accounts?
+ @account.passive_relationships.exists?
+ end
+
+ def requested_through_relay?
+ @options[:relayed_through_account] && Relay.find_by(inbox_url: @options[:relayed_through_account].inbox_url)&.enabled?
+ end
+
+ def responds_to_followed_account?
+ !replied_to_status.nil? && (replied_to_status.account.local? || replied_to_status.account.passive_relationships.exists?)
+ end
+
+ def addresses_local_accounts?
+ return true if @options[:delivered_to_account_id]
+
+ local_usernames = (as_array(@object['to']) + as_array(@object['cc'])).uniq.select { |uri| ActivityPub::TagManager.instance.local_uri?(uri) }.map { |uri| ActivityPub::TagManager.instance.uri_to_local_id(uri, :username) }
+
+ return false if local_usernames.empty?
+
+ Account.local.where(username: local_usernames).exists?
+ end
+
def forward_for_reply
return unless @json['signature'].present? && reply_to_local?
ActivityPub::RawDistributionWorker.perform_async(Oj.dump(@json), replied_to_status.account_id, [@account.preferred_inbox_url])
sidekiq_options backtrace: true
def perform(account_id, body, delivered_to_account_id = nil)
- ActivityPub::ProcessCollectionService.new.call(body, Account.find(account_id), override_timestamps: true, delivered_to_account_id: delivered_to_account_id)
+ ActivityPub::ProcessCollectionService.new.call(body, Account.find(account_id), override_timestamps: true, delivered_to_account_id: delivered_to_account_id, delivery: true)
end
end