about summary refs log tree commit diff
path: root/app/services/activitypub/process_status_update_service.rb
diff options
context:
space:
mode:
authorClaire <claire.github-309c@sitedethib.com>2022-03-12 09:30:31 +0100
committerGitHub <noreply@github.com>2022-03-12 09:30:31 +0100
commitd3aa9cf7744eede43c5c1b9097eb1f0720185ccd (patch)
tree46a2af52c413cea56672d7212850ea3002690f6f /app/services/activitypub/process_status_update_service.rb
parent46ad7fea9d67631f54dd1ef45114a08cd2c5db73 (diff)
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
Diffstat (limited to 'app/services/activitypub/process_status_update_service.rb')
-rw-r--r--app/services/activitypub/process_status_update_service.rb12
1 files changed, 12 insertions, 0 deletions
diff --git a/app/services/activitypub/process_status_update_service.rb b/app/services/activitypub/process_status_update_service.rb
index 1260c0482..70e9cb7d9 100644
--- a/app/services/activitypub/process_status_update_service.rb
+++ b/app/services/activitypub/process_status_update_service.rb
@@ -15,6 +15,8 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
     # Only native types can be updated at the moment
     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
     RedisLock.acquire(lock_options) do |lock|
       if lock.acquired?
@@ -37,6 +39,8 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
         raise Mastodon::RaceConditionError
       end
     end
+
+    forward_activity! if significant_changes? && @status_parser.edited_at.present? && @status_parser.edited_at > last_edit_date
   end
 
   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.perform_at(poll.expires_at + 5.minutes, poll.id)
   end
+
+  def forward_activity!
+    forwarder.forward! if forwarder.forwardable?
+  end
+
+  def forwarder
+    @forwarder ||= ActivityPub::Forwarder.new(@account, @json, @status)
+  end
 end