Fix cross-server conversation tracking (#37559)

This commit is contained in:
Claire 2026-01-21 13:02:41 +01:00
parent f1c32f6a11
commit dcc5c2b6f6
5 changed files with 39 additions and 22 deletions

View file

@ -379,6 +379,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
def conversation_from_uri(uri)
return nil if uri.nil?
return Conversation.find_by(id: OStatus::TagManager.instance.unique_tag_to_local_id(uri, 'Conversation')) if OStatus::TagManager.instance.local_id?(uri)
return ActivityPub::TagManager.instance.uri_to_resource(uri, Conversation) if ActivityPub::TagManager.instance.local_uri?(uri)
begin
Conversation.find_or_create_by!(uri: uri)

View file

@ -241,12 +241,6 @@ class ActivityPub::TagManager
!host.nil? && (::TagManager.instance.local_domain?(host) || ::TagManager.instance.web_domain?(host))
end
def uri_to_local_id(uri, param = :id)
path_params = Rails.application.routes.recognize_path(uri)
path_params[:username] = Rails.configuration.x.local_domain if path_params[:controller] == 'instance_actors'
path_params[param]
end
def uris_to_local_accounts(uris)
usernames = []
ids = []
@ -264,6 +258,14 @@ class ActivityPub::TagManager
uri_to_resource(uri, Account)
end
def uri_to_local_conversation(uri)
path_params = Rails.application.routes.recognize_path(uri)
return unless path_params[:controller] == 'activitypub/contexts'
account_id, conversation_id = path_params[:id].split('-')
Conversation.find_by(parent_account_id: account_id, id: conversation_id)
end
def uri_to_resource(uri, klass)
return if uri.nil?
@ -271,6 +273,8 @@ class ActivityPub::TagManager
case klass.name
when 'Account'
uris_to_local_accounts([uri]).first
when 'Conversation'
uri_to_local_conversation(uri)
else
StatusFinder.new(uri).status
end

View file

@ -11,16 +11,12 @@ class OStatus::TagManager
def unique_tag_to_local_id(tag, expected_type)
return nil unless local_id?(tag)
if ActivityPub::TagManager.instance.local_uri?(tag)
ActivityPub::TagManager.instance.uri_to_local_id(tag)
else
matches = Regexp.new("objectId=([\\d]+):objectType=#{expected_type}").match(tag)
matches[1] unless matches.nil?
end
matches = Regexp.new("objectId=([\\d]+):objectType=#{expected_type}").match(tag)
matches[1] unless matches.nil?
end
def local_id?(id)
id.start_with?("tag:#{Rails.configuration.x.local_domain}") || ActivityPub::TagManager.instance.local_uri?(id)
id.start_with?("tag:#{Rails.configuration.x.local_domain}")
end
def uri_for(target)