From eef50e7875bb7ed4b43b42b23db1d74eed62a047 Mon Sep 17 00:00:00 2001 From: Lucas Kanashiro Date: Wed, 5 Nov 2014 16:21:07 -0200 Subject: [PATCH] Added new strategy --- lib/omniauth/remote_user.rb | 1 + lib/omniauth/strategies/remote_user.rb | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------- 2 files changed, 73 insertions(+), 23 deletions(-) diff --git a/lib/omniauth/remote_user.rb b/lib/omniauth/remote_user.rb index 7a8b2f1..b2d2514 100644 --- a/lib/omniauth/remote_user.rb +++ b/lib/omniauth/remote_user.rb @@ -1,4 +1,5 @@ require 'omniauth' +require 'json' module OmniAuth module Strategies diff --git a/lib/omniauth/strategies/remote_user.rb b/lib/omniauth/strategies/remote_user.rb index 8eebfcb..3e0dc0e 100644 --- a/lib/omniauth/strategies/remote_user.rb +++ b/lib/omniauth/strategies/remote_user.rb @@ -1,45 +1,94 @@ module OmniAuth module Strategies class RemoteUser + include OmniAuth::Strategy - option :fields, [:name, :email] - option :uid_field, :email + #option :cookie, 'rack.session' + option :cookie, '_gitlab_session' + option :internal_cookie, '_remote_user' def call(env) - request = Rack::Request.new env - cookies = request.cookies["_gitlab_session"] - remote_user = env["HTTP_REMOTE_USER"] - unless remote_user.empty? && cookies.empty? - super(env) + remote_user = env['HTTP_REMOTE_USER'] + $stderr.puts('Remote-User: %s' % (remote_user || '(none')) + session_user = __current_user(env) + if remote_user + if session_user + if remote_user == session_user + super(env) + else + __login(env, remote_user) || super(env) + end + else + __login(env, remote_user) || super(env) + end + else + if session_user + __logout(env) || super(env) + else + super(env) + end end end - def request_phase - @user_data = {} - @uid = env - return fail!(:no_remote_user) unless @uid + def __current_user(env) + request = Rack::Request.new(env) + request.cookies.has_key?(options.internal_cookie) && request.cookies[options.internal_cookie] + end - @user_data[:name] = @uid['NAME'] - @user_data[:email] = @uid['EMAIL'] + def __logout(env) + $stderr.puts 'LOGOUT' + request = Rack::Request.new(env) + response = redirect_if_not_logging_in(request, request.path) + if response + response.delete_cookie(options.cookie) + response.delete_cookie(options.internal_cookie) + response + end + end - @env['omniauth.auth'] = auth_hash - @env['REQUEST_METHOD'] = 'GET' - @env['PATH_INFO'] = "#{OmniAuth.config.path_prefix}/#{name}/callback" + def __login(env, uid) + $stderr.puts 'LOGIN (%s)' % uid + request = Rack::Request.new(env) + response = redirect_if_not_logging_in(request, '/auth/remoteuser') + if response + response.set_cookie(options.internal_cookie, uid) + response + end + end - call_app! + def redirect_if_not_logging_in(request, url) + if ! [ + '/auth/remoteuser', + '/auth/remoteuser/callback' + ].include?(request.path_info) + response = Rack::Response.new + response.redirect url + response + end end - uid { @uid['NAME'] } - info{ @user_data } + uid do + request.env['HTTP_REMOTE_USER'] + end - def callback_phase - fail(:invalid_request) + info do + user_data = request.env['HTTP_REMOTE_USER_DATA'] + if user_data + data = JSON.parse(user_data) + data['nickname'] = data['name'] + data + else + {} + end end - def auth_hash - Omniauth::Utils.deep_merge(super, {'uid' => @uid}) + def request_phase + form = OmniAuth::Form.new(:url => callback_path) + form.html '' + form.to_response end end end end + -- libgit2 0.21.2