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 URLgh/stable
parent
774b8661bc
commit
412ea87306
|
@ -2,8 +2,8 @@
|
||||||
|
|
||||||
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
|
|
Reference in New Issue