Browse Source

Fix potential duplicate handling of quote accept/reject/delete (#37537)

pull/1371/head
Claire 2 months ago committed by Misty De Meo
parent
commit
ce2ca4f7bf
No known key found for this signature in database
GPG Key ID: 76CF846A2F674B2C
  1. 2
      app/lib/activitypub/activity/accept.rb
  2. 2
      app/lib/activitypub/activity/delete.rb
  3. 4
      app/models/quote.rb

2
app/lib/activitypub/activity/accept.rb

@ -46,7 +46,7 @@ class ActivityPub::Activity::Accept < ActivityPub::Activity
def accept_quote!(quote)
approval_uri = value_or_id(first_of_value(@json['result']))
return if unsupported_uri_scheme?(approval_uri) || quote.quoted_account != @account || !quote.status.local?
return if unsupported_uri_scheme?(approval_uri) || quote.quoted_account != @account || !quote.status.local? || !quote.pending?
# NOTE: we are not going through `ActivityPub::VerifyQuoteService` as the `Accept` is as authoritative
# as the stamp, but this means we are not checking the stamp, which may lead to inconsistencies

2
app/lib/activitypub/activity/delete.rb

@ -56,7 +56,7 @@ class ActivityPub::Activity::Delete < ActivityPub::Activity
end
def revoke_quote
@quote = Quote.find_by(approval_uri: object_uri, quoted_account: @account)
@quote = Quote.find_by(approval_uri: object_uri, quoted_account: @account, state: [:pending, :accepted])
return if @quote.nil?
ActivityPub::Forwarder.new(@account, @json, @quote.status).forward! if @quote.status.present?

4
app/models/quote.rb

@ -51,9 +51,9 @@ class Quote < ApplicationRecord
def reject!
if accepted?
update!(state: :revoked)
update!(state: :revoked, approval_uri: nil)
elsif !revoked?
update!(state: :rejected)
update!(state: :rejected, approval_uri: nil)
end
end

Loading…
Cancel
Save