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:
		
							parent
							
								
									46ad7fea9d
								
							
						
					
					
						commit
						d3aa9cf774
					
				@ -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
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user