Add: ローカルからフォローされていない全てのアカウントからのフォローを拒否する設定 (#592)

* Add: ローカルからフォローされていない全てのアカウントからのフォローを拒否する設定

* Fix test

* Fix test
This commit is contained in:
KMY(雪あすか) 2024-02-18 11:39:09 +09:00 committed by GitHub
parent 1efeedf896
commit c35c13ffba
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 58 additions and 2 deletions

View file

@ -20,7 +20,7 @@ import { IconButton } from '../../../components/icon_button';
const messages = defineMessages({ const messages = defineMessages({
remove: { id: 'lists.account.remove', defaultMessage: 'Remove from list' }, remove: { id: 'lists.account.remove', defaultMessage: 'Remove from list' },
add: { id: 'lists.account.add', defaultMessage: 'Add to list' }, add: { id: 'lists.account.add', defaultMessage: 'Add to list' },
exclusive: { id: 'lists.exclusive', defaultMessage: 'Exclusive from home' }, exclusive: { id: 'lists.exclusive', defaultMessage: 'Hide list or antenna account posts from home' },
}); });
const MapStateToProps = (state, { listId, added }) => ({ const MapStateToProps = (state, { listId, added }) => ({

View file

@ -221,7 +221,7 @@ class ListTimeline extends PureComponent {
<div className='setting-toggle'> <div className='setting-toggle'>
<Toggle id={`list-${id}-exclusive`} checked={isExclusive} onChange={this.onExclusiveToggle} /> <Toggle id={`list-${id}-exclusive`} checked={isExclusive} onChange={this.onExclusiveToggle} />
<label htmlFor={`list-${id}-exclusive`} className='setting-toggle__label'> <label htmlFor={`list-${id}-exclusive`} className='setting-toggle__label'>
<FormattedMessage id='lists.exclusive' defaultMessage='Hide these posts from home or STL' /> <FormattedMessage id='lists.exclusive' defaultMessage='Hide list or antenna account posts from home' />
</label> </label>
</div> </div>

View file

@ -149,6 +149,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
valid = !Admin::NgWord.mention_reject?(@raw_mention_uris.size, uri: @params[:uri], target_type: :status, public: @status_parser.distributable_visibility?, text: "#{@params[:spoiler_text]}\n#{@params[:text]}") if valid valid = !Admin::NgWord.mention_reject?(@raw_mention_uris.size, uri: @params[:uri], target_type: :status, public: @status_parser.distributable_visibility?, text: "#{@params[:spoiler_text]}\n#{@params[:text]}") if valid
valid = !Admin::NgWord.stranger_mention_reject_with_count?(@raw_mention_uris.size, uri: @params[:uri], target_type: :status, public: @status_parser.distributable_visibility?, text: "#{@params[:spoiler_text]}\n#{@params[:text]}") if valid && (mention_to_local_stranger? || reference_to_local_stranger?) valid = !Admin::NgWord.stranger_mention_reject_with_count?(@raw_mention_uris.size, uri: @params[:uri], target_type: :status, public: @status_parser.distributable_visibility?, text: "#{@params[:spoiler_text]}\n#{@params[:text]}") if valid && (mention_to_local_stranger? || reference_to_local_stranger?)
valid = !Admin::NgWord.stranger_mention_reject?("#{@params[:spoiler_text]}\n#{@params[:text]}", uri: @params[:uri], target_type: :status, public: @status_parser.distributable_visibility?) if valid && (mention_to_local_stranger? || reference_to_local_stranger?) valid = !Admin::NgWord.stranger_mention_reject?("#{@params[:spoiler_text]}\n#{@params[:text]}", uri: @params[:uri], target_type: :status, public: @status_parser.distributable_visibility?) if valid && (mention_to_local_stranger? || reference_to_local_stranger?)
valid = false if valid && Setting.block_unfollow_account_mention && (mention_to_local_stranger? || reference_to_local_stranger?) && !local_following_sender?
valid valid
end end
@ -486,6 +487,10 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
@reject_reply_exclude_followers ||= DomainBlock.reject_reply_exclude_followers?(@account.domain) @reject_reply_exclude_followers ||= DomainBlock.reject_reply_exclude_followers?(@account.domain)
end end
def local_following_sender?
::Follow.exists?(account: Account.local, target_account: @account)
end
def ignore_hashtags? def ignore_hashtags?
return @ignore_hashtags if defined?(@ignore_hashtags) return @ignore_hashtags if defined?(@ignore_hashtags)

View file

@ -65,6 +65,7 @@ class Form::AdminSettings
enable_local_timeline enable_local_timeline
emoji_reaction_disallow_domains emoji_reaction_disallow_domains
permit_new_account_domains permit_new_account_domains
block_unfollow_account_mention
hold_remote_new_accounts hold_remote_new_accounts
).freeze ).freeze
@ -108,6 +109,7 @@ class Form::AdminSettings
stranger_mention_from_local_ng stranger_mention_from_local_ng
enable_local_timeline enable_local_timeline
delete_content_cache_without_reaction delete_content_cache_without_reaction
block_unfollow_account_mention
hold_remote_new_accounts hold_remote_new_accounts
).freeze ).freeze

View file

@ -32,6 +32,9 @@
.fields-group .fields-group
= f.input :hide_local_users_for_anonymous, wrapper: :with_label, as: :boolean, label: t('admin.ng_words.hide_local_users_for_anonymous') = f.input :hide_local_users_for_anonymous, wrapper: :with_label, as: :boolean, label: t('admin.ng_words.hide_local_users_for_anonymous')
.fields-group
= f.input :block_unfollow_account_mention, wrapper: :with_label, as: :boolean, label: t('admin.ng_words.block_unfollow_account_mention')
%p.hint %p.hint
= t 'admin.ng_words.remote_approval_hint' = t 'admin.ng_words.remote_approval_hint'
= link_to t('admin.ng_words.remote_approval_list'), admin_accounts_path(status: 'remote_pending', origin: 'remote') = link_to t('admin.ng_words.remote_approval_list'), admin_accounts_path(status: 'remote_pending', origin: 'remote')

View file

@ -648,6 +648,7 @@ en:
media_attachments: media_attachments:
title: Media attachments title: Media attachments
ng_words: ng_words:
block_unfollow_account_mention: Reject all mentions/references from all accounts that do not have followers on your server
hide_local_users_for_anonymous: Hide timeline local user posts from anonymous hide_local_users_for_anonymous: Hide timeline local user posts from anonymous
history_hint: We recommend that you regularly check your NG words to make sure that you have not specified the NG words incorrectly. history_hint: We recommend that you regularly check your NG words to make sure that you have not specified the NG words incorrectly.
hold_remote_new_accounts: Hold new remote accounts hold_remote_new_accounts: Hold new remote accounts

View file

@ -641,6 +641,7 @@ ja:
media_attachments: media_attachments:
title: 投稿された画像 title: 投稿された画像
ng_words: ng_words:
block_unfollow_account_mention: 自分のサーバーのフォロワーを持たない全てのアカウントからのメンション・参照を全て拒否する
hide_local_users_for_anonymous: ログインしていない状態でローカルユーザーの投稿をタイムラインから取得できないようにする hide_local_users_for_anonymous: ログインしていない状態でローカルユーザーの投稿をタイムラインから取得できないようにする
history_hint: 設定されたNGワードによって実際に拒否された投稿などは、履歴より確認できます。NGワードの指定に誤りがないか定期的に確認することをおすすめします。 history_hint: 設定されたNGワードによって実際に拒否された投稿などは、履歴より確認できます。NGワードの指定に誤りがないか定期的に確認することをおすすめします。
hold_remote_new_accounts: リモートの新規アカウントを保留する hold_remote_new_accounts: リモートの新規アカウントを保留する

View file

@ -2219,6 +2219,50 @@ RSpec.describe ActivityPub::Activity::Create do
end end
end end
end end
context 'when stranger mention for domain' do
let(:object_json) do
{
id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
type: 'Note',
content: 'Lorem ipsum',
to: 'https://www.w3.org/ns/activitystreams#Public',
tag: [
{
type: 'Mention',
href: ActivityPub::TagManager.instance.uri_for(Fabricate(:account)),
},
],
}
end
context 'when the domain does not have follower' do
let(:custom_before) { true }
before do
Setting.block_unfollow_account_mention = true
subject.perform
end
it 'creates status' do
expect(sender.statuses.first).to be_nil
end
end
context 'when other account following' do
let(:custom_before) { true }
before do
Setting.block_unfollow_account_mention = true
Fabricate(:account).follow!(sender)
subject.perform
end
it 'creates status' do
expect(sender.statuses.first).to_not be_nil
end
end
end
end end
context 'when object URI uses bearcaps' do context 'when object URI uses bearcaps' do