From e697d441448453fb6b33b8a7aebca39149581cb3 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 10 Jun 2026 10:46:36 +0200 Subject: [PATCH] Fix avatar and profile header descriptions not being serialized over ActivityPub (#39352) --- app/serializers/activitypub/actor_serializer.rb | 14 ++++++++++++-- app/serializers/activitypub/image_serializer.rb | 9 +++++++++ .../activitypub/actor_serializer_spec.rb | 10 ++++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/app/serializers/activitypub/actor_serializer.rb b/app/serializers/activitypub/actor_serializer.rb index 38b0878b1a..4244f4f177 100644 --- a/app/serializers/activitypub/actor_serializer.rb +++ b/app/serializers/activitypub/actor_serializer.rb @@ -44,6 +44,16 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer end end + class ImageWithDescription < SimpleDelegator + attr_reader :description + + def initialize(object, description) + super(object) + + @description = description + end + end + has_one :endpoints, serializer: EndpointsSerializer has_one :icon, serializer: ActivityPub::ImageSerializer, if: :avatar_exists? @@ -120,11 +130,11 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer end def icon - object.avatar + ImageWithDescription.new(object.avatar, object.avatar_description) end def image - object.header + ImageWithDescription.new(object.header, object.header_description) end def public_key diff --git a/app/serializers/activitypub/image_serializer.rb b/app/serializers/activitypub/image_serializer.rb index 1060f96914..c6513c4dc4 100644 --- a/app/serializers/activitypub/image_serializer.rb +++ b/app/serializers/activitypub/image_serializer.rb @@ -7,6 +7,7 @@ class ActivityPub::ImageSerializer < ActivityPub::Serializer attributes :type, :media_type, :url attribute :focal_point, if: :focal_point? + attribute :summary, if: :summary? def type 'Image' @@ -27,4 +28,12 @@ class ActivityPub::ImageSerializer < ActivityPub::Serializer def focal_point [object.meta['focus']['x'], object.meta['focus']['y']] end + + def summary? + object.respond_to?(:description) && object.description.present? + end + + def summary + object.description + end end diff --git a/spec/serializers/activitypub/actor_serializer_spec.rb b/spec/serializers/activitypub/actor_serializer_spec.rb index 661890f33b..1c8542a7d3 100644 --- a/spec/serializers/activitypub/actor_serializer_spec.rb +++ b/spec/serializers/activitypub/actor_serializer_spec.rb @@ -74,4 +74,14 @@ RSpec.describe ActivityPub::ActorSerializer do end end end + + describe 'avatar description' do + let(:record) { Fabricate(:account, avatar: attachment_fixture('avatar.gif'), avatar_description: 'test') } + + it 'includes an `icon` with the appropraite `summary`' do + expect(subject).to include('icon' => a_hash_including( + 'summary' => 'test' + )) + end + end end