@ -2,8 +2,7 @@
class ActivityPub :: Activity :: Create < ActivityPub :: Activity
class ActivityPub :: Activity :: Create < ActivityPub :: Activity
def perform
def perform
return if unsupported_object_type? || invalid_origin? ( @object [ 'id' ] )
return if unsupported_object_type? || invalid_origin? ( @object [ 'id' ] ) || Tombstone . exists? ( uri : @object [ 'id' ] ) || ! related_to_local_activity?
return if Tombstone . exists? ( uri : @object [ 'id' ] )
RedisLock . acquire ( lock_options ) do | lock |
RedisLock . acquire ( lock_options ) do | lock |
if lock . acquired?
if lock . acquired?
@ -337,6 +336,37 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
! replied_to_status . nil? && replied_to_status . account . local?
! replied_to_status . nil? && replied_to_status . account . local?
end
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
def forward_for_reply
return unless @json [ 'signature' ] . present? && reply_to_local?
return unless @json [ 'signature' ] . present? && reply_to_local?
ActivityPub :: RawDistributionWorker . perform_async ( Oj . dump ( @json ) , replied_to_status . account_id , [ @account . preferred_inbox_url ] )
ActivityPub :: RawDistributionWorker . perform_async ( Oj . dump ( @json ) , replied_to_status . account_id , [ @account . preferred_inbox_url ] )