Fix Updates being forwarded even when not processable or causing no change (#17699)

* Fix Updates being forwarded even when not processable or causing no change

* Refactor and ensure status edit is strictly newer than last known edit
This commit is contained in:
Claire 2022-03-12 09:30:31 +01:00 committed by GitHub
parent 46ad7fea9d
commit d3aa9cf774
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 12 additions and 0 deletions

View File

@ -15,6 +15,8 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
# Only native types can be updated at the moment # Only native types can be updated at the moment
return if !expected_type? || already_updated_more_recently? return if !expected_type? || already_updated_more_recently?
last_edit_date = status.edited_at.presence || status.created_at
# Only allow processing one create/update per status at a time # Only allow processing one create/update per status at a time
RedisLock.acquire(lock_options) do |lock| RedisLock.acquire(lock_options) do |lock|
if lock.acquired? if lock.acquired?
@ -37,6 +39,8 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
raise Mastodon::RaceConditionError raise Mastodon::RaceConditionError
end end
end end
forward_activity! if significant_changes? && @status_parser.edited_at.present? && @status_parser.edited_at > last_edit_date
end end
private private
@ -263,4 +267,12 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
PollExpirationNotifyWorker.remove_from_scheduled(poll.id) if @previous_expires_at.present? && @previous_expires_at > poll.expires_at PollExpirationNotifyWorker.remove_from_scheduled(poll.id) if @previous_expires_at.present? && @previous_expires_at > poll.expires_at
PollExpirationNotifyWorker.perform_at(poll.expires_at + 5.minutes, poll.id) PollExpirationNotifyWorker.perform_at(poll.expires_at + 5.minutes, poll.id)
end end
def forward_activity!
forwarder.forward! if forwarder.forwardable?
end
def forwarder
@forwarder ||= ActivityPub::Forwarder.new(@account, @json, @status)
end
end end