session_spec.rb 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. require 'rails_helper'
  2. RSpec.describe 'Sessions endpoints', type: :request do
  3. describe 'GET /signshow' do
  4. context 'user logged in' do
  5. subject(:user) { create(:agent_user, password: password) }
  6. let(:password) { SecureRandom.urlsafe_base64(20) }
  7. let(:fingerprint) { SecureRandom.urlsafe_base64(40) }
  8. before do
  9. params = {
  10. fingerprint: fingerprint,
  11. username: user.login,
  12. password: password
  13. }
  14. post '/api/v1/signin', params: params, as: :json
  15. end
  16. it 'leaks no sensitive data' do
  17. params = { fingerprint: fingerprint }
  18. get '/api/v1/signshow', params: params, as: :json
  19. expect(json_response['session']).not_to include('password')
  20. end
  21. end
  22. end
  23. describe 'GET /auth/sso (single sign-on)' do
  24. context 'with invalid user login' do
  25. let(:login) { User.pluck(:login).max.next }
  26. context 'in "REMOTE_USER" request env var' do
  27. let(:env) { { 'REMOTE_USER' => login } }
  28. it 'returns unauthorized response' do
  29. get '/auth/sso', as: :json, env: env
  30. expect(response).to have_http_status(:unauthorized)
  31. end
  32. end
  33. context 'in "HTTP_REMOTE_USER" request env var' do
  34. let(:env) { { 'HTTP_REMOTE_USER' => login } }
  35. it 'returns unauthorized response' do
  36. get '/auth/sso', as: :json, env: env
  37. expect(response).to have_http_status(:unauthorized)
  38. end
  39. end
  40. context 'in "X-Forwarded-User" request header' do
  41. let(:headers) { { 'X-Forwarded-User' => login } }
  42. it 'returns unauthorized response' do
  43. get '/auth/sso', as: :json, headers: headers
  44. expect(response).to have_http_status(:unauthorized)
  45. end
  46. end
  47. end
  48. context 'with valid user login' do
  49. let(:user) { User.last }
  50. let(:login) { user.login }
  51. context 'in Maintenance Mode' do
  52. before { Setting.set('maintenance_mode', true) }
  53. context 'in "REMOTE_USER" request env var' do
  54. let(:env) { { 'REMOTE_USER' => login } }
  55. it 'returns 401 unauthorized' do
  56. get '/auth/sso', as: :json, env: env
  57. expect(response).to have_http_status(:unauthorized)
  58. expect(json_response).to include('error' => 'Maintenance mode enabled!')
  59. end
  60. end
  61. context 'in "HTTP_REMOTE_USER" request env var' do
  62. let(:env) { { 'HTTP_REMOTE_USER' => login } }
  63. it 'returns 401 unauthorized' do
  64. get '/auth/sso', as: :json, env: env
  65. expect(response).to have_http_status(:unauthorized)
  66. expect(json_response).to include('error' => 'Maintenance mode enabled!')
  67. end
  68. end
  69. context 'in "X-Forwarded-User" request header' do
  70. let(:headers) { { 'X-Forwarded-User' => login } }
  71. it 'returns 401 unauthorized' do
  72. get '/auth/sso', as: :json, headers: headers
  73. expect(response).to have_http_status(:unauthorized)
  74. expect(json_response).to include('error' => 'Maintenance mode enabled!')
  75. end
  76. end
  77. end
  78. context 'in "REMOTE_USER" request env var' do
  79. let(:env) { { 'REMOTE_USER' => login } }
  80. it 'returns a new user-session response' do
  81. get '/auth/sso', as: :json, env: env
  82. expect(response).to redirect_to('/#')
  83. end
  84. it 'sets the :user_id session parameter' do
  85. expect { get '/auth/sso', as: :json, env: env }
  86. .to change { request&.session&.fetch(:user_id) }.to(user.id)
  87. end
  88. end
  89. context 'in "HTTP_REMOTE_USER" request env var' do
  90. let(:env) { { 'HTTP_REMOTE_USER' => login } }
  91. it 'returns a new user-session response' do
  92. get '/auth/sso', as: :json, env: env
  93. expect(response).to redirect_to('/#')
  94. end
  95. it 'sets the :user_id session parameter' do
  96. expect { get '/auth/sso', as: :json, env: env }
  97. .to change { request&.session&.fetch(:user_id) }.to(user.id)
  98. end
  99. end
  100. context 'in "X-Forwarded-User" request header' do
  101. let(:headers) { { 'X-Forwarded-User' => login } }
  102. it 'returns a new user-session response' do
  103. get '/auth/sso', as: :json, headers: headers
  104. expect(response).to redirect_to('/#')
  105. end
  106. it 'sets the :user_id session parameter on the client' do
  107. expect { get '/auth/sso', as: :json, headers: headers }
  108. .to change { request&.session&.fetch(:user_id) }.to(user.id)
  109. end
  110. end
  111. end
  112. end
  113. end