Skip to content
This repository has been archived by the owner on Dec 21, 2023. It is now read-only.

Commit

Permalink
Fix “Remove all followers from the selected domains” being more destr…
Browse files Browse the repository at this point in the history
…uctive than it claims (mastodon#23805)
  • Loading branch information
ClearlyClaire authored Mar 3, 2023
1 parent 3a6451c commit c2a046d
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 10 deletions.
4 changes: 2 additions & 2 deletions app/controllers/relationships_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,8 @@ def action_from_button
'unfollow'
elsif params[:remove_from_followers]
'remove_from_followers'
elsif params[:block_domains]
'block_domains'
elsif params[:block_domains] || params[:remove_domains_from_followers]
'remove_domains_from_followers'
end
end

Expand Down
10 changes: 4 additions & 6 deletions app/models/form/account_batch.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ def save
unfollow!
when 'remove_from_followers'
remove_from_followers!
when 'block_domains'
block_domains!
when 'remove_domains_from_followers'
remove_domains_from_followers!
when 'approve'
approve!
when 'reject'
Expand Down Expand Up @@ -50,10 +50,8 @@ def remove_from_followers!
RemoveFromFollowersService.new.call(current_account, account_ids)
end

def block_domains!
AfterAccountDomainBlockWorker.push_bulk(account_domains) do |domain|
[current_account.id, domain]
end
def remove_domains_from_followers!
RemoveDomainsFromFollowersService.new.call(current_account, account_domains)
end

def account_domains
Expand Down
23 changes: 23 additions & 0 deletions app/services/remove_domains_from_followers_service.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# frozen_string_literal: true

class RemoveDomainsFromFollowersService < BaseService
include Payloadable

def call(source_account, target_domains)
source_account.passive_relationships.where(account_id: Account.where(domain: target_domains)).find_each do |follow|
follow.destroy

create_notification(follow) if source_account.local? && !follow.account.local? && follow.account.activitypub?
end
end

private

def create_notification(follow)
ActivityPub::DeliveryWorker.perform_async(build_json(follow), follow.target_account_id, follow.account.inbox_url)
end

def build_json(follow)
Oj.dump(serialize_payload(follow, ActivityPub::RejectFollowSerializer))
end
end
2 changes: 1 addition & 1 deletion app/views/relationships/show.html.haml
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@

= f.button safe_join([fa_icon('trash'), t('relationships.remove_selected_followers')]), name: :remove_from_followers, class: 'table-action-link', type: :submit, data: { confirm: t('relationships.confirm_remove_selected_followers') } unless following_relationship?

= f.button safe_join([fa_icon('trash'), t('relationships.remove_selected_domains')]), name: :block_domains, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') } if followed_by_relationship?
= f.button safe_join([fa_icon('trash'), t('relationships.remove_selected_domains')]), name: :remove_domains_from_followers, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') } if followed_by_relationship?
.batch-table__body
- if @accounts.empty?
= nothing_here 'nothing-here--under-tabs'
Expand Down
11 changes: 10 additions & 1 deletion spec/controllers/relationships_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@
end

context 'when select parameter is provided' do
subject { patch :update, params: { form_account_batch: { account_ids: [poopfeast.id] }, block_domains: '' } }
subject { patch :update, params: { form_account_batch: { account_ids: [poopfeast.id] }, remove_domains_from_followers: '' } }

it 'soft-blocks followers from selected domains' do
poopfeast.follow!(user.account)
Expand All @@ -69,6 +69,15 @@
expect(poopfeast.following?(user.account)).to be false
end

it 'does not unfollow users from selected domains' do
user.account.follow!(poopfeast)

sign_in user, scope: :user
subject

expect(user.account.following?(poopfeast)).to be true
end

include_examples 'authenticate user'
include_examples 'redirects back to followers page'
end
Expand Down

0 comments on commit c2a046d

Please sign in to comment.