1
0
Fork 0
forked from gitea/nas

Change: 単方向の承認だけでフレンドサーバーが有効になるようにする (#74)

* Test: テストを先に作成

* Fix: テスト不備

* Wip: フレンドサーバーのテストを修正

* Wip: エラーを修正

* 項目のラベリングを修正

* 新しい設定が変更できないのを修正

* Wip: 削除時の処理を修正

* フレンド自動承認設定を削除

* Fix: 申請を受けたドメインのINBOXが空になる問題

* Change: #75 フレンドでないサーバーからのローカル公開を未収載に変換 (#77)
This commit is contained in:
KMY(雪あすか) 2023-10-10 21:46:26 +09:00 committed by GitHub
parent 521932c802
commit 1eb2d78b5d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
24 changed files with 314 additions and 126 deletions

View file

@ -118,5 +118,26 @@ RSpec.describe ActivityPub::Activity::Accept do
subject.perform
expect(friend.reload.i_am_accepted?).to be true
end
it 'when the friend server is pending' do
friend.update(passive_state: :pending)
subject.perform
expect(friend.reload.they_are_idle?).to be true
expect(friend.i_am_accepted?).to be true
end
it 'when the friend server is accepted' do
friend.update(passive_state: :accepted)
subject.perform
expect(friend.reload.they_are_idle?).to be true
expect(friend.i_am_accepted?).to be true
end
it 'when my server is not pending' do
friend.update(active_state: :idle)
subject.perform
expect(friend.reload.i_am_idle?).to be true
expect(friend.they_are_idle?).to be true
end
end
end

View file

@ -30,9 +30,11 @@ RSpec.describe ActivityPub::Activity::Create do
let(:sender_software) { 'mastodon' }
let(:custom_before) { false }
let(:active_friend) { false }
before do
Fabricate(:instance_info, domain: 'example.com', software: sender_software)
Fabricate(:friend_domain, domain: 'example.com', active_state: :accepted) if active_friend
subject.perform unless custom_before
end
@ -245,6 +247,26 @@ RSpec.describe ActivityPub::Activity::Create do
}
end
it 'creates status' do
status = sender.statuses.first
expect(status).to_not be_nil
expect(status.visibility).to eq 'unlisted'
end
end
context 'when public_unlisted with LocalPublic from friend-server' do
let(:object_json) do
{
id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
type: 'Note',
content: 'Lorem ipsum',
to: ['http://example.com/followers', 'LocalPublic'],
cc: 'https://www.w3.org/ns/activitystreams#Public',
}
end
let(:active_friend) { true }
it 'creates status' do
status = sender.statuses.first
@ -433,6 +455,18 @@ RSpec.describe ActivityPub::Activity::Create do
context 'with public_unlisted with LocalPublic' do
let(:searchable_by) { ['http://example.com/followers', 'LocalPublic'] }
it 'create status' do
status = sender.statuses.first
expect(status).to_not be_nil
expect(status.searchability).to eq 'private'
end
end
context 'with public_unlisted with LocalPublic from friend-server' do
let(:searchable_by) { ['http://example.com/followers', 'LocalPublic'] }
let(:active_friend) { true }
it 'create status' do
status = sender.statuses.first
@ -1506,11 +1540,7 @@ RSpec.describe ActivityPub::Activity::Create do
context 'when sender is in friend server' do
subject { described_class.new(json, sender, delivery: true) }
before do
Fabricate(:friend_domain, domain: sender.domain, active_state: :accepted, passive_state: :accepted)
subject.perform
end
let!(:friend) { Fabricate(:friend_domain, domain: sender.domain, active_state: :accepted) }
let(:object_json) do
{
id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
@ -1520,11 +1550,20 @@ RSpec.describe ActivityPub::Activity::Create do
end
it 'creates status' do
subject.perform
status = sender.statuses.first
expect(status).to_not be_nil
expect(status.text).to eq 'Lorem ipsum'
end
it 'whey no-relay not creates status' do
friend.update(allow_all_posts: false)
subject.perform
status = sender.statuses.first
expect(status).to be_nil
end
end
context 'when the sender has no relevance to local activity' do

View file

@ -339,6 +339,37 @@ RSpec.describe ActivityPub::Activity::Follow do
expect(friend).to_not be_nil
expect(friend.they_are_pending?).to be true
expect(friend.passive_follow_activity_id).to eq 'foo'
expect(friend.inbox_url).to eq 'https://abc.com/inbox'
end
end
context 'when my server is pending' do
before do
friend.update(active_state: :pending)
end
it 'marks me as idle' do
subject.perform
expect(friend.reload.they_are_pending?).to be true
expect(friend.i_am_idle?).to be true
end
end
context 'when my server is already accepted' do
before do
friend.update(active_state: :accepted)
stub_request(:post, 'https://example.com/inbox')
end
it 'marks me as idle and the friend as accepted' do
subject.perform
expect(friend.reload.they_are_accepted?).to be true
expect(friend.i_am_idle?).to be true
expect(a_request(:post, 'https://example.com/inbox').with(body: hash_including({
id: 'foo#accepts/friends',
type: 'Accept',
object: 'foo',
}))).to have_been_made.once
end
end
@ -372,26 +403,6 @@ RSpec.describe ActivityPub::Activity::Follow do
end
end
context 'when unlocked' do
before do
friend.update(unlocked: true)
stub_request(:post, 'https://example.com/inbox')
end
it 'marks the friend as accepted' do
subject.perform
friend = FriendDomain.find_by(domain: 'abc.com')
expect(friend).to_not be_nil
expect(friend.they_are_accepted?).to be true
expect(a_request(:post, 'https://example.com/inbox').with(body: hash_including({
id: 'foo#accepts/friends',
type: 'Accept',
object: 'foo',
}))).to have_been_made.once
end
end
context 'when unlocked on admin settings' do
before do
Form::AdminSettings.new(unlocked_friend: '1').save

View file

@ -192,5 +192,19 @@ RSpec.describe ActivityPub::Activity::Reject do
subject.perform
expect(friend.reload.i_am_rejected?).to be true
end
it 'when the friend server is pending' do
friend.update(passive_state: :pending)
subject.perform
expect(friend.reload.they_are_idle?).to be true
expect(friend.i_am_rejected?).to be true
end
it 'when the friend server is accepted' do
friend.update(passive_state: :accepted)
subject.perform
expect(friend.reload.they_are_idle?).to be true
expect(friend.i_am_rejected?).to be true
end
end
end

View file

@ -149,7 +149,7 @@ RSpec.describe ActivityPub::Activity::Undo do
friend = Fabricate(:friend_domain, domain: sender.domain, passive_state: :accepted)
subject.perform
expect(sender.following?(recipient)).to be false
expect(friend.they_are_accepted?).to be true
expect(friend.reload.they_are_accepted?).to be true
end
context 'with only object uri' do
@ -175,8 +175,19 @@ RSpec.describe ActivityPub::Activity::Undo do
it 'deletes follow from this server to friend' do
subject.perform
expect(friend.reload.they_are_idle?).to be true
expect(friend.passive_follow_activity_id).to be_nil
expect(FriendDomain.exists?(domain: 'abc.com')).to be false
end
it 'when my server is pending' do
friend.update(active_state: :pending)
subject.perform
expect(FriendDomain.exists?(domain: 'abc.com')).to be false
end
it 'when my server is accepted' do
friend.update(active_state: :accepted)
subject.perform
expect(FriendDomain.exists?(domain: 'abc.com')).to be false
end
end
end