Commit 8fc7ea8897eb4bbdb3bd47caf8bb2e25cd6ea505

Authored by Thiago Ribeiro
1 parent c3d6bc81

Correct way the User data is passed.

Signed-off-by: Macartur Sousa <macartur.sc@gmail.com>
@@ -3,15 +3,15 @@ source &quot;http://rubygems.org&quot; @@ -3,15 +3,15 @@ source &quot;http://rubygems.org&quot;
3 gemspec 3 gemspec
4 4
5 group :development do 5 group :development do
6 - gem 'guard'  
7 - gem 'guard-bundler'  
8 - gem 'guard-rspec'  
9 - gem 'rake' 6 + gem 'guard'
  7 + gem 'guard-bundler'
  8 + gem 'guard-rspec'
  9 + gem 'rake'
10 end 10 end
11 11
12 group :test do 12 group :test do
13 - gem 'coveralls'  
14 - gem 'rack-test'  
15 - gem 'simplecov'  
16 - gem 'rspec' 13 + gem 'coveralls'
  14 + gem 'rack-test'
  15 + gem 'simplecov'
  16 + gem 'rspec'
17 end 17 end
@@ -7,5 +7,3 @@ RSpec::Core::RakeTask.new(:spec) @@ -7,5 +7,3 @@ RSpec::Core::RakeTask.new(:spec)
7 7
8 task :default => :spec 8 task :default => :spec
9 task :test => :spec 9 task :test => :spec
10 -  
11 -  
lib/omniauth-remote-user/version.rb
1 module Omniauth 1 module Omniauth
2 - module RemoteUser  
3 - VERSION = '0.0.1'  
4 - end 2 + module RemoteUser
  3 + VERSION = '0.0.1'
  4 + end
5 end 5 end
lib/omniauth/strategies/remote_user.rb
@@ -2,38 +2,31 @@ module OmniAuth @@ -2,38 +2,31 @@ module OmniAuth
2 module Strategies 2 module Strategies
3 class RemoteUser 3 class RemoteUser
4 include OmniAuth::Strategy 4 include OmniAuth::Strategy
5 -  
6 - option :internal_cookie, '_remote_user'  
7 -  
8 - def __write_file message  
9 - file = File.open("/home/git/gitlab/log/remote_user.log",'a')  
10 - file.write " \n #{message} \n"  
11 - file.close  
12 - end  
13 5
  6 + option :internal_cookie, '_remote_user'
14 7
15 def call(env) 8 def call(env)
16 9
17 remote_user = env['HTTP_REMOTE_USER'] 10 remote_user = env['HTTP_REMOTE_USER']
18 session_user = __current_user(env) 11 session_user = __current_user(env)
19 -  
20 - if remote_user  
21 - if session_user  
22 - if remote_user == session_user  
23 - super(env)  
24 - else  
25 - __logout(env)  
26 - end 12 +
  13 + if remote_user
  14 + if session_user
  15 + if remote_user == session_user
  16 + super(env)
27 else 17 else
28 - __login(env, remote_user)  
29 - end  
30 - else  
31 - if session_user  
32 __logout(env) 18 __logout(env)
33 - else  
34 - super(env)  
35 end 19 end
  20 + else
  21 + __login(env, remote_user)
  22 + end
  23 + else
  24 + if session_user
  25 + __logout(env)
  26 + else
  27 + super(env)
36 end 28 end
  29 + end
37 end 30 end
38 31
39 def __current_user(env) 32 def __current_user(env)
@@ -43,7 +36,7 @@ module OmniAuth @@ -43,7 +36,7 @@ module OmniAuth
43 36
44 def __logout(env) 37 def __logout(env)
45 request = Rack::Request.new(env) 38 request = Rack::Request.new(env)
46 - request.session.clear 39 + request.session.clear
47 response = redirect_if_not_logging_in(request, request.path ) 40 response = redirect_if_not_logging_in(request, request.path )
48 if response 41 if response
49 response.delete_cookie(options.internal_cookie , path: "#{request.script_name}" ) 42 response.delete_cookie(options.internal_cookie , path: "#{request.script_name}" )
@@ -62,15 +55,15 @@ module OmniAuth @@ -62,15 +55,15 @@ module OmniAuth
62 55
63 def redirect_if_not_logging_in(request, url) 56 def redirect_if_not_logging_in(request, url)
64 if ! [ 57 if ! [
65 - _auth_path(request),  
66 - _callback_path(request)  
67 - ].include?(request.path_info) 58 + _auth_path(request),
  59 + _callback_path(request)
  60 + ].include?(request.path_info)
68 response = Rack::Response.new 61 response = Rack::Response.new
69 response.redirect url 62 response.redirect url
70 response 63 response
71 end 64 end
72 end 65 end
73 - 66 +
74 67
75 uid do 68 uid do
76 request.env['HTTP_REMOTE_USER'] 69 request.env['HTTP_REMOTE_USER']
@@ -80,7 +73,8 @@ module OmniAuth @@ -80,7 +73,8 @@ module OmniAuth
80 user_data = request.env['HTTP_REMOTE_USER_DATA'] 73 user_data = request.env['HTTP_REMOTE_USER_DATA']
81 if user_data 74 if user_data
82 data = JSON.parse(user_data) 75 data = JSON.parse(user_data)
83 - data['nickname'] = data['name'] 76 + data['nickname'] = data['firstname'] = data['name'].split()[0]
  77 + data['lastname'] = data['name'].split()[1]
84 data 78 data
85 else 79 else
86 {} 80 {}
@@ -88,15 +82,15 @@ module OmniAuth @@ -88,15 +82,15 @@ module OmniAuth
88 end 82 end
89 83
90 def request_phase 84 def request_phase
91 - redirect _callback_path(request) 85 + redirect _callback_path(request)
92 end 86 end
93 87
94 def _callback_path(request) 88 def _callback_path(request)
95 - "#{_auth_path(request)}/callback" 89 + "#{_auth_path(request)}/callback"
96 end 90 end
97 91
98 def _auth_path(request) 92 def _auth_path(request)
99 - "#{request.script_name}#{path_prefix}/RemoteUser" 93 + "#{request.script_name}#{path_prefix}/RemoteUser"
100 end 94 end
101 95
102 end 96 end
spec/omniauth/strategies/remote_user_spec.rb
1 require 'spec_helper' 1 require 'spec_helper'
2 2
3 describe 'Test Strategy Remote_User' do 3 describe 'Test Strategy Remote_User' do
4 - let(:app) do  
5 - Rack::Builder.new do |b|  
6 - b.use Rack::Session::Cookie, :secret => 'abc123'  
7 - b.use OmniAuth::Strategies::RemoteUser  
8 - b.run lambda { |_env| [200, {}, ['My body']] }  
9 - end.to_app  
10 - end  
11 -  
12 - context 'Without REMOTE_USER and not logged in' do  
13 - before(:each){  
14 - get '/', {}, {}  
15 - }  
16 -  
17 - it 'Do nothing' do  
18 - expect(last_response.status).to eq(200)  
19 - expect(last_request.cookies['_remote_user']).to eq(nil)  
20 - expect(last_request.cookies['_gitlab_session']).to eq(nil)  
21 - end  
22 - end  
23 -  
24 - context 'Without REMOTE_USER and logged in' do  
25 - before(:each){  
26 - clear_cookies  
27 - set_cookie "_gitlab_session=test"  
28 - set_cookie "_remote_user=test"  
29 - get '/', {}, {}  
30 - }  
31 -  
32 - it 'Logout curreent user' do  
33 - cookie_session_str = "_gitlab_session=; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000" <<  
34 - "\n_remote_user=; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"  
35 - expect(last_request.cookies['_gitlab_session']).to eq('test')  
36 - expect(last_request.cookies['_remote_user']).to eq('test')  
37 - expect(last_response.status).to eq(302)  
38 - expect(last_response['Set-Cookie']).to eq(cookie_session_str)  
39 - end  
40 - end  
41 -  
42 - context 'With REMOTE_USER and not logged in' do  
43 - before(:each){  
44 - get '/', {}, { 'HTTP_REMOTE_USER' => 'foobar' }  
45 - }  
46 -  
47 - it 'logs REMOTE_USER in' do  
48 - expect(last_response.status).to eq(302)  
49 - expect(last_response['Set-Cookie']).to eq('_remote_user=foobar')  
50 - end  
51 - end  
52 -  
53 - context 'With REMOTE_USER, logged in and current user equals REMOTE_USER' do  
54 - before(:each){  
55 - clear_cookies  
56 - set_cookie "_gitlab_session=foobar"  
57 - set_cookie "_remote_user=foobar"  
58 - get '/', {}, { 'HTTP_REMOTE_USER' => 'foobar' }  
59 - }  
60 -  
61 - it 'Do nothing' do  
62 - expect(last_request.cookies['_gitlab_session']).to eq('foobar')  
63 - expect(last_request.cookies['_remote_user']).to eq('foobar')  
64 - expect(last_response.status).to eq(200)  
65 - expect(last_response['Set-Cookie']).to eq(nil)  
66 - end  
67 - end  
68 -  
69 - context 'With REMOTE_USER, logged in and current user not equals REMOTE_USER' do  
70 - before(:each){  
71 - clear_cookies  
72 - set_cookie "_gitlab_session=foobar"  
73 - set_cookie "_remote_user=foobar"  
74 - get '/', {}, { 'HTTP_REMOTE_USER' => 'foobar2' }  
75 - }  
76 -  
77 - it 'Logout current user and login REMOTE_USER and no have _gitlab_session' do  
78 - expect(last_request.cookies['_gitlab_session']).to eq('foobar')  
79 - expect(last_request.cookies['_remote_user']).to eq('foobar')  
80 - expect(last_response.status).to eq(302)  
81 - expect(last_response['Set-Cookie']).to include('_gitlab_session=')  
82 - end  
83 - end  
84 -  
85 - context 'Verify omniauth hash with REMOTE_USER_DATA' do  
86 - before(:each){  
87 - clear_cookies  
88 - post '/auth/RemoteUser/callback', {}, { 'HTTP_REMOTE_USER' => 'foobar',  
89 - 'HTTP_REMOTE_USER_DATA' => JSON.dump({'name' => 'foobar', 'email' => 'foobar@test.com'})}  
90 - }  
91 -  
92 - it 'Verify uid' do  
93 - expect(last_request.env['omniauth.auth']['uid']).to eq('foobar')  
94 - end  
95 -  
96 - it 'Verify info' do  
97 - expect(last_request.env['omniauth.auth']['info']['nickname']).to eq('foobar')  
98 - expect(last_request.env['omniauth.auth']['info']['email']).to eq('foobar@test.com')  
99 - end  
100 - end  
101 -  
102 - context 'Verify omniauth.auth info without REMOTE_USER_DATA' do  
103 - before(:each){  
104 - clear_cookies  
105 - post '/auth/RemoteUser/callback', {}, { 'HTTP_REMOTE_USER' => 'foobar' }  
106 - }  
107 -  
108 - it 'Verify uid' do  
109 - expect(last_request.env['omniauth.auth']['uid']).to eq('foobar')  
110 - end  
111 -  
112 - it 'Verify info' do  
113 - expect(last_request.env['omniauth.auth']['info']).to eq({})  
114 - end  
115 - end 4 + let(:app) do
  5 + Rack::Builder.new do |b|
  6 + b.use Rack::Session::Cookie, :secret => 'abc123'
  7 + b.use OmniAuth::Strategies::RemoteUser
  8 + b.run lambda { |_env| [200, {}, ['My body']] }
  9 + end.to_app
  10 + end
  11 +
  12 + context 'Without REMOTE_USER and not logged in' do
  13 + before(:each){
  14 + get '/', {}, {}
  15 + }
  16 +
  17 + it 'Do nothing' do
  18 + expect(last_response.status).to eq(200)
  19 + expect(last_request.cookies['_remote_user']).to eq(nil)
  20 + expect(last_request.cookies['_gitlab_session']).to eq(nil)
  21 + end
  22 + end
  23 +
  24 + context 'Without REMOTE_USER and logged in' do
  25 + before(:each){
  26 + clear_cookies
  27 + set_cookie "_gitlab_session=test"
  28 + set_cookie "_remote_user=test"
  29 + get '/', {}, {}
  30 + }
  31 +
  32 + it 'Logout curreent user' do
  33 + cookie_session_str = "_gitlab_session=; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000" <<
  34 + "\n_remote_user=; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"
  35 + expect(last_request.cookies['_gitlab_session']).to eq('test')
  36 + expect(last_request.cookies['_remote_user']).to eq('test')
  37 + expect(last_response.status).to eq(302)
  38 + expect(last_response['Set-Cookie']).to eq(cookie_session_str)
  39 + end
  40 + end
  41 +
  42 + context 'With REMOTE_USER and not logged in' do
  43 + before(:each){
  44 + get '/', {}, { 'HTTP_REMOTE_USER' => 'foobar' }
  45 + }
  46 +
  47 + it 'logs REMOTE_USER in' do
  48 + expect(last_response.status).to eq(302)
  49 + expect(last_response['Set-Cookie']).to eq('_remote_user=foobar')
  50 + end
  51 + end
  52 +
  53 + context 'With REMOTE_USER, logged in and current user equals REMOTE_USER' do
  54 + before(:each){
  55 + clear_cookies
  56 + set_cookie "_gitlab_session=foobar"
  57 + set_cookie "_remote_user=foobar"
  58 + get '/', {}, { 'HTTP_REMOTE_USER' => 'foobar' }
  59 + }
  60 +
  61 + it 'Do nothing' do
  62 + expect(last_request.cookies['_gitlab_session']).to eq('foobar')
  63 + expect(last_request.cookies['_remote_user']).to eq('foobar')
  64 + expect(last_response.status).to eq(200)
  65 + expect(last_response['Set-Cookie']).to eq(nil)
  66 + end
  67 + end
  68 +
  69 + context 'With REMOTE_USER, logged in and current user not equals REMOTE_USER' do
  70 + before(:each){
  71 + clear_cookies
  72 + set_cookie "_gitlab_session=foobar"
  73 + set_cookie "_remote_user=foobar"
  74 + get '/', {}, { 'HTTP_REMOTE_USER' => 'foobar2' }
  75 + }
  76 +
  77 + it 'Logout current user and login REMOTE_USER and no have _gitlab_session' do
  78 + expect(last_request.cookies['_gitlab_session']).to eq('foobar')
  79 + expect(last_request.cookies['_remote_user']).to eq('foobar')
  80 + expect(last_response.status).to eq(302)
  81 + expect(last_response['Set-Cookie']).to include('_gitlab_session=')
  82 + end
  83 + end
  84 +
  85 + context 'Verify omniauth hash with REMOTE_USER_DATA' do
  86 + before(:each){
  87 + clear_cookies
  88 + post '/auth/RemoteUser/callback', {}, { 'HTTP_REMOTE_USER' => 'foobar',
  89 + 'HTTP_REMOTE_USER_DATA' => JSON.dump({'name' => 'foobar', 'email' => 'foobar@test.com'})}
  90 + }
  91 +
  92 + it 'Verify uid' do
  93 + expect(last_request.env['omniauth.auth']['uid']).to eq('foobar')
  94 + end
  95 +
  96 + it 'Verify info' do
  97 + expect(last_request.env['omniauth.auth']['info']['nickname']).to eq('foobar')
  98 + expect(last_request.env['omniauth.auth']['info']['email']).to eq('foobar@test.com')
  99 + end
  100 + end
  101 +
  102 + context 'Verify omniauth.auth info without REMOTE_USER_DATA' do
  103 + before(:each){
  104 + clear_cookies
  105 + post '/auth/RemoteUser/callback', {}, { 'HTTP_REMOTE_USER' => 'foobar' }
  106 + }
  107 +
  108 + it 'Verify uid' do
  109 + expect(last_request.env['omniauth.auth']['uid']).to eq('foobar')
  110 + end
  111 +
  112 + it 'Verify info' do
  113 + expect(last_request.env['omniauth.auth']['info']).to eq({})
  114 + end
  115 + end
116 end 116 end