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
 |