Limit maximum visibility of local silenced users to unlisted (#9583)

Fixes #9580
This commit is contained in:
ThibG 2018-12-24 19:06:14 +01:00 committed by Eugen Rochko
parent e25947db4a
commit 5f387995d9
2 changed files with 11 additions and 1 deletions

View File

@ -23,13 +23,16 @@ class PostStatusService < BaseService
status = nil status = nil
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 = :unlisted if visibility == :public && account.silenced
ApplicationRecord.transaction do ApplicationRecord.transaction do
status = account.statuses.create!(text: text, status = account.statuses.create!(text: text,
media_attachments: media || [], media_attachments: media || [],
thread: in_reply_to, thread: in_reply_to,
sensitive: (options[:sensitive].nil? ? account.user&.setting_default_sensitive : options[:sensitive]) || options[:spoiler_text].present?, sensitive: (options[:sensitive].nil? ? account.user&.setting_default_sensitive : options[:sensitive]) || options[:spoiler_text].present?,
spoiler_text: options[:spoiler_text] || '', spoiler_text: options[:spoiler_text] || '',
visibility: options[:visibility] || account.user&.setting_default_privacy, 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),
application: options[:application]) application: options[:application])
end end

View File

@ -68,6 +68,13 @@ RSpec.describe PostStatusService, type: :service do
expect(status.visibility).to eq "private" expect(status.visibility).to eq "private"
end end
it 'creates a status with limited visibility for silenced users' do
status = subject.call(Fabricate(:account, silenced: true), 'test', nil, visibility: :public)
expect(status).to be_persisted
expect(status.visibility).to eq "unlisted"
end
it 'creates a status for the given application' do it 'creates a status for the given application' do
application = Fabricate(:application) application = Fabricate(:application)