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:
		@@ -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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user