54 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			54 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
| # frozen_string_literal: true
 | |
| 
 | |
| # Detect user based on identifier like
 | |
| # key-13 or user-36
 | |
| module Gitlab
 | |
|   module Identifier
 | |
|     def identify(identifier)
 | |
|       if identifier =~ /\Auser-\d+\Z/
 | |
|         # git push over http
 | |
|         identify_using_user(identifier)
 | |
|       elsif identifier =~ /\Akey-\d+\Z/
 | |
|         # git push over ssh
 | |
|         identify_using_ssh_key(identifier)
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     # Tries to identify a user based on a user identifier (e.g. "user-123").
 | |
|     # rubocop: disable CodeReuse/ActiveRecord
 | |
|     def identify_using_user(identifier)
 | |
|       user_id = identifier.gsub("user-", "")
 | |
| 
 | |
|       identify_with_cache(:user, user_id) do
 | |
|         User.find_by(id: user_id)
 | |
|       end
 | |
|     end
 | |
|     # rubocop: enable CodeReuse/ActiveRecord
 | |
| 
 | |
|     # Tries to identify a user based on an SSH key identifier (e.g. "key-123").
 | |
|     def identify_using_ssh_key(identifier)
 | |
|       key_id = identifier.gsub("key-", "")
 | |
| 
 | |
|       identify_with_cache(:ssh_key, key_id) do
 | |
|         User.find_by_ssh_key_id(key_id)
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     def identify_with_cache(category, key)
 | |
|       if identification_cache[category].key?(key)
 | |
|         identification_cache[category][key]
 | |
|       else
 | |
|         identification_cache[category][key] = yield
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     def identification_cache
 | |
|       @identification_cache ||= {
 | |
|         email: {},
 | |
|         user: {},
 | |
|         ssh_key: {}
 | |
|       }
 | |
|     end
 | |
|   end
 | |
| end
 |