diff --git a/app/controllers/jwt_controller.rb b/app/controllers/jwt_controller.rb index 7d6fe6a02326ea4de5aabf73a4798e5183691a2d..76e7473e92ce91b1c36269cbfcbd46127679baa6 100644 --- a/app/controllers/jwt_controller.rb +++ b/app/controllers/jwt_controller.rb @@ -23,10 +23,11 @@ def authenticate_project_or_user @authentication_result = Gitlab::Auth::Result.new(nil, nil, :none, Gitlab::Auth.read_authentication_abilities) authenticate_with_http_basic do |login, password| - @authentication_result = Gitlab::Auth.find_for_git_client(login, password, project: nil, ip: request.ip) + project = find_project_related(password) + @authentication_result = Gitlab::Auth.find_for_git_client(login, password, project: project, ip: request.ip) if @authentication_result.failed? || - (@authentication_result.actor.present? && !@authentication_result.actor.is_a?(User)) + (@authentication_result.actor.present? && !user_or_deploy_token) render_unauthorized end end @@ -57,4 +58,12 @@ def render_unauthorized def auth_params params.permit(:service, :scope, :account, :client_id) end + + def find_project_related(password) + DeployToken.active.find_by(token: password)&.project + end + + def user_or_deploy_token + @authentication_result.actor.is_a?(User) || @authentication_result.actor.is_a?(DeployToken) + end end diff --git a/spec/lib/gitlab/auth_spec.rb b/spec/lib/gitlab/auth_spec.rb index 685a0bb54bed6952aaa0468d879693869723ff80..758fb17cd81466c8d4d0f7a27a1142b0e00b1af9 100644 --- a/spec/lib/gitlab/auth_spec.rb +++ b/spec/lib/gitlab/auth_spec.rb @@ -270,14 +270,6 @@ def operation .to eq(auth_success) end - it 'fails if deploy token does not have read_repo as scope' do - deploy_token = create(:deploy_token, :read_registry, project: project) - - expect(gl_auth).to receive(:rate_limit!).with('ip', success: false, login: '') - expect(gl_auth.find_for_git_client('', deploy_token.token, project: project, ip: 'ip')) - .to eq(auth_failure) - end - it 'fails if token is nil' do expect(gl_auth).to receive(:rate_limit!).with('ip', success: false, login: '') expect(gl_auth.find_for_git_client('', nil, project: project, ip: 'ip')) @@ -305,6 +297,35 @@ def operation expect(gl_auth.find_for_git_client('deploy-token', deploy_token.token, project: project, ip: 'ip')) .to eq(auth_failure) end + + context 'when registry enabled' do + before do + stub_container_registry_config(enabled: true) + end + + it 'succeeds if deploy token does have read_registry as scope' do + deploy_token = create(:deploy_token, :read_registry, project: project) + auth_success = Gitlab::Auth::Result.new(deploy_token, project, :deploy_token, [:read_container_image]) + + expect(gl_auth).to receive(:rate_limit!).with('ip', success: true, login: '') + expect(gl_auth.find_for_git_client('', deploy_token.token, project: project, ip: 'ip')) + .to eq(auth_success) + end + end + + context 'when registry disabled' do + before do + stub_container_registry_config(enabled: false) + end + + it 'fails if deploy token have read_registry as scope' do + deploy_token = create(:deploy_token, :read_registry, project: project) + + expect(gl_auth).to receive(:rate_limit!).with('ip', success: false, login: '') + expect(gl_auth.find_for_git_client('', deploy_token.token, project: project, ip: 'ip')) + .to eq(auth_failure) + end + end end end