Add tombstones for remote statuses (#9830)
* Add Tombstone model to remember object deletion * Do not recreate a status if it has been deleted * Record Tombstone for remote deleted items Also, only record deleted items from same-host actors * Clear an user's tombstones when their key change
This commit is contained in:
parent
31f396b57d
commit
75b1488cf4
6 changed files with 57 additions and 3 deletions
|
@ -6,6 +6,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'])
|
||||
|
||||
RedisLock.acquire(lock_options) do |lock|
|
||||
if lock.acquired?
|
||||
|
|
|
@ -21,8 +21,9 @@ class ActivityPub::Activity::Delete < ActivityPub::Activity
|
|||
def delete_note
|
||||
return if object_uri.nil?
|
||||
|
||||
RedisLock.acquire(lock_options) do |_lock|
|
||||
delete_later!(object_uri)
|
||||
unless invalid_origin?(object_uri)
|
||||
RedisLock.acquire(lock_options) { |_lock| delete_later!(object_uri) }
|
||||
Tombstone.find_or_create_by(uri: object_uri, account: @account)
|
||||
end
|
||||
|
||||
@status = Status.find_by(uri: object_uri, account: @account)
|
||||
|
@ -74,4 +75,13 @@ class ActivityPub::Activity::Delete < ActivityPub::Activity
|
|||
def lock_options
|
||||
{ redis: Redis.current, key: "create:#{object_uri}" }
|
||||
end
|
||||
|
||||
def invalid_origin?(url)
|
||||
return true if unsupported_uri_scheme?(url)
|
||||
|
||||
needle = Addressable::URI.parse(url).host
|
||||
haystack = Addressable::URI.parse(@account.uri).host
|
||||
|
||||
!haystack.casecmp(needle).zero?
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue