Add: フレンドサーバー (#61)

* Fix mastodon version

* テーブル作成

* Wip: フレンドサーバーフォローの承認を受信

* Wip: フレンド申請拒否を受信

* Wip: フォローリクエストを受理

* Wip: 相手からのフォロー・アンフォローを受理

* 普通のフォローとフレンドサーバーのフォローを区別するテストを追加

* ドメインブロックによるフォロー拒否

* ドメインブロックしたあと、申請中のフォロリクを取り下げる処理

* スタブに条件を追加

* Wip: 相手からのDelete信号に対応

* DB定義が消えていたので修正

* Wip: ローカル公開投稿をフレンドに送信する処理など

* Wip: 未収載+誰でもの投稿をフレンドに送る設定

* Wip: ローカル公開をそのまま送信する設定を考慮

* Fix test

* Wip: 他サーバーからのローカル公開投稿の受け入れ

* Wip: Web画面作成

* Fix test

* Wip: ローカル公開を連合TLに流す

* Wip: フレンドサーバーの削除ボタン

* Wip: メール通知や設定のテストなど

* Wip: 翻訳を作成

* Fix: 却下されたあとフォローボタンが表示されない問題

* Wip: 編集できない問題

* 有効にしていないフレンドサーバーをリストで無効表示
This commit is contained in:
KMY(雪あすか) 2023-10-09 11:51:15 +09:00 committed by GitHub
parent acb29e5b11
commit 87e858a202
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
66 changed files with 1638 additions and 51 deletions

View file

@ -24,12 +24,14 @@ describe StatusReachFinder do
it 'send status' do
expect(subject.inboxes).to include 'https://foo.bar/inbox'
expect(subject.inboxes_for_friend).to_not include 'https://foo.bar/inbox'
end
end
context 'with non-follower' do
it 'send status' do
expect(subject.inboxes).to_not include 'https://foo.bar/inbox'
expect(subject.inboxes_for_friend).to_not include 'https://foo.bar/inbox'
end
end
end
@ -92,6 +94,103 @@ describe StatusReachFinder do
expect(subject.inboxes_for_misskey).to_not include 'https://foo.bar/inbox'
end
end
context 'when has distributable friend server' do
let(:sender_software) { 'misskey' }
let(:searchability) { :public }
before { Fabricate(:friend_domain, domain: 'foo.bar', inbox_url: 'https://foo.bar/inbox', available: true, active_state: :accepted, passive_state: :accepted, pseudo_relay: true) }
it 'send status without friend server' do
expect(subject.inboxes).to_not include 'https://foo.bar/inbox'
expect(subject.inboxes_for_misskey).to_not include 'https://foo.bar/inbox'
expect(subject.inboxes_for_friend).to include 'https://foo.bar/inbox'
end
end
end
context 'when this server has a friend' do
let(:bob) { Fabricate(:account, username: 'bob', domain: 'foo.bar', protocol: :activitypub, inbox_url: 'https://foo.bar/inbox') }
context 'with follower' do
before do
Fabricate(:friend_domain, domain: 'foo.bar', active_state: :accepted)
bob.follow!(alice)
end
it 'send status' do
expect(subject.inboxes).to_not include 'https://foo.bar/inbox'
expect(subject.inboxes_for_friend).to include 'https://foo.bar/inbox'
end
end
context 'with non-follower' do
before do
Fabricate(:friend_domain, domain: 'foo.bar', active_state: :accepted)
end
it 'send status' do
expect(subject.inboxes).to_not include 'https://foo.bar/inbox'
expect(subject.inboxes_for_friend).to_not include 'https://foo.bar/inbox'
end
end
context 'with pending' do
before do
Fabricate(:friend_domain, domain: 'foo.bar', active_state: :pending)
bob.follow!(alice)
end
it 'send status' do
expect(subject.inboxes).to include 'https://foo.bar/inbox'
expect(subject.inboxes_for_friend).to_not include 'https://foo.bar/inbox'
end
end
context 'when unavailable' do
before do
Fabricate(:friend_domain, domain: 'foo.bar', active_state: :accepted, available: false)
bob.follow!(alice)
end
it 'send status' do
expect(subject.inboxes).to include 'https://foo.bar/inbox'
expect(subject.inboxes_for_friend).to_not include 'https://foo.bar/inbox'
end
end
context 'when distributable' do
before do
Fabricate(:friend_domain, domain: 'foo.bar', active_state: :accepted, passive_state: :accepted, pseudo_relay: true)
bob.follow!(alice)
end
it 'send status' do
expect(subject.inboxes).to_not include 'https://foo.bar/inbox'
expect(subject.inboxes_for_friend).to include 'https://foo.bar/inbox'
end
end
context 'when distributable and not following' do
before do
Fabricate(:friend_domain, domain: 'foo.bar', inbox_url: 'https://foo.bar/inbox', active_state: :accepted, passive_state: :accepted, pseudo_relay: true)
end
it 'send status' do
expect(subject.inboxes).to_not include 'https://foo.bar/inbox'
expect(subject.inboxes_for_friend).to include 'https://foo.bar/inbox'
end
end
end
context 'when it contains distributable friend server' do
before { Fabricate(:friend_domain, domain: 'foo.bar', inbox_url: 'https://foo.bar/inbox', available: true, active_state: :accepted, passive_state: :accepted, pseudo_relay: true) }
it 'includes the inbox of the mentioned account' do
expect(subject.inboxes).to_not include 'https://foo.bar/inbox'
expect(subject.inboxes_for_misskey).to_not include 'https://foo.bar/inbox'
expect(subject.inboxes_for_friend).to include 'https://foo.bar/inbox'
end
end
context 'when it contains mentions of remote accounts' do
@ -255,4 +354,99 @@ describe StatusReachFinder do
end
end
end
describe '#inboxes_for_friend and distributables' do
subject { described_class.new(status).inboxes_for_friend }
let(:visibility) { :public }
let(:searchability) { :public }
let(:alice) { Fabricate(:account, username: 'alice') }
let(:status) { Fabricate(:status, account: alice, visibility: visibility, searchability: searchability) }
context 'when a simple case' do
before do
Fabricate(:friend_domain, domain: 'abc.com', inbox_url: 'https://abc.com/inbox', active_state: :accepted, passive_state: :accepted, pseudo_relay: true, available: true)
Fabricate(:friend_domain, domain: 'def.com', inbox_url: 'https://def.com/inbox', active_state: :accepted, passive_state: :accepted, pseudo_relay: true, available: true)
Fabricate(:friend_domain, domain: 'ghi.com', inbox_url: 'https://ghi.com/inbox', active_state: :accepted, passive_state: :accepted, pseudo_relay: true, available: false)
Fabricate(:friend_domain, domain: 'jkl.com', inbox_url: 'https://jkl.com/inbox', active_state: :accepted, passive_state: :accepted, pseudo_relay: false, available: true)
Fabricate(:friend_domain, domain: 'mno.com', inbox_url: 'https://mno.com/inbox', active_state: :accepted, passive_state: :pending, pseudo_relay: true, available: true)
Fabricate(:friend_domain, domain: 'pqr.com', inbox_url: 'https://pqr.com/inbox', active_state: :accepted, passive_state: :accepted, pseudo_relay: true, available: true)
Fabricate(:unavailable_domain, domain: 'pqr.com')
end
it 'returns friend servers' do
expect(subject).to include 'https://abc.com/inbox'
expect(subject).to include 'https://def.com/inbox'
end
it 'not contains unavailable friends' do
expect(subject).to_not include 'https://ghi.com/inbox'
end
it 'not contains no-relay friends' do
expect(subject).to_not include 'https://jkl.com/inbox'
end
it 'not contains no-mutual friends' do
expect(subject).to_not include 'https://mno.com/inbox'
end
it 'not contains unavailable domain friends' do
expect(subject).to_not include 'https://pqr.com/inbox'
end
context 'when public visibility' do
let(:visibility) { :public }
let(:searchability) { :direct }
it 'returns friend servers' do
expect(subject).to_not eq []
end
end
context 'when public_unlsited visibility' do
let(:visibility) { :public_unlisted }
let(:searchability) { :direct }
it 'returns friend servers' do
expect(subject).to_not eq []
end
end
context 'when unlsited visibility with public searchability' do
let(:visibility) { :unlisted }
let(:searchability) { :public }
it 'returns friend servers' do
expect(subject).to_not eq []
end
end
context 'when unlsited visibility with public_unlisted searchability' do
let(:visibility) { :unlisted }
let(:searchability) { :public_unlisted }
it 'returns friend servers' do
expect(subject).to_not eq []
end
end
context 'when unlsited visibility with private searchability' do
let(:visibility) { :unlisted }
let(:searchability) { :private }
it 'returns empty servers' do
expect(subject).to eq []
end
end
context 'when private visibility' do
let(:visibility) { :private }
it 'returns friend servers' do
expect(subject).to eq []
end
end
end
end
end