From defa894e429101e64f2807e3930c26acac5fd9b8 Mon Sep 17 00:00:00 2001 From: Lucas Kanashiro Date: Thu, 11 Dec 2014 15:22:00 -0200 Subject: [PATCH] Added config.ru --- config.ru | 135 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+), 0 deletions(-) create mode 100644 config.ru diff --git a/config.ru b/config.ru new file mode 100644 index 0000000..3e19331 --- /dev/null +++ b/config.ru @@ -0,0 +1,135 @@ +require 'sinatra' +require 'omniauth' +require 'json' + +module OmniAuth + module Strategies + class RemoteUser + + include OmniAuth::Strategy + + option :cookie, 'rack.session' + option :internal_cookie, '_remote_user' + + def call(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 __current_user(env) + request = Rack::Request.new(env) + request.cookies.has_key?(options.internal_cookie) && request.cookies[options.internal_cookie] + end + + 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 + + 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 + + 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 do + request.env['HTTP_REMOTE_USER'] + end + + 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 request_phase + form = OmniAuth::Form.new(:url => callback_path) + form.html '' + form.to_response + end + end + end +end + +class MyApplication < Sinatra::Base + use Rack::Session::Cookie, secret: '123' + + STRATEGY = 'remoteuser' + use OmniAuth::Strategies::RemoteUser + #STRATEGY = 'developer' + #use OmniAuth::Strategies::Developer + + get '/login' do + redirect '/auth/%s' % STRATEGY + end + + get '/logout' do + session[:current_user] = nil + redirect '/' + end + + post '/auth/:provider/callback' do + session[:current_user] = request.env['omniauth.auth']['uid'] + session[:current_user_email] = request.env['omniauth.auth']['info']['email'] + session[:current_user_nickname] = request.env['omniauth.auth']['info']['nickname'] + + redirect '/' + end + + get '/' do + user = session[:current_user] + if user + info = "(%s → %s)" % [session[:current_user_email], session[:current_user_nickname]] + user + info + ' logout' + else + 'NOT AUTHENTICATED login' + end + end +end + +run MyApplication + -- libgit2 0.21.2