@ -9,17 +9,27 @@ class ResolveAccountService < BaseService
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  # Find or create a local account for a remote user. 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  # When creating, look up the user's webfinger and fetch all 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  # important information from their feed 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  # @param [String] uri User URI in the form of username@domain 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  # @param [String, Account] uri User URI in the form of username@domain 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  # @param [Hash] options 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  # @return [Account] 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  def  call ( uri ,  update_profile  =  true ,  redirected  =  nil ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    @username ,  @domain  =  uri . split ( '@' ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    @update_profile     =  update_profile 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  def  call ( uri ,  options  =  { } ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    @options  =  options 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    return  Account . find_local ( @username )  if  TagManager . instance . local_domain? ( @domain ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    if  uri . is_a? ( Account ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				      @account   =  uri 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				      @username  =  @account . username 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				      @domain    =  @account . domain 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				      return  @account  if  @account . local?  ||  ! webfinger_update_due? 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    else 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				      @username ,  @domain  =  uri . split ( '@' ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    @account  =  Account . find_remote ( @username ,  @domain ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				      return  Account . find_local ( @username )  if  TagManager . instance . local_domain? (  @domain ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    return  @account  unless  webfinger_update_due? 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				      @account  =  Account . find_remote ( @username ,  @domain ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				      return  @account  unless  webfinger_update_due? 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    end 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    Rails . logger . debug  " Looking up webfinger for  #{ uri } " 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
			
			 
			 
			
				@ -30,8 +40,8 @@ class ResolveAccountService < BaseService
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    if  confirmed_username . casecmp ( @username ) . zero?  &&  confirmed_domain . casecmp ( @domain ) . zero? 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				      @username  =  confirmed_username 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				      @domain    =  confirmed_domain 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    elsif   redirected. nil? 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				      return  call ( " #{ confirmed_username } @ #{ confirmed_domain } " ,  update_profile,  true  ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    elsif  options[ :  redirected] . nil? 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				      return  call ( " #{ confirmed_username } @ #{ confirmed_domain } " ,  options. merge ( redirected :  true )  ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    else 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				      Rails . logger . debug  'Requested and returned acct URIs do not match' 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				      return 
 
			
		 
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
			
			 
			 
			
				@ -76,7 +86,7 @@ class ResolveAccountService < BaseService
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  end 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  def  webfinger_update_due? 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    @account . nil?  ||  @account . possibly_stale? 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    @account . nil?  ||  ( ( ! @options [ :skip_webfinger ]  ||  @account . ostatus? )  &&  @account . possibly_stale? ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  end 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  def  activitypub_ready? 
 
			
		 
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
			
			 
			 
			
				@ -93,7 +103,7 @@ class ResolveAccountService < BaseService
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  end 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  def  update_profile? 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    @ update_profile
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    @ options[ :  update_profile] 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  end 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  def  handle_activitypub