Ensure blocked user unfollows blocker if Block/Undo Block are processed out of order (#9687)

* Ensure blocked user unfollows blocker if Block/Undo Block are processed out of order

* Add specs for Block causing unfollow and for out-of-order Block + Undo
master
ThibG 6 years ago committed by Eugen Rochko
parent 5339554076
commit 70be301d69
  1. 5
      app/lib/activitypub/activity/block.rb
  2. 67
      spec/lib/activitypub/activity/block_spec.rb

@ -4,9 +4,10 @@ class ActivityPub::Activity::Block < ActivityPub::Activity
def perform def perform
target_account = account_from_uri(object_uri) target_account = account_from_uri(object_uri)
return if target_account.nil? || !target_account.local? || delete_arrived_first?(@json['id']) || @account.blocking?(target_account) return if target_account.nil? || !target_account.local? || @account.blocking?(target_account)
UnfollowService.new.call(target_account, @account) if target_account.following?(@account) UnfollowService.new.call(target_account, @account) if target_account.following?(@account)
@account.block!(target_account, uri: @json['id'])
@account.block!(target_account, uri: @json['id']) unless delete_arrived_first?(@json['id'])
end end
end end

@ -14,15 +14,72 @@ RSpec.describe ActivityPub::Activity::Block do
}.with_indifferent_access }.with_indifferent_access
end end
describe '#perform' do context 'when the recipient does not follow the sender' do
subject { described_class.new(json, sender) } describe '#perform' do
subject { described_class.new(json, sender) }
before do
subject.perform
end
it 'creates a block from sender to recipient' do
expect(sender.blocking?(recipient)).to be true
end
end
end
context 'when the recipient follows the sender' do
before do
recipient.follow!(sender)
end
describe '#perform' do
subject { described_class.new(json, sender) }
before do
subject.perform
end
it 'creates a block from sender to recipient' do
expect(sender.blocking?(recipient)).to be true
end
it 'ensures recipient is not following sender' do
expect(recipient.following?(sender)).to be false
end
end
end
context 'when a matching undo has been received first' do
let(:undo_json) do
{
'@context': 'https://www.w3.org/ns/activitystreams',
id: 'bar',
type: 'Undo',
actor: ActivityPub::TagManager.instance.uri_for(sender),
object: json,
}.with_indifferent_access
end
before do before do
subject.perform recipient.follow!(sender)
ActivityPub::Activity::Undo.new(undo_json, sender).perform
end end
it 'creates a block from sender to recipient' do describe '#perform' do
expect(sender.blocking?(recipient)).to be true subject { described_class.new(json, sender) }
before do
subject.perform
end
it 'does not create a block from sender to recipient' do
expect(sender.blocking?(recipient)).to be false
end
it 'ensures recipient is not following sender' do
expect(recipient.following?(sender)).to be false
end
end end
end end
end end

Loading…
Cancel
Save