@ -60,7 +60,22 @@ RSpec.describe ResolveAccountService, type: :service do
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  context  'with a legitimate webfinger redirection'  do 
 
					 
					 
					 
					  context  'with a legitimate webfinger redirection'  do 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    before  do 
 
					 
					 
					 
					    before  do 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      webfinger  =  {  subject :  'acct:foo@ap.example.com' ,  links :  [ {  rel :  'self' ,  href :  'https://ap.example.com/users/foo'  } ]  } 
 
					 
					 
					 
					      webfinger  =  {  subject :  'acct:foo@ap.example.com' ,  links :  [ {  rel :  'self' ,  href :  'https://ap.example.com/users/foo' ,  type :  'application/activity+json'  } ]  } 
 
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      stub_request ( :get ,  'https://redirected.example.com/.well-known/webfinger?resource=acct:Foo@redirected.example.com' ) . to_return ( body :  Oj . dump ( webfinger ) ,  headers :  {  'Content-Type' :  'application/jrd+json'  } ) 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    end 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    it  'returns new remote account'  do 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      account  =  subject . call ( 'Foo@redirected.example.com' ) 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      expect ( account . activitypub? ) . to  eq  true 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      expect ( account . acct ) . to  eq  'foo@ap.example.com' 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      expect ( account . inbox_url ) . to  eq  'https://ap.example.com/users/foo/inbox' 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    end 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  end 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  context  'with a misconfigured redirection'  do 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    before  do 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      webfinger  =  {  subject :  'acct:Foo@redirected.example.com' ,  links :  [ {  rel :  'self' ,  href :  'https://ap.example.com/users/foo' ,  type :  'application/activity+json'  } ]  } 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      stub_request ( :get ,  'https://redirected.example.com/.well-known/webfinger?resource=acct:Foo@redirected.example.com' ) . to_return ( body :  Oj . dump ( webfinger ) ,  headers :  {  'Content-Type' :  'application/jrd+json'  } ) 
 
					 
					 
					 
					      stub_request ( :get ,  'https://redirected.example.com/.well-known/webfinger?resource=acct:Foo@redirected.example.com' ) . to_return ( body :  Oj . dump ( webfinger ) ,  headers :  {  'Content-Type' :  'application/jrd+json'  } ) 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    end 
 
					 
					 
					 
					    end 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					 
					@ -75,9 +90,9 @@ RSpec.describe ResolveAccountService, type: :service do
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  context  'with too many webfinger redirections'  do 
 
					 
					 
					 
					  context  'with too many webfinger redirections'  do 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    before  do 
 
					 
					 
					 
					    before  do 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      webfinger  =  {  subject :  'acct:foo@evil.example.com' ,  links :  [ {  rel :  'self' ,  href :  'https://ap.example.com/users/foo'  } ]  } 
 
					 
					 
					 
					      webfinger  =  {  subject :  'acct:foo@evil.example.com' ,  links :  [ {  rel :  'self' ,  href :  'https://ap.example.com/users/foo' ,  type :  'application/activity+json'   } ]  } 
 
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					      stub_request ( :get ,  'https://redirected.example.com/.well-known/webfinger?resource=acct:Foo@redirected.example.com' ) . to_return ( body :  Oj . dump ( webfinger ) ,  headers :  {  'Content-Type' :  'application/jrd+json'  } ) 
 
					 
					 
					 
					      stub_request ( :get ,  'https://redirected.example.com/.well-known/webfinger?resource=acct:Foo@redirected.example.com' ) . to_return ( body :  Oj . dump ( webfinger ) ,  headers :  {  'Content-Type' :  'application/jrd+json'  } ) 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      webfinger2  =  {  subject :  'acct:foo@ap.example.com' ,  links :  [ {  rel :  'self' ,  href :  'https://ap.example.com/users/foo'  } ]  } 
 
					 
					 
					 
					      webfinger2  =  {  subject :  'acct:foo@ap.example.com' ,  links :  [ {  rel :  'self' ,  href :  'https://ap.example.com/users/foo' ,  type :  'application/activity+json'   } ]  } 
 
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					      stub_request ( :get ,  'https://evil.example.com/.well-known/webfinger?resource=acct:foo@evil.example.com' ) . to_return ( body :  Oj . dump ( webfinger2 ) ,  headers :  {  'Content-Type' :  'application/jrd+json'  } ) 
 
					 
					 
					 
					      stub_request ( :get ,  'https://evil.example.com/.well-known/webfinger?resource=acct:foo@evil.example.com' ) . to_return ( body :  Oj . dump ( webfinger2 ) ,  headers :  {  'Content-Type' :  'application/jrd+json'  } ) 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    end 
 
					 
					 
					 
					    end 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
	
		
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
					 
					@ -111,6 +126,41 @@ RSpec.describe ResolveAccountService, type: :service do
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    end 
 
					 
					 
					 
					    end 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  end 
 
					 
					 
					 
					  end 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  context  'with an already-known actor changing acct: URI'  do 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    let! ( :duplicate )  {  Fabricate ( :account ,  username :  'foo' ,  domain :  'old.example.com' ,  uri :  'https://ap.example.com/users/foo' )  } 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    let! ( :status )     {  Fabricate ( :status ,  account :  duplicate ,  text :  'foo' )  } 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    it  'returns new remote account'  do 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      account  =  subject . call ( 'foo@ap.example.com' ) 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      expect ( account . activitypub? ) . to  eq  true 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      expect ( account . domain ) . to  eq  'ap.example.com' 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      expect ( account . inbox_url ) . to  eq  'https://ap.example.com/users/foo/inbox' 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      expect ( account . uri ) . to  eq  'https://ap.example.com/users/foo' 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    end 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    it  'merges accounts'  do 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      account  =  subject . call ( 'foo@ap.example.com' ) 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      expect ( status . reload . account_id ) . to  eq  account . id 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      expect ( Account . where ( uri :  account . uri ) . count ) . to  eq  1 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    end 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  end 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  context  'with an already-known acct: URI changing ActivityPub id'  do 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    let! ( :old_account )  {  Fabricate ( :account ,  username :  'foo' ,  domain :  'ap.example.com' ,  uri :  'https://old.example.com/users/foo' ,  last_webfingered_at :  nil )  } 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    let! ( :status )     {  Fabricate ( :status ,  account :  old_account ,  text :  'foo' )  } 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    it  'returns new remote account'  do 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      account  =  subject . call ( 'foo@ap.example.com' ) 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      expect ( account . activitypub? ) . to  eq  true 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      expect ( account . domain ) . to  eq  'ap.example.com' 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      expect ( account . inbox_url ) . to  eq  'https://ap.example.com/users/foo/inbox' 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      expect ( account . uri ) . to  eq  'https://ap.example.com/users/foo' 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    end 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  end 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  it  'processes one remote account at a time using locks'  do 
 
					 
					 
					 
					  it  'processes one remote account at a time using locks'  do 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    wait_for_start  =  true 
 
					 
					 
					 
					    wait_for_start  =  true 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    fail_occurred   =  false 
 
					 
					 
					 
					    fail_occurred   =  false