PageRenderTime 48ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/spec/lib/gitlab/auth_spec.rb

https://gitlab.com/ivlt/gitlab-ce
Ruby | 177 lines | 139 code | 38 blank | 0 comment | 1 complexity | 7f5c13dbc00f8a14b527d074e60fbc9a MD5 | raw file
  1. require 'spec_helper'
  2. describe Gitlab::Auth, lib: true do
  3. let(:gl_auth) { described_class }
  4. describe 'find_for_git_client' do
  5. context 'build token' do
  6. subject { gl_auth.find_for_git_client('gitlab-ci-token', build.token, project: project, ip: 'ip') }
  7. context 'for running build' do
  8. let!(:build) { create(:ci_build, :running) }
  9. let(:project) { build.project }
  10. before do
  11. expect(gl_auth).to receive(:rate_limit!).with('ip', success: true, login: 'gitlab-ci-token')
  12. end
  13. it 'recognises user-less build' do
  14. expect(subject).to eq(Gitlab::Auth::Result.new(nil, build.project, :ci, build_authentication_abilities))
  15. end
  16. it 'recognises user token' do
  17. build.update(user: create(:user))
  18. expect(subject).to eq(Gitlab::Auth::Result.new(build.user, build.project, :build, build_authentication_abilities))
  19. end
  20. end
  21. (HasStatus::AVAILABLE_STATUSES - ['running']).each do |build_status|
  22. context "for #{build_status} build" do
  23. let!(:build) { create(:ci_build, status: build_status) }
  24. let(:project) { build.project }
  25. before do
  26. expect(gl_auth).to receive(:rate_limit!).with('ip', success: false, login: 'gitlab-ci-token')
  27. end
  28. it 'denies authentication' do
  29. expect(subject).to eq(Gitlab::Auth::Result.new)
  30. end
  31. end
  32. end
  33. end
  34. it 'recognizes other ci services' do
  35. project = create(:empty_project)
  36. project.create_drone_ci_service(active: true)
  37. project.drone_ci_service.update(token: 'token')
  38. ip = 'ip'
  39. expect(gl_auth).to receive(:rate_limit!).with(ip, success: true, login: 'drone-ci-token')
  40. expect(gl_auth.find_for_git_client('drone-ci-token', 'token', project: project, ip: ip)).to eq(Gitlab::Auth::Result.new(nil, project, :ci, build_authentication_abilities))
  41. end
  42. it 'recognizes master passwords' do
  43. user = create(:user, password: 'password')
  44. ip = 'ip'
  45. expect(gl_auth).to receive(:rate_limit!).with(ip, success: true, login: user.username)
  46. expect(gl_auth.find_for_git_client(user.username, 'password', project: nil, ip: ip)).to eq(Gitlab::Auth::Result.new(user, nil, :gitlab_or_ldap, full_authentication_abilities))
  47. end
  48. it 'recognizes user lfs tokens' do
  49. user = create(:user)
  50. ip = 'ip'
  51. token = Gitlab::LfsToken.new(user).generate
  52. expect(gl_auth).to receive(:rate_limit!).with(ip, success: true, login: user.username)
  53. expect(gl_auth.find_for_git_client(user.username, token, project: nil, ip: ip)).to eq(Gitlab::Auth::Result.new(user, nil, :lfs_token, full_authentication_abilities))
  54. end
  55. it 'recognizes deploy key lfs tokens' do
  56. key = create(:deploy_key)
  57. ip = 'ip'
  58. token = Gitlab::LfsToken.new(key).generate
  59. expect(gl_auth).to receive(:rate_limit!).with(ip, success: true, login: "lfs+deploy-key-#{key.id}")
  60. expect(gl_auth.find_for_git_client("lfs+deploy-key-#{key.id}", token, project: nil, ip: ip)).to eq(Gitlab::Auth::Result.new(key, nil, :lfs_deploy_token, read_authentication_abilities))
  61. end
  62. it 'recognizes OAuth tokens' do
  63. user = create(:user)
  64. application = Doorkeeper::Application.create!(name: "MyApp", redirect_uri: "https://app.com", owner: user)
  65. token = Doorkeeper::AccessToken.create!(application_id: application.id, resource_owner_id: user.id)
  66. ip = 'ip'
  67. expect(gl_auth).to receive(:rate_limit!).with(ip, success: true, login: 'oauth2')
  68. expect(gl_auth.find_for_git_client("oauth2", token.token, project: nil, ip: ip)).to eq(Gitlab::Auth::Result.new(user, nil, :oauth, read_authentication_abilities))
  69. end
  70. it 'returns double nil for invalid credentials' do
  71. login = 'foo'
  72. ip = 'ip'
  73. expect(gl_auth).to receive(:rate_limit!).with(ip, success: false, login: login)
  74. expect(gl_auth.find_for_git_client(login, 'bar', project: nil, ip: ip)).to eq(Gitlab::Auth::Result.new)
  75. end
  76. end
  77. describe 'find_with_user_password' do
  78. let!(:user) do
  79. create(:user,
  80. username: username,
  81. password: password,
  82. password_confirmation: password)
  83. end
  84. let(:username) { 'John' } # username isn't lowercase, test this
  85. let(:password) { 'my-secret' }
  86. it "finds user by valid login/password" do
  87. expect( gl_auth.find_with_user_password(username, password) ).to eql user
  88. end
  89. it 'finds user by valid email/password with case-insensitive email' do
  90. expect(gl_auth.find_with_user_password(user.email.upcase, password)).to eql user
  91. end
  92. it 'finds user by valid username/password with case-insensitive username' do
  93. expect(gl_auth.find_with_user_password(username.upcase, password)).to eql user
  94. end
  95. it "does not find user with invalid password" do
  96. password = 'wrong'
  97. expect( gl_auth.find_with_user_password(username, password) ).not_to eql user
  98. end
  99. it "does not find user with invalid login" do
  100. user = 'wrong'
  101. expect( gl_auth.find_with_user_password(username, password) ).not_to eql user
  102. end
  103. context "with ldap enabled" do
  104. before do
  105. allow(Gitlab::LDAP::Config).to receive(:enabled?).and_return(true)
  106. end
  107. it "tries to autheticate with db before ldap" do
  108. expect(Gitlab::LDAP::Authentication).not_to receive(:login)
  109. gl_auth.find_with_user_password(username, password)
  110. end
  111. it "uses ldap as fallback to for authentication" do
  112. expect(Gitlab::LDAP::Authentication).to receive(:login)
  113. gl_auth.find_with_user_password('ldap_user', 'password')
  114. end
  115. end
  116. end
  117. private
  118. def build_authentication_abilities
  119. [
  120. :read_project,
  121. :build_download_code,
  122. :build_read_container_image,
  123. :build_create_container_image
  124. ]
  125. end
  126. def read_authentication_abilities
  127. [
  128. :read_project,
  129. :download_code,
  130. :read_container_image
  131. ]
  132. end
  133. def full_authentication_abilities
  134. read_authentication_abilities + [
  135. :push_code,
  136. :create_container_image
  137. ]
  138. end
  139. end