Fix media not being marked sensitive when client sets a CW but no text (#13277)
Mastodon enforces the “sensitive” flag on media attachments whenever a toot is posted with a Content Warning. However, it does so *after* potentially converting the Content Warning to toot text (when there is no toot text), which leads to inconsistent and surprising behavior for API clients. This commit fixes this inconsistency.main
parent
858d0dd168
commit
f08f880f58
|
@ -48,6 +48,7 @@ class PostStatusService < BaseService
|
||||||
private
|
private
|
||||||
|
|
||||||
def preprocess_attributes!
|
def preprocess_attributes!
|
||||||
|
@sensitive = (@options[:sensitive].nil? ? @account.user&.setting_default_sensitive : @options[:sensitive]) || @options[:spoiler_text].present?
|
||||||
@text = @options.delete(:spoiler_text) if @text.blank? && @options[:spoiler_text].present?
|
@text = @options.delete(:spoiler_text) if @text.blank? && @options[:spoiler_text].present?
|
||||||
@visibility = @options[:visibility] || @account.user&.setting_default_privacy
|
@visibility = @options[:visibility] || @account.user&.setting_default_privacy
|
||||||
@visibility = :unlisted if @visibility&.to_sym == :public && @account.silenced?
|
@visibility = :unlisted if @visibility&.to_sym == :public && @account.silenced?
|
||||||
|
@ -157,7 +158,7 @@ class PostStatusService < BaseService
|
||||||
media_attachments: @media || [],
|
media_attachments: @media || [],
|
||||||
thread: @in_reply_to,
|
thread: @in_reply_to,
|
||||||
poll_attributes: poll_attributes,
|
poll_attributes: poll_attributes,
|
||||||
sensitive: (@options[:sensitive].nil? ? @account.user&.setting_default_sensitive : @options[:sensitive]) || @options[:spoiler_text].present?,
|
sensitive: @sensitive,
|
||||||
spoiler_text: @options[:spoiler_text] || '',
|
spoiler_text: @options[:spoiler_text] || '',
|
||||||
visibility: @visibility,
|
visibility: @visibility,
|
||||||
language: language_from_option(@options[:language]) || @account.user&.setting_default_language&.presence || LanguageDetector.instance.detect(@text, @account),
|
language: language_from_option(@options[:language]) || @account.user&.setting_default_language&.presence || LanguageDetector.instance.detect(@text, @account),
|
||||||
|
|
|
@ -79,6 +79,13 @@ RSpec.describe PostStatusService, type: :service do
|
||||||
expect(status.spoiler_text).to eq spoiler_text
|
expect(status.spoiler_text).to eq spoiler_text
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'creates a sensitive status when there is a CW but no text' do
|
||||||
|
status = subject.call(Fabricate(:account), text: '', spoiler_text: 'foo')
|
||||||
|
|
||||||
|
expect(status).to be_persisted
|
||||||
|
expect(status).to be_sensitive
|
||||||
|
end
|
||||||
|
|
||||||
it 'creates a status with empty default spoiler text' do
|
it 'creates a status with empty default spoiler text' do
|
||||||
status = create_status_with_options(spoiler_text: nil)
|
status = create_status_with_options(spoiler_text: nil)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue