Add: プロキシアカウントを動的に識別する簡易的な仕組み
This commit is contained in:
parent
22d03b06da
commit
41c1aaf54d
3 changed files with 72 additions and 2 deletions
|
@ -30,7 +30,7 @@ class ActivityPub::Activity::Follow < ActivityPub::Activity
|
||||||
|
|
||||||
follow_request = FollowRequest.create!(account: @account, target_account: target_account, uri: @json['id'])
|
follow_request = FollowRequest.create!(account: @account, target_account: target_account, uri: @json['id'])
|
||||||
|
|
||||||
if target_account.locked? || @account.silenced? || block_straight_follow? || (@account.bot? && target_account.user&.setting_lock_follow_from_bot)
|
if target_account.locked? || @account.silenced? || block_straight_follow? || ((@account.bot? || proxy_account?) && target_account.user&.setting_lock_follow_from_bot)
|
||||||
LocalNotificationWorker.perform_async(target_account.id, follow_request.id, 'FollowRequest', 'follow_request')
|
LocalNotificationWorker.perform_async(target_account.id, follow_request.id, 'FollowRequest', 'follow_request')
|
||||||
else
|
else
|
||||||
AuthorizeFollowService.new.call(@account, target_account)
|
AuthorizeFollowService.new.call(@account, target_account)
|
||||||
|
@ -50,4 +50,24 @@ class ActivityPub::Activity::Follow < ActivityPub::Activity
|
||||||
def block_new_follow?
|
def block_new_follow?
|
||||||
@block_new_follow ||= DomainBlock.reject_new_follow?(@account.domain)
|
@block_new_follow ||= DomainBlock.reject_new_follow?(@account.domain)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def proxy_account?
|
||||||
|
(@account.username.downcase.include?('proxy') ||
|
||||||
|
@account.username.downcase.include?('followbot') ||
|
||||||
|
@account.display_name&.downcase&.include?('proxy') ||
|
||||||
|
@account.display_name&.include?('プロキシ') ||
|
||||||
|
@account.note&.downcase&.include?('proxy') ||
|
||||||
|
@account.note&.include?('プロキシ')) && proxyable_software?
|
||||||
|
end
|
||||||
|
|
||||||
|
def proxyable_software?
|
||||||
|
info = instance_info
|
||||||
|
return false if info.nil?
|
||||||
|
|
||||||
|
%w(misskey calckey firefish meisskey cherrypick).include?(info.software)
|
||||||
|
end
|
||||||
|
|
||||||
|
def instance_info
|
||||||
|
@instance_info ||= InstanceInfo.find_by(domain: @account.domain)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -4,7 +4,8 @@ require 'rails_helper'
|
||||||
|
|
||||||
RSpec.describe ActivityPub::Activity::Follow do
|
RSpec.describe ActivityPub::Activity::Follow do
|
||||||
let(:actor_type) { 'Person' }
|
let(:actor_type) { 'Person' }
|
||||||
let(:sender) { Fabricate(:account, domain: 'example.com', inbox_url: 'https://example.com/inbox', actor_type: actor_type) }
|
let(:note) { '' }
|
||||||
|
let(:sender) { Fabricate(:account, domain: 'example.com', inbox_url: 'https://example.com/inbox', actor_type: actor_type, note: note) }
|
||||||
let(:recipient) { Fabricate(:account) }
|
let(:recipient) { Fabricate(:account) }
|
||||||
|
|
||||||
let(:json) do
|
let(:json) do
|
||||||
|
@ -103,6 +104,54 @@ RSpec.describe ActivityPub::Activity::Follow do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'when unlocked misskey proxy account but locked from bot' do
|
||||||
|
let(:note) { 'i am proxy.' }
|
||||||
|
|
||||||
|
before do
|
||||||
|
Fabricate(:instance_info, domain: 'example.com', software: 'misskey')
|
||||||
|
recipient.user.settings['lock_follow_from_bot'] = true
|
||||||
|
recipient.user.save!
|
||||||
|
subject.perform
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'does not create a follow from sender to recipient' do
|
||||||
|
expect(sender.following?(recipient)).to be false
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'creates a follow request' do
|
||||||
|
expect(sender.requested?(recipient)).to be true
|
||||||
|
expect(sender.follow_requests.find_by(target_account: recipient).uri).to eq 'foo'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when unlocked mastodon proxy account but locked from bot' do
|
||||||
|
let(:note) { 'i am proxy.' }
|
||||||
|
|
||||||
|
before do
|
||||||
|
Fabricate(:instance_info, domain: 'example.com', software: 'mastodon')
|
||||||
|
recipient.user.settings['lock_follow_from_bot'] = true
|
||||||
|
recipient.user.save!
|
||||||
|
subject.perform
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'does not create a follow from sender to recipient' do
|
||||||
|
expect(sender.following?(recipient)).to be true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when unlocked misskey normal account but locked from bot' do
|
||||||
|
before do
|
||||||
|
Fabricate(:instance_info, domain: 'example.com', software: 'misskey')
|
||||||
|
recipient.user.settings['lock_follow_from_bot'] = true
|
||||||
|
recipient.user.save!
|
||||||
|
subject.perform
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'does not create a follow from sender to recipient' do
|
||||||
|
expect(sender.following?(recipient)).to be true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
context 'when domain block reject_straight_follow' do
|
context 'when domain block reject_straight_follow' do
|
||||||
before do
|
before do
|
||||||
Fabricate(:domain_block, domain: 'example.com', reject_straight_follow: true)
|
Fabricate(:domain_block, domain: 'example.com', reject_straight_follow: true)
|
||||||
|
|
|
@ -21,6 +21,7 @@ RSpec.describe ActivityPub::ProcessAccountService, type: :service do
|
||||||
searchableBy: searchable_by,
|
searchableBy: searchable_by,
|
||||||
indexable: indexable,
|
indexable: indexable,
|
||||||
summary: sender_bio,
|
summary: sender_bio,
|
||||||
|
actor_type: 'Person',
|
||||||
}.with_indifferent_access
|
}.with_indifferent_access
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue