diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2019-12-04 03:06:15 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2019-12-04 03:06:15 +0300 |
commit | e2334f3613aae1c0f5b99d908e1c51213bfd7635 (patch) | |
tree | 8fd02806b70ffe4d49633412bfa2c7b58304095c /lib/api | |
parent | 4529c19950e412f0461910585414f8633d3b1b18 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'lib/api')
-rw-r--r-- | lib/api/helpers/internal_helpers.rb | 4 | ||||
-rw-r--r-- | lib/api/internal/base.rb | 63 | ||||
-rw-r--r-- | lib/api/support/git_access_actor.rb | 12 |
3 files changed, 30 insertions, 49 deletions
diff --git a/lib/api/helpers/internal_helpers.rb b/lib/api/helpers/internal_helpers.rb index dfac777e4a1..b03eb5ad440 100644 --- a/lib/api/helpers/internal_helpers.rb +++ b/lib/api/helpers/internal_helpers.rb @@ -7,6 +7,10 @@ module API delegate :wiki?, to: :repo_type + def actor + @actor ||= Support::GitAccessActor.from_params(params) + end + def repo_type set_project unless defined?(@repo_type) # rubocop:disable Gitlab/ModuleWithInstanceVariables @repo_type # rubocop:disable Gitlab/ModuleWithInstanceVariables diff --git a/lib/api/internal/base.rb b/lib/api/internal/base.rb index c70f2f3e2c8..50142b8641e 100644 --- a/lib/api/internal/base.rb +++ b/lib/api/internal/base.rb @@ -7,7 +7,6 @@ module API before { authenticate_by_gitlab_shell_token! } helpers ::API::Helpers::InternalHelpers - helpers ::Gitlab::Identifier UNKNOWN_CHECK_RESULT_ERROR = 'Unknown check result'.freeze @@ -35,7 +34,6 @@ module API env = parse_env Gitlab::Git::HookEnv.set(gl_repository, env) if project - actor = Support::GitAccessActor.from_params(params) actor.update_last_used_at! access_checker = access_checker_for(actor, params[:protocol]) @@ -103,36 +101,30 @@ module API check_allowed(params) end - # rubocop: disable CodeReuse/ActiveRecord post "/lfs_authenticate" do status 200 - if params[:key_id] - actor = Key.find(params[:key_id]) - actor.update_last_used_at - elsif params[:user_id] - actor = User.find_by(id: params[:user_id]) - raise ActiveRecord::RecordNotFound.new("No such user id!") unless actor - else - raise ActiveRecord::RecordNotFound.new("No key_id or user_id passed!") + unless actor.key_or_user + raise ActiveRecord::RecordNotFound.new('User not found!') end + actor.update_last_used_at! + Gitlab::LfsToken - .new(actor) + .new(actor.key_or_user) .authentication_payload(lfs_authentication_url(project)) end - # rubocop: enable CodeReuse/ActiveRecord # # Get a ssh key using the fingerprint # # rubocop: disable CodeReuse/ActiveRecord - get "/authorized_keys" do + get '/authorized_keys' do fingerprint = params.fetch(:fingerprint) do Gitlab::InsecureKeyFingerprint.new(params.fetch(:key)).fingerprint end key = Key.find_by(fingerprint: fingerprint) - not_found!("Key") if key.nil? + not_found!('Key') if key.nil? present key, with: Entities::SSHKey end # rubocop: enable CodeReuse/ActiveRecord @@ -141,16 +133,10 @@ module API # Discover user by ssh key, user id or username # get '/discover' do - if params[:key_id] - user = UserFinder.new(params[:key_id]).find_by_ssh_key_id - elsif params[:username] - user = UserFinder.new(params[:username]).find_by_username - end - - present user, with: Entities::UserSafe + present actor.user, with: Entities::UserSafe end - get "/check" do + get '/check' do { api_version: API.version, gitlab_version: Gitlab::VERSION, @@ -158,35 +144,26 @@ module API redis: redis_ping } end - - # rubocop: disable CodeReuse/ActiveRecord post '/two_factor_recovery_codes' do status 200 - if params[:key_id] - key = Key.find_by(id: params[:key_id]) + actor.update_last_used_at! + user = actor.user - if key - key.update_last_used_at - else - break { 'success' => false, 'message' => 'Could not find the given key' } + if params[:key_id] + unless actor.key + break { success: false, message: 'Could not find the given key' } end - if key.is_a?(DeployKey) + if actor.key.is_a?(DeployKey) break { success: false, message: 'Deploy keys cannot be used to retrieve recovery codes' } end - user = key.user - unless user break { success: false, message: 'Could not find a user for the given key' } end - elsif params[:user_id] - user = User.find_by(id: params[:user_id]) - - unless user - break { success: false, message: 'Could not find the given user' } - end + elsif params[:user_id] && user.nil? + break { success: false, message: 'Could not find the given user' } end unless user.two_factor_enabled? @@ -201,7 +178,6 @@ module API { success: true, recovery_codes: codes } end - # rubocop: enable CodeReuse/ActiveRecord post '/pre_receive' do status 200 @@ -211,7 +187,7 @@ module API { reference_counter_increased: reference_counter_increased } end - post "/notify_post_receive" do + post '/notify_post_receive' do status 200 # TODO: Re-enable when Gitaly is processing the post-receive notification @@ -229,8 +205,7 @@ module API status 200 response = Gitlab::InternalPostReceive::Response.new - user = identify(params[:identifier]) - project = Gitlab::GlRepository.parse(params[:gl_repository]).first + user = actor.user push_options = Gitlab::PushOptions.new(params[:push_options]) response.reference_counter_decreased = Gitlab::ReferenceCounter.new(params[:gl_repository]).decrease diff --git a/lib/api/support/git_access_actor.rb b/lib/api/support/git_access_actor.rb index 2e0962c6295..cb9bf4472eb 100644 --- a/lib/api/support/git_access_actor.rb +++ b/lib/api/support/git_access_actor.rb @@ -3,7 +3,9 @@ module API module Support class GitAccessActor - attr_reader :user + extend ::Gitlab::Identifier + + attr_reader :user, :key def initialize(user: nil, key: nil) @user = user @@ -19,6 +21,10 @@ module API new(user: UserFinder.new(params[:user_id]).find_by_id) elsif params[:username] new(user: UserFinder.new(params[:username]).find_by_username) + elsif params[:identifier] + new(user: identify(params[:identifier])) + else + new end end @@ -33,10 +39,6 @@ module API def update_last_used_at! key&.update_last_used_at end - - private - - attr_reader :key end end end |