Add: #605 リモート投稿に適用するセンシティブワード設定 (#612)

This commit is contained in:
KMY(雪あすか) 2024-02-27 10:14:42 +09:00 committed by GitHub
parent 7d96d5828e
commit 9dd11117db
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 149 additions and 11 deletions

View file

@ -34,7 +34,9 @@ module Admin
def test_words
sensitive_words = settings_params['sensitive_words'].split(/\r\n|\r|\n/)
sensitive_words_for_full = settings_params['sensitive_words_for_full'].split(/\r\n|\r|\n/)
Admin::NgWord.reject_with_custom_words?('Sample text', sensitive_words + sensitive_words_for_full)
sensitive_words_all = settings_params['sensitive_words_all'].split(/\r\n|\r|\n/)
sensitive_words_all_for_full = settings_params['sensitive_words_all_for_full'].split(/\r\n|\r|\n/)
Admin::NgWord.reject_with_custom_words?('Sample text', sensitive_words + sensitive_words_for_full + sensitive_words_all + sensitive_words_all_for_full)
end
def after_update_redirect_path

View file

@ -81,6 +81,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
@raw_mention_uris = []
process_status_params
process_sensitive_words
process_tags
process_audience
@ -144,6 +145,14 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
}
end
def process_sensitive_words
return unless %i(public public_unlisted login).include?(@params[:visibility].to_sym) && Admin::SensitiveWord.sensitive?(@params[:text], @params[:spoiler_text], local: false)
@params[:text] = Admin::SensitiveWord.modified_text(@params[:text], @params[:spoiler_text])
@params[:spoiler_text] = Admin::SensitiveWord.alternative_text
@params[:sensitive] = true
end
def valid_status?
valid = true
valid = false if valid && !valid_status_for_ng_rule?

View file

@ -2,8 +2,13 @@
class Admin::SensitiveWord
class << self
def sensitive?(text, spoiler_text)
def sensitive?(text, spoiler_text, local: true)
exposure_text = spoiler_text.presence || text
sensitive = (spoiler_text.blank? && sensitive_words_all.any? { |word| include?(text, word) }) ||
sensitive_words_all_for_full.any? { |word| include?(exposure_text, word) }
return sensitive if sensitive || !local
(spoiler_text.blank? && sensitive_words.any? { |word| include?(text, word) }) ||
sensitive_words_for_full.any? { |word| include?(exposure_text, word) }
end
@ -12,6 +17,10 @@ class Admin::SensitiveWord
spoiler_text.present? ? "#{spoiler_text}\n\n#{text}" : text
end
def alternative_text
Setting.auto_warning_text.presence || I18n.t('admin.sensitive_words.alert') || 'CW'
end
private
def include?(text, word)
@ -29,5 +38,13 @@ class Admin::SensitiveWord
def sensitive_words_for_full
Setting.sensitive_words_for_full || []
end
def sensitive_words_all
Setting.sensitive_words_all || []
end
def sensitive_words_all_for_full
Setting.sensitive_words_all_for_full || []
end
end
end

View file

@ -53,6 +53,9 @@ class Form::AdminSettings
post_stranger_mentions_max
sensitive_words
sensitive_words_for_full
sensitive_words_all
sensitive_words_all_for_full
auto_warning_text
authorized_fetch
receive_other_servers_emoji_reaction
streaming_other_servers_emoji_reaction
@ -127,6 +130,8 @@ class Form::AdminSettings
ng_words_for_stranger_mention
sensitive_words
sensitive_words_for_full
sensitive_words_all
sensitive_words_all_for_full
emoji_reaction_disallow_domains
permit_new_account_domains
).freeze

View file

@ -210,6 +210,8 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
@status.sensitive = @account.sensitized? || @status_parser.sensitive || false
@status.language = @status_parser.language
process_sensitive_words
@significant_changes = text_significantly_changed? || @status.spoiler_text_changed? || @media_attachments_changed || @poll_changed
@status.edited_at = @status_parser.edited_at if significant_changes?
@ -217,6 +219,14 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
@status.save!
end
def process_sensitive_words
return unless %i(public public_unlisted login).include?(@status.visibility.to_sym) && Admin::SensitiveWord.sensitive?(@status.text, @status.spoiler_text, local: false)
@status.text = Admin::SensitiveWord.modified_text(@status.text, @status.spoiler_text)
@status.spoiler_text = Admin::SensitiveWord.alternative_text
@status.sensitive = true
end
def read_metadata
@raw_tags = []
@raw_mentions = []

View file

@ -122,7 +122,8 @@ class PostStatusService < BaseService
def process_sensitive_words
if [:public, :public_unlisted, :login].include?(@visibility&.to_sym) && Admin::SensitiveWord.sensitive?(@text, @options[:spoiler_text] || '')
@text = Admin::SensitiveWord.modified_text(@text, @options[:spoiler_text])
@options[:spoiler_text] = I18n.t('admin.sensitive_words.alert')
@options[:spoiler_text] = Admin::SensitiveWord.alternative_text
@sensitive = true
end
end

View file

@ -209,7 +209,8 @@ class UpdateStatusService < BaseService
return unless [:public, :public_unlisted, :login].include?(@status.visibility&.to_sym) && Admin::SensitiveWord.sensitive?(@status.text, @status.spoiler_text || '')
@status.text = Admin::SensitiveWord.modified_text(@status.text, @status.spoiler_text)
@status.spoiler_text = I18n.t('admin.sensitive_words.alert')
@status.spoiler_text = Admin::SensitiveWord.alternative_text
@status.sensitive = true
end
def update_expiration!

View file

@ -15,5 +15,14 @@
.fields-group
= f.input :sensitive_words, wrapper: :with_label, as: :text, input_html: { rows: 8 }, label: t('admin.sensitive_words.keywords'), hint: t('admin.sensitive_words.keywords_hint')
.fields-group
= f.input :sensitive_words_all_for_full, wrapper: :with_label, as: :text, input_html: { rows: 12 }, label: t('admin.sensitive_words.keywords_all_for_all'), hint: t('admin.sensitive_words.keywords_for_all_hint')
.fields-group
= f.input :sensitive_words_all, wrapper: :with_label, as: :text, input_html: { rows: 12 }, label: t('admin.sensitive_words.keywords_all'), hint: t('admin.sensitive_words.keywords_hint')
.fields-group
= f.input :auto_warning_text, wrapper: :with_label, input_html: { placeholder: t('admin.sensitive_words.alert') }, label: t('admin.sensitive_words.auto_warning_text'), hint: t('admin.sensitive_words.auto_warning_text_hint')
.actions
= f.button :button, t('generic.save_changes'), type: :submit