summaryrefslogtreecommitdiff
path: root/lib/gitlab/auth/ldap/authentication.rb
blob: e70c3ab6b46cfcf3d8bda872c6eb008899e2bd7f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# These calls help to authenticate to LDAP by providing username and password
#
# Since multiple LDAP servers are supported, it will loop through all of them
# until a valid bind is found
#

module Gitlab
  module Auth
    module LDAP
      class Authentication < Gitlab::Auth::OAuth::Authentication
        def self.login(login, password)
          return unless Gitlab::Auth::LDAP::Config.enabled?
          return unless login.present? && password.present?

          auth = nil
          # loop through providers until valid bind
          providers.find do |provider|
            auth = new(provider)
            auth.login(login, password) # true will exit the loop
          end

          # If (login, password) was invalid for all providers, the value of auth is now the last
          # Gitlab::Auth::LDAP::Authentication instance we tried.
          auth.user
        end

        def self.providers
          Gitlab::Auth::LDAP::Config.providers
        end

        attr_accessor :ldap_user

        def login(login, password)
          @ldap_user = adapter.bind_as(
            filter: user_filter(login),
            size: 1,
            password: password
          )
        end

        def adapter
          OmniAuth::LDAP::Adaptor.new(config.omniauth_options)
        end

        def config
          Gitlab::Auth::LDAP::Config.new(provider)
        end

        def user_filter(login)
          filter = Net::LDAP::Filter.equals(config.uid, login)

          # Apply LDAP user filter if present
          if config.user_filter.present?
            filter = Net::LDAP::Filter.join(filter, config.constructed_user_filter)
          end

          filter
        end

        def user
          return unless ldap_user

          Gitlab::Auth::LDAP::User.find_by_uid_and_provider(ldap_user.dn, provider)
        end
      end
    end
  end
end