Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reject existing Follows when suspending a remote account #10230

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
17 changes: 17 additions & 0 deletions app/services/suspend_account_service.rb
Expand Up @@ -41,13 +41,22 @@ def call(account, **options)
@account = account
@options = options

reject_follows!
purge_user!
purge_profile!
purge_content!
end

private

def reject_follows!
return if @account.local? || !@account.activitypub?

ActivityPub::DeliveryWorker.push_bulk(Follow.where(account: @account)) do |follow|
[build_reject_json(follow), follow.target_account_id, follow.account.inbox_url]
end
end

def purge_user!
return if !@account.local? || @account.user.nil?

Expand Down Expand Up @@ -120,6 +129,14 @@ def delete_actor_json
@delete_actor_json = Oj.dump(ActivityPub::LinkedDataSignature.new(payload).sign!(@account))
end

def build_reject_json(follow)
ActiveModelSerializers::SerializableResource.new(
follow,
serializer: ActivityPub::RejectFollowSerializer,
adapter: ActivityPub::Adapter
).to_json
end

def delivery_inboxes
@delivery_inboxes ||= @account.followers.inboxes + Relay.enabled.pluck(:inbox_url)
end
Expand Down
44 changes: 43 additions & 1 deletion spec/services/suspend_account_service_spec.rb
@@ -1,7 +1,7 @@
require 'rails_helper'

RSpec.describe SuspendAccountService, type: :service do
describe '#call' do
describe '#call on local account' do
before do
stub_request(:post, "https://alice.com/inbox").to_return(status: 201)
stub_request(:post, "https://bob.com/inbox").to_return(status: 201)
Expand Down Expand Up @@ -43,4 +43,46 @@
expect(a_request(:post, "https://bob.com/inbox")).to have_been_made.once
end
end

describe '#call on remote account' do
before do
stub_request(:post, "https://alice.com/inbox").to_return(status: 201)
stub_request(:post, "https://bob.com/inbox").to_return(status: 201)
end

subject do
-> { described_class.new.call(remote_bob) }
end

let!(:account) { Fabricate(:account) }
let!(:remote_alice) { Fabricate(:account, inbox_url: 'https://alice.com/inbox', protocol: :activitypub) }
let!(:remote_bob) { Fabricate(:account, inbox_url: 'https://bob.com/inbox', protocol: :activitypub) }
let!(:status) { Fabricate(:status, account: remote_bob) }
let!(:media_attachment) { Fabricate(:media_attachment, account: remote_bob) }
let!(:notification) { Fabricate(:notification, account: remote_bob) }
let!(:favourite) { Fabricate(:favourite, account: remote_bob) }
let!(:active_relationship) { Fabricate(:follow, account: remote_bob, target_account: account) }
let!(:passive_relationship) { Fabricate(:follow, target_account: remote_bob) }
let!(:subscription) { Fabricate(:subscription, account: remote_bob) }

it 'deletes associated records' do
is_expected.to change {
[
remote_bob.statuses,
remote_bob.media_attachments,
remote_bob.stream_entries,
remote_bob.notifications,
remote_bob.favourites,
remote_bob.active_relationships,
remote_bob.passive_relationships,
remote_bob.subscriptions
].map(&:count)
}.from([1, 1, 1, 1, 1, 1, 1, 1]).to([0, 0, 0, 0, 0, 0, 0, 0])
end

it 'sends a reject follow to follwer inboxes' do
subject.call
expect(a_request(:post, remote_bob.inbox_url)).to have_been_made.once
end
end
end