env.rb 1.47 KB
# Based on code from the oa-env gem
require 'pg'
require 'omniauth'
require 'omniauth-ldap/adaptor'

module OmniAuth
  module Strategies
    class Env
      include OmniAuth::Strategy

      def env_user
        if env['HTTP_REMOTE_USER'] && env['HTTP_REMOTE_USER'] != ''
          env['HTTP_REMOTE_USER']
        else
          env['HTTP_X_FORWARDED_USER']
        end
      end

      def request_phase
        @user_data = {}
        return fail!(:no_user) unless env_user

        @uid = env_user.gsub(/@.*/, '')

        # fill in some defaults
        @user_data[:name] = @uid 
        @user_data[:email] = env_user

        fill_ldap_info unless @options.empty?

        @env['omniauth.auth'] = auth_hash
        @env['REQUEST_METHOD'] = 'GET'
        @env['PATH_INFO'] = "#{OmniAuth.config.path_prefix}/#{name}/callback"

        call_app!
      end

      uid { @uid }

      info { @user_data }

      private

      def fill_ldap_info
        conn = PG::Connection.open(
                            :dbname => Gitlab.config.env['database_name'],
                            :host => Gitlab.config.env['host'],
                            :user => Gitlab.config.env['user'],
                            :password => Gitlab.config.env['password'],
                            )
        res  = conn.exec("select email, first_name from accounts_user where username='#{@uid}';")
        @user_data[:email] = res[0]['email']
        @user_data[:name] = res[0]['first_name']
      end
    end
  end
end