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
This commit is contained in:
		
							parent
							
								
									ebe56fbca1
								
							
						
					
					
						commit
						ffcaa4719a
					
				
					 2 changed files with 65 additions and 7 deletions
				
			
		|  | @ -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 |     before do | ||||||
|       subject.perform |       recipient.follow!(sender) | ||||||
|     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 '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 | ||||||
|  |       recipient.follow!(sender) | ||||||
|  |       ActivityPub::Activity::Undo.new(undo_json, sender).perform | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     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…
	
		Reference in a new issue