Fix processing of `Link` objects in `Image` objects (#29363)
This commit is contained in:
parent
9a7802655f
commit
f3ad918950
|
@ -201,10 +201,15 @@ class ActivityPub::ProcessAccountService < BaseService
|
||||||
value = first_of_value(@json[key])
|
value = first_of_value(@json[key])
|
||||||
|
|
||||||
return if value.nil?
|
return if value.nil?
|
||||||
return value['url'] if value.is_a?(Hash)
|
|
||||||
|
|
||||||
image = fetch_resource_without_id_validation(value)
|
if value.is_a?(String)
|
||||||
image['url'] if image
|
value = fetch_resource_without_id_validation(value)
|
||||||
|
return if value.nil?
|
||||||
|
end
|
||||||
|
|
||||||
|
value = first_of_value(value['url']) if value.is_a?(Hash) && value['type'] == 'Image'
|
||||||
|
value = value['href'] if value.is_a?(Hash)
|
||||||
|
value if value.is_a?(String)
|
||||||
end
|
end
|
||||||
|
|
||||||
def public_key
|
def public_key
|
||||||
|
|
|
@ -5,7 +5,7 @@ require 'rails_helper'
|
||||||
RSpec.describe ActivityPub::ProcessAccountService, type: :service do
|
RSpec.describe ActivityPub::ProcessAccountService, type: :service do
|
||||||
subject { described_class.new }
|
subject { described_class.new }
|
||||||
|
|
||||||
context 'with property values' do
|
context 'with property values, an avatar, and a profile header' do
|
||||||
let(:payload) do
|
let(:payload) do
|
||||||
{
|
{
|
||||||
id: 'https://foo.test',
|
id: 'https://foo.test',
|
||||||
|
@ -16,19 +16,50 @@ RSpec.describe ActivityPub::ProcessAccountService, type: :service do
|
||||||
{ type: 'PropertyValue', name: 'Occupation', value: 'Unit test' },
|
{ type: 'PropertyValue', name: 'Occupation', value: 'Unit test' },
|
||||||
{ type: 'PropertyValue', name: 'non-string', value: %w(foo bar) },
|
{ type: 'PropertyValue', name: 'non-string', value: %w(foo bar) },
|
||||||
],
|
],
|
||||||
|
image: {
|
||||||
|
type: 'Image',
|
||||||
|
mediaType: 'image/png',
|
||||||
|
url: 'https://foo.test/image.png',
|
||||||
|
},
|
||||||
|
icon: {
|
||||||
|
type: 'Image',
|
||||||
|
url: [
|
||||||
|
{
|
||||||
|
mediaType: 'image/png',
|
||||||
|
href: 'https://foo.test/icon.png',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
}.with_indifferent_access
|
}.with_indifferent_access
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'parses out of attachment' do
|
before do
|
||||||
|
stub_request(:get, 'https://foo.test/image.png').to_return(request_fixture('avatar.txt'))
|
||||||
|
stub_request(:get, 'https://foo.test/icon.png').to_return(request_fixture('avatar.txt'))
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'parses property values, avatar and profile header as expected' do
|
||||||
account = subject.call('alice', 'example.com', payload)
|
account = subject.call('alice', 'example.com', payload)
|
||||||
expect(account.fields).to be_a Array
|
|
||||||
expect(account.fields.size).to eq 2
|
expect(account.fields)
|
||||||
expect(account.fields[0]).to be_a Account::Field
|
.to be_an(Array)
|
||||||
expect(account.fields[0].name).to eq 'Pronouns'
|
.and have_attributes(size: 2)
|
||||||
expect(account.fields[0].value).to eq 'They/them'
|
expect(account.fields.first)
|
||||||
expect(account.fields[1]).to be_a Account::Field
|
.to be_an(Account::Field)
|
||||||
expect(account.fields[1].name).to eq 'Occupation'
|
.and have_attributes(
|
||||||
expect(account.fields[1].value).to eq 'Unit test'
|
name: eq('Pronouns'),
|
||||||
|
value: eq('They/them')
|
||||||
|
)
|
||||||
|
expect(account.fields.last)
|
||||||
|
.to be_an(Account::Field)
|
||||||
|
.and have_attributes(
|
||||||
|
name: eq('Occupation'),
|
||||||
|
value: eq('Unit test')
|
||||||
|
)
|
||||||
|
expect(account).to have_attributes(
|
||||||
|
avatar_remote_url: 'https://foo.test/icon.png',
|
||||||
|
header_remote_url: 'https://foo.test/image.png'
|
||||||
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue