|
|
@@ -2,8 +2,7 @@ |
|
|
|
|
|
|
|
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? |
|
|
@@ -337,6 +336,37 @@ class ActivityPub::Activity::Create < ActivityPub::Activity |
|
|
|
!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]) |
|
|
|