diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index 22b2becea7..0d4009fc8d 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -110,7 +110,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity def process_status_params @status_parser = ActivityPub::Parser::StatusParser.new(@json, followers_collection: @account.followers_url, object: @object) - attachment_ids = process_attachments.take(4).map(&:id) + attachment_ids = process_attachments.take(Rails.configuration.x.mastodon.statuses[:max_media_attachments][:remote]).map(&:id) @params = { uri: @status_parser.uri, @@ -260,7 +260,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity as_array(@object['attachment']).each do |attachment| media_attachment_parser = ActivityPub::Parser::MediaAttachmentParser.new(attachment) - next if media_attachment_parser.remote_url.blank? || media_attachments.size >= 4 + next if media_attachment_parser.remote_url.blank? || media_attachments.size >= Rails.configuration.x.mastodon.statuses[:max_media_attachments][:remote] begin media_attachment = MediaAttachment.create( diff --git a/app/serializers/rest/instance_serializer.rb b/app/serializers/rest/instance_serializer.rb index e7d4a646d4..ccaea5a0df 100644 --- a/app/serializers/rest/instance_serializer.rb +++ b/app/serializers/rest/instance_serializer.rb @@ -58,7 +58,7 @@ class REST::InstanceSerializer < ActiveModel::Serializer statuses: { max_characters: StatusLengthValidator::MAX_CHARS, - max_media_attachments: 4, + max_media_attachments: Rails.configuration.x.mastodon.statuses[:max_media_attachments][:local], characters_reserved_per_url: StatusLengthValidator::URL_PLACEHOLDER_CHARS, supported_mime_types: HtmlAwareFormatter::STATUS_MIME_TYPES, }, diff --git a/app/serializers/rest/v1/instance_serializer.rb b/app/serializers/rest/v1/instance_serializer.rb index c6cbaba489..087dd46c02 100644 --- a/app/serializers/rest/v1/instance_serializer.rb +++ b/app/serializers/rest/v1/instance_serializer.rb @@ -77,7 +77,7 @@ class REST::V1::InstanceSerializer < ActiveModel::Serializer statuses: { max_characters: StatusLengthValidator::MAX_CHARS, - max_media_attachments: 4, + max_media_attachments: Rails.configuration.x.mastodon.statuses[:max_media_attachments][:local], characters_reserved_per_url: StatusLengthValidator::URL_PLACEHOLDER_CHARS, supported_mime_types: HtmlAwareFormatter::STATUS_MIME_TYPES, }, diff --git a/app/services/activitypub/process_status_update_service.rb b/app/services/activitypub/process_status_update_service.rb index fb2b33114e..5adb8ab085 100644 --- a/app/services/activitypub/process_status_update_service.rb +++ b/app/services/activitypub/process_status_update_service.rb @@ -73,7 +73,7 @@ class ActivityPub::ProcessStatusUpdateService < BaseService as_array(@json['attachment']).each do |attachment| media_attachment_parser = ActivityPub::Parser::MediaAttachmentParser.new(attachment) - next if media_attachment_parser.remote_url.blank? || @next_media_attachments.size > 4 + next if media_attachment_parser.remote_url.blank? || @next_media_attachments.size > Rails.configuration.x.mastodon.statuses[:max_media_attachments][:remote] begin media_attachment = previous_media_attachments.find { |previous_media_attachment| previous_media_attachment.remote_url == media_attachment_parser.remote_url } diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb index 964ca91a67..a2219702f1 100644 --- a/app/services/post_status_service.rb +++ b/app/services/post_status_service.rb @@ -146,9 +146,9 @@ class PostStatusService < BaseService return end - raise Mastodon::ValidationError, I18n.t('media_attachments.validations.too_many') if @options[:media_ids].size > 4 || @options[:poll].present? + raise Mastodon::ValidationError, I18n.t('media_attachments.validations.too_many') if @options[:media_ids].size > Rails.configuration.x.mastodon.statuses[:max_media_attachments][:local] || @options[:poll].present? - @media = @account.media_attachments.where(status_id: nil).where(id: @options[:media_ids].take(4).map(&:to_i)) + @media = @account.media_attachments.where(status_id: nil).where(id: @options[:media_ids].take(Rails.configuration.x.mastodon.statuses[:max_media_attachments][:local]).map(&:to_i)) raise Mastodon::ValidationError, I18n.t('media_attachments.validations.images_and_video') if @media.size > 1 && @media.find(&:audio_or_video?) raise Mastodon::ValidationError, I18n.t('media_attachments.validations.not_ready') if @media.any?(&:not_processed?) diff --git a/app/services/update_status_service.rb b/app/services/update_status_service.rb index b354a1b607..2d4f315a6f 100644 --- a/app/services/update_status_service.rb +++ b/app/services/update_status_service.rb @@ -70,9 +70,9 @@ class UpdateStatusService < BaseService def validate_media! return [] if @options[:media_ids].blank? || !@options[:media_ids].is_a?(Enumerable) - raise Mastodon::ValidationError, I18n.t('media_attachments.validations.too_many') if @options[:media_ids].size > 4 || @options[:poll].present? + raise Mastodon::ValidationError, I18n.t('media_attachments.validations.too_many') if @options[:media_ids].size > Rails.configuration.x.mastodon.statuses[:max_media_attachments][:local] || @options[:poll].present? - media_attachments = @status.account.media_attachments.where(status_id: [nil, @status.id]).where(scheduled_status_id: nil).where(id: @options[:media_ids].take(4).map(&:to_i)).to_a + media_attachments = @status.account.media_attachments.where(status_id: [nil, @status.id]).where(scheduled_status_id: nil).where(id: @options[:media_ids].take(Rails.configuration.x.mastodon.statuses[:max_media_attachments][:local]).map(&:to_i)).to_a raise Mastodon::ValidationError, I18n.t('media_attachments.validations.images_and_video') if media_attachments.size > 1 && media_attachments.find(&:audio_or_video?) raise Mastodon::ValidationError, I18n.t('media_attachments.validations.not_ready') if media_attachments.any?(&:not_processed?) diff --git a/config/initializers/mastodon.rb b/config/initializers/mastodon.rb new file mode 100644 index 0000000000..cd51cc2e8f --- /dev/null +++ b/config/initializers/mastodon.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +module Mastodon + class Application < Rails::Application + config.x.mastodon = config_for(:mastodon) + end +end diff --git a/config/mastodon.yml b/config/mastodon.yml new file mode 100644 index 0000000000..dceb983d12 --- /dev/null +++ b/config/mastodon.yml @@ -0,0 +1,5 @@ +shared: + statuses: + max_media_attachments: + local: 4 + remote: 16