Browse Source

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
pull/4/head
ThibG 5 years ago
committed by Eugen Rochko
parent
commit
70be301d69
2 changed files with 65 additions and 7 deletions
  1. +3
    -2
      app/lib/activitypub/activity/block.rb
  2. +62
    -5
      spec/lib/activitypub/activity/block_spec.rb

+ 3
- 2
app/lib/activitypub/activity/block.rb View File

@ -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

+ 62
- 5
spec/lib/activitypub/activity/block_spec.rb View File

@ -14,15 +14,72 @@ RSpec.describe ActivityPub::Activity::Block do
}.with_indifferent_access }.with_indifferent_access
end end
describe '#perform' do
subject { described_class.new(json, sender) }
context 'when the recipient does not follow the sender' do
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
expect(sender.blocking?(recipient)).to be true
describe '#perform' do
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