Change: #556 ドメインブロック「フォローされていない相手からのリプライを拒否」に、参照を含める (#625)

This commit is contained in:
KMY(雪あすか) 2024-03-01 12:00:52 +09:00 committed by GitHub
parent 5646b4e1e6
commit bc07ebef3d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 54 additions and 10 deletions

View file

@ -164,15 +164,16 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
def valid_status? def valid_status?
valid = !Admin::NgWord.reject?("#{@status_parser.spoiler_text}\n#{@status_parser.text}", uri: @status.uri, target_type: :status) valid = !Admin::NgWord.reject?("#{@status_parser.spoiler_text}\n#{@status_parser.text}", uri: @status.uri, target_type: :status)
valid = !Admin::NgWord.hashtag_reject?(@raw_tags.size) if valid valid = !Admin::NgWord.hashtag_reject?(@raw_tags.size) if valid
valid = false if valid && Admin::NgWord.mention_reject?(@raw_mentions.size, uri: @status.uri, target_type: :status, text: "#{@status_parser.spoiler_text}\n#{@status_parser.text}")
valid = false if valid && (mention_to_local_stranger? || reference_to_local_stranger?) && Admin::NgWord.stranger_mention_reject?("#{@status_parser.spoiler_text}\n#{@status_parser.text}", uri: @status.uri, target_type: :status)
valid = false if valid && (mention_to_local_stranger? || reference_to_local_stranger?) && Admin::NgWord.stranger_mention_reject_with_count?(@raw_mentions.size, uri: @status.uri, target_type: :status, text: "#{@status_parser.spoiler_text}\n#{@status_parser.text}")
valid = false if valid && (mention_to_local_stranger? || reference_to_local_stranger?) && reject_reply_exclude_followers?
valid valid
end end
def validate_status_mentions! def validate_status_mentions!
raise AbortError unless valid_status_for_ng_rule? raise AbortError unless valid_status_for_ng_rule?
raise AbortError if (mention_to_local_stranger? || reference_to_local_stranger?) && Admin::NgWord.stranger_mention_reject?("#{@status_parser.spoiler_text}\n#{@status_parser.text}", uri: @status.uri, target_type: :status)
raise AbortError if Admin::NgWord.mention_reject?(@raw_mentions.size, uri: @status.uri, target_type: :status, text: "#{@status_parser.spoiler_text}\n#{@status_parser.text}")
raise AbortError if (mention_to_local_stranger? || reference_to_local_stranger?) && Admin::NgWord.stranger_mention_reject_with_count?(@raw_mentions.size, uri: @status.uri, target_type: :status, text: "#{@status_parser.spoiler_text}\n#{@status_parser.text}")
end end
def valid_status_for_ng_rule? def valid_status_for_ng_rule?
@ -196,8 +197,11 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
end end
def mention_to_local_stranger? def mention_to_local_stranger?
@status.mentions.map(&:account).to_a.any? { |mentioned_account| mentioned_account.id != @status.account.id && mentioned_account.local? && !mentioned_account.following?(@status.account) } || return @mention_to_local_stranger if defined?(@mention_to_local_stranger)
(@status.thread.present? && @status.thread.account.id != @status.account.id && @status.thread.account.local? && !@status.thread.account.following?(@status.account))
@mention_to_local_stranger = @raw_mentions.filter_map { |uri| ActivityPub::TagManager.instance.local_uri?(uri) && ActivityPub::TagManager.instance.uri_to_resource(uri, Account) }.any? { |mentioned_account| !mentioned_account.following?(@status.account) }
@mention_to_local_stranger ||= @status.thread.present? && @status.thread.account_id != @status.account_id && @status.thread.account.local? && !@status.thread.account.following?(@status.account)
@mention_to_local_stranger
end end
def reference_to_local_stranger? def reference_to_local_stranger?
@ -365,6 +369,12 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
@ignore_hashtags ||= DomainBlock.reject_hashtag?(@account.domain) @ignore_hashtags ||= DomainBlock.reject_hashtag?(@account.domain)
end end
def reject_reply_exclude_followers?
return @reject_reply_exclude_followers if defined?(@reject_reply_exclude_followers)
@reject_reply_exclude_followers ||= DomainBlock.reject_reply_exclude_followers?(@account.domain)
end
def unsupported_media_type?(mime_type) def unsupported_media_type?(mime_type)
mime_type.present? && !MediaAttachment.supported_mime_types.include?(mime_type) mime_type.present? && !MediaAttachment.supported_mime_types.include?(mime_type)
end end

View file

@ -458,7 +458,7 @@ en:
reject_new_follow: Reject follows reject_new_follow: Reject follows
reject_new_follow_hint: Reject follows in the future reject_new_follow_hint: Reject follows in the future
reject_reply: Reject replies reject_reply: Reject replies
reject_reply_exclude_followers: Reject replies exclude followers reject_reply_exclude_followers: Reject mentions/references exclude followers
reject_reply_hint: Reject replies in the future reject_reply_hint: Reject replies in the future
reject_reply_exclude_followers_hint: Reject replies exclude followers in the future reject_reply_exclude_followers_hint: Reject replies exclude followers in the future
reject_reports: Reject reports reject_reports: Reject reports
@ -575,7 +575,7 @@ en:
reject_new_follow: Reject follows reject_new_follow: Reject follows
reject_straight_follow: Reject straight follow reject_straight_follow: Reject straight follow
reject_reply: Reject reply reject_reply: Reject reply
reject_reply_exclude_followers: Reject reply exclude followers reject_reply_exclude_followers: Reject reply/reference exclude followers
reject_reports: Reject reports reject_reports: Reject reports
silence: Limit silence: Limit
suspend: Suspend suspend: Suspend

View file

@ -453,7 +453,7 @@ ja:
reject_new_follow: 新規フォローを拒否 reject_new_follow: 新規フォローを拒否
reject_new_follow_hint: 今後の新規フォローを拒否します。停止とは無関係です reject_new_follow_hint: 今後の新規フォローを拒否します。停止とは無関係です
reject_reply: リプライを拒否 reject_reply: リプライを拒否
reject_reply_exclude_followers: フォロー相手以外からのリプライを拒否 reject_reply_exclude_followers: フォロー相手以外からのメンションと参照を拒否
reject_reply_hint: 今後のリプライを拒否します。停止とは無関係です reject_reply_hint: 今後のリプライを拒否します。停止とは無関係です
reject_reply_exclude_followers_hint: 今後のリプライを拒否します。停止とは無関係です reject_reply_exclude_followers_hint: 今後のリプライを拒否します。停止とは無関係です
reject_reports: 通報を拒否 reject_reports: 通報を拒否
@ -567,7 +567,7 @@ ja:
reject_media: メディアを拒否する reject_media: メディアを拒否する
reject_new_follow: 新規フォローを拒否 reject_new_follow: 新規フォローを拒否
reject_reply: リプライを拒否 reject_reply: リプライを拒否
reject_reply_exclude_followers: フォロー相手以外からのリプライを拒否 reject_reply_exclude_followers: フォロー相手以外からのメンション・参照を拒否
reject_reports: 通報を拒否 reject_reports: 通報を拒否
reject_send_sensitive: センシティブ投稿配送なし reject_send_sensitive: センシティブ投稿配送なし
reject_straight_follow: フォローを制限 reject_straight_follow: フォローを制限

View file

@ -325,6 +325,31 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
end end
end end
context 'when reject mentions to stranger by domain-block' do
let(:json_tags) do
[
{ type: 'Mention', href: ActivityPub::TagManager.instance.uri_for(alice) },
]
end
before do
Fabricate(:domain_block, domain: 'example.com', reject_reply_exclude_followers: true, severity: :noop)
end
it 'updates mentions' do
subject.call(status, json, json)
expect(status.mentions.reload.map(&:account_id)).to eq []
end
it 'updates mentions when follower' do
alice.follow!(status.account)
subject.call(status, json, json)
expect(status.mentions.reload.map(&:account_id)).to eq [alice.id]
end
end
context 'when originally without mentions' do context 'when originally without mentions' do
before do before do
subject.call(status, json, json) subject.call(status, json, json)
@ -508,7 +533,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
end end
end end
context 'when hit ng words for mention' do context 'when hit ng words for mention to local stranger' do
let(:json_tags) do let(:json_tags) do
[ [
{ type: 'Mention', href: ActivityPub::TagManager.instance.uri_for(alice) }, { type: 'Mention', href: ActivityPub::TagManager.instance.uri_for(alice) },
@ -523,6 +548,15 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
expect(status.reload.text).to_not eq content expect(status.reload.text).to_not eq content
expect(status.mentioned_accounts.pluck(:id)).to_not include alice.id expect(status.mentioned_accounts.pluck(:id)).to_not include alice.id
end end
it 'update status when following' do
Form::AdminSettings.new(ng_words_for_stranger_mention: 'test', stranger_mention_from_local_ng: '1').save
alice.follow!(status.account)
subject.call(status, json, json)
expect(status.reload.text).to eq content
expect(status.mentioned_accounts.pluck(:id)).to include alice.id
end
end end
context 'when hit ng words for mention but local posts are not checked' do context 'when hit ng words for mention but local posts are not checked' do