From 650820d62d46e803083b1178a95ba2a29f7d8b6e Mon Sep 17 00:00:00 2001 From: ThibG Date: Mon, 4 Nov 2019 13:00:16 +0100 Subject: [PATCH] Fix remote media descriptions being cut off at 420 chars (#12262) * Fix remote media descriptions being cut off at 420 chars Fixes #12258 * Fix tests --- app/models/media_attachment.rb | 6 +++-- spec/lib/activitypub/activity/create_spec.rb | 26 ++++++++++++++++++++ spec/models/media_attachment_spec.rb | 4 +-- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb index 1373774224..1f9d92b22c 100644 --- a/app/models/media_attachment.rb +++ b/app/models/media_attachment.rb @@ -26,6 +26,8 @@ class MediaAttachment < ApplicationRecord enum type: [:image, :gifv, :video, :unknown, :audio] + MAX_DESCRIPTION_LENGTH = 1_500 + IMAGE_FILE_EXTENSIONS = %w(.jpg .jpeg .png .gif).freeze VIDEO_FILE_EXTENSIONS = %w(.webm .mp4 .m4v .mov).freeze AUDIO_FILE_EXTENSIONS = %w(.ogg .oga .mp3 .wav .flac .opus .aac .m4a .3gp .wma).freeze @@ -139,7 +141,7 @@ class MediaAttachment < ApplicationRecord include Attachmentable validates :account, presence: true - validates :description, length: { maximum: 1_500 }, if: :local? + validates :description, length: { maximum: MAX_DESCRIPTION_LENGTH }, if: :local? scope :attached, -> { where.not(status_id: nil).or(where.not(scheduled_status_id: nil)) } scope :unattached, -> { where(status_id: nil, scheduled_status_id: nil) } @@ -243,7 +245,7 @@ class MediaAttachment < ApplicationRecord end def prepare_description - self.description = description.strip[0...420] unless description.nil? + self.description = description.strip[0...MAX_DESCRIPTION_LENGTH] unless description.nil? end def set_type_and_extension diff --git a/spec/lib/activitypub/activity/create_spec.rb b/spec/lib/activitypub/activity/create_spec.rb index 412609de40..b709954a30 100644 --- a/spec/lib/activitypub/activity/create_spec.rb +++ b/spec/lib/activitypub/activity/create_spec.rb @@ -261,6 +261,32 @@ RSpec.describe ActivityPub::Activity::Create do end end + + context 'with media attachments with long description' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + attachment: [ + { + type: 'Document', + mediaType: 'image/png', + url: 'http://example.com/attachment.png', + name: '*' * 1500, + }, + ], + } + end + + it 'creates status' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.media_attachments.map(&:description)).to include('*' * 1500) + end + end + context 'with media attachments with focal points' do let(:object_json) do { diff --git a/spec/models/media_attachment_spec.rb b/spec/models/media_attachment_spec.rb index 266cd49203..7ddfba7ed9 100644 --- a/spec/models/media_attachment_spec.rb +++ b/spec/models/media_attachment_spec.rb @@ -136,10 +136,10 @@ RSpec.describe MediaAttachment, type: :model do end describe 'descriptions for remote attachments' do - it 'are cut off at 140 characters' do + it 'are cut off at 1500 characters' do media = Fabricate(:media_attachment, description: 'foo' * 1000, remote_url: 'http://example.com/blah.jpg') - expect(media.description.size).to be <= 420 + expect(media.description.size).to be <= 1_500 end end end