Improve ActivityPub/OStatus compatibility (#4632)
*Note: OStatus URIs are invalid for ActivityPub. But we have them for as long as we want to keep old OStatus-sourced content and as long as we remain OStatus-compatible.* - In Announce handling, if object URI is not a URL, fallback to object URL - Do not use specialized ThreadResolveWorker, rely on generalized handling - When serializing notes, if parent's URI is not a URL, use parent's URL
This commit is contained in:
		
					parent
					
						
							
								774b8661bc
							
						
					
				
			
			
				commit
				
					
						412ea87306
					
				
			
		
					 5 changed files with 20 additions and 37 deletions
				
			
		|  | @ -3,7 +3,7 @@ | ||||||
| class ActivityPub::Activity::Announce < ActivityPub::Activity | class ActivityPub::Activity::Announce < ActivityPub::Activity | ||||||
|   def perform |   def perform | ||||||
|     original_status   = status_from_uri(object_uri) |     original_status   = status_from_uri(object_uri) | ||||||
|     original_status = ActivityPub::FetchRemoteStatusService.new.call(object_uri) if original_status.nil? |     original_status ||= fetch_remote_original_status | ||||||
| 
 | 
 | ||||||
|     return if original_status.nil? || delete_arrived_first?(@json['id']) |     return if original_status.nil? || delete_arrived_first?(@json['id']) | ||||||
| 
 | 
 | ||||||
|  | @ -11,4 +11,14 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity | ||||||
|     distribute(status) |     distribute(status) | ||||||
|     status |     status | ||||||
|   end |   end | ||||||
|  | 
 | ||||||
|  |   private | ||||||
|  | 
 | ||||||
|  |   def fetch_remote_original_status | ||||||
|  |     if object_uri.start_with?('http') | ||||||
|  |       ActivityPub::FetchRemoteStatusService.new.call(object_uri) | ||||||
|  |     elsif @object['url'].present? | ||||||
|  |       ::FetchRemoteStatusService.new.call(@object['url']) | ||||||
|  |     end | ||||||
|  |   end | ||||||
| end | end | ||||||
|  |  | ||||||
|  | @ -91,7 +91,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity | ||||||
| 
 | 
 | ||||||
|   def resolve_thread(status) |   def resolve_thread(status) | ||||||
|     return unless status.reply? && status.thread.nil? |     return unless status.reply? && status.thread.nil? | ||||||
|     ActivityPub::ThreadResolveWorker.perform_async(status.id, @object['inReplyTo']) |     ThreadResolveWorker.perform_async(status.id, @object['inReplyTo']) | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def conversation_from_uri(uri) |   def conversation_from_uri(uri) | ||||||
|  |  | ||||||
|  | @ -27,7 +27,13 @@ class ActivityPub::NoteSerializer < ActiveModel::Serializer | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def in_reply_to |   def in_reply_to | ||||||
|     ActivityPub::TagManager.instance.uri_for(object.thread) if object.reply? |     return unless object.reply? | ||||||
|  | 
 | ||||||
|  |     if object.thread.uri.nil? || object.thread.uri.start_with?('http') | ||||||
|  |       ActivityPub::TagManager.instance.uri_for(object.thread) | ||||||
|  |     else | ||||||
|  |       object.thread.url | ||||||
|  |     end | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def published |   def published | ||||||
|  |  | ||||||
|  | @ -1,17 +0,0 @@ | ||||||
| # frozen_string_literal: true |  | ||||||
| 
 |  | ||||||
| class ActivityPub::ThreadResolveWorker |  | ||||||
|   include Sidekiq::Worker |  | ||||||
| 
 |  | ||||||
|   sidekiq_options queue: 'pull', retry: false |  | ||||||
| 
 |  | ||||||
|   def perform(child_status_id, parent_uri) |  | ||||||
|     child_status  = Status.find(child_status_id) |  | ||||||
|     parent_status = ActivityPub::FetchRemoteStatusService.new.call(parent_uri) |  | ||||||
| 
 |  | ||||||
|     return if parent_status.nil? |  | ||||||
| 
 |  | ||||||
|     child_status.thread = parent_status |  | ||||||
|     child_status.save! |  | ||||||
|   end |  | ||||||
| end |  | ||||||
|  | @ -1,16 +0,0 @@ | ||||||
| require 'rails_helper' |  | ||||||
| 
 |  | ||||||
| describe ActivityPub::ThreadResolveWorker do |  | ||||||
|   subject { described_class.new } |  | ||||||
| 
 |  | ||||||
|   let(:status) { Fabricate(:status) } |  | ||||||
|   let(:parent) { Fabricate(:status) } |  | ||||||
| 
 |  | ||||||
|   describe '#perform' do |  | ||||||
|     it 'gets parent from ActivityPub::FetchRemoteStatusService and glues them together' do |  | ||||||
|       allow(ActivityPub::FetchRemoteStatusService).to receive(:new).and_return(double(:service, call: parent)) |  | ||||||
|       subject.perform(status.id, 'http://example.com/123') |  | ||||||
|       expect(status.reload.in_reply_to_id).to eq parent.id |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| end |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue