casino-ldap_authenticator 2.0.2 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,16 +10,12 @@ class CASino::LDAPAuthenticator
10
10
  end
11
11
 
12
12
  def validate(username, password)
13
- @username = username
14
- @password = password
15
13
  begin
16
- connect
17
- authenticate
18
- if !@user_plain
14
+ user_plain = authenticate(username, password)
15
+ if !user_plain
19
16
  false
20
17
  else
21
- generate_user
22
- @user
18
+ generate_user(user_plain)
23
19
  end
24
20
  rescue Net::LDAP::LdapError => e
25
21
  raise CASino::Authenticator::AuthenticatorError,
@@ -28,53 +24,60 @@ class CASino::LDAPAuthenticator
28
24
  end
29
25
 
30
26
  private
31
- def connect
27
+ def ldap
28
+ return @ldap if @ldap
32
29
  @ldap = Net::LDAP.new
33
30
  @ldap.host = @options[:host]
34
31
  @ldap.port = @options[:port]
35
32
  if @options[:encryption]
36
33
  @ldap.encryption(@options[:encryption].to_sym)
37
34
  end
35
+ return @ldap
38
36
  end
39
37
 
40
- def authenticate
38
+ def authenticate(username, password)
39
+ # Don't allow "Unauthenticated bind" (http://www.openldap.org/doc/admin24/security.html#Authentication%20Methods)
40
+ return false unless password && !password.empty?
41
+
41
42
  unless @options[:admin_user].nil?
42
- @ldap.auth(@options[:admin_user], @options[:admin_password])
43
+ ldap.auth(@options[:admin_user], @options[:admin_password])
43
44
  end
44
- @user_plain = @ldap.bind_as(:base => @options[:base], :size => 1, :password => @password, :filter => user_filter)
45
- if @user_plain
45
+
46
+ user_plain = ldap.bind_as(:base => @options[:base], :size => 1, :password => password, :filter => user_filter(username))
47
+ if user_plain
46
48
  include_attributes = @options[:extra_attributes].values + [username_attribute]
47
- @user_plain = @ldap.search(:base => @options[:base], :filter => user_filter, :attributes => include_attributes)
48
- if @user_plain.is_a?(Array)
49
- @user_plain = @user_plain.first
49
+ user_plain = ldap.search(:base => @options[:base], :filter => user_filter(username), :attributes => include_attributes)
50
+ if user_plain.is_a?(Array)
51
+ user_plain = user_plain.first
50
52
  end
51
53
  end
54
+ return user_plain
52
55
  end
53
56
 
54
57
  def username_attribute
55
58
  @options[:username_attribute] || DEFAULT_USERNAME_ATTRIBUTE
56
59
  end
57
60
 
58
- def user_filter
59
- filter = Net::LDAP::Filter.eq(username_attribute, @username)
61
+ def user_filter(username)
62
+ filter = Net::LDAP::Filter.eq(username_attribute, username)
60
63
  unless @options[:filter].nil?
61
64
  filter &= Net::LDAP::Filter.construct(@options[:filter])
62
65
  end
63
66
  filter
64
67
  end
65
68
 
66
- def generate_user
67
- @user = {
68
- username: @user_plain[username_attribute].first,
69
- extra_attributes: extra_attributes
69
+ def generate_user(user_plain)
70
+ {
71
+ username: user_plain[username_attribute].first,
72
+ extra_attributes: extra_attributes(user_plain)
70
73
  }
71
74
  end
72
75
 
73
- def extra_attributes
76
+ def extra_attributes(user_plain)
74
77
  if @options[:extra_attributes]
75
78
  result = {}
76
79
  @options[:extra_attributes].each do |index_result, index_ldap|
77
- value = @user_plain[index_ldap]
80
+ value = user_plain[index_ldap]
78
81
  if value
79
82
  result[index_result] = "#{value.first}"
80
83
  end
@@ -1,5 +1,5 @@
1
1
  module CASino
2
2
  class LDAPAuthenticator
3
- VERSION = '2.0.2'
3
+ VERSION = '2.0.3'
4
4
  end
5
5
  end
@@ -65,6 +65,15 @@ describe CASino::LDAPAuthenticator do
65
65
  end
66
66
  end
67
67
 
68
+ context 'with an empty password' do
69
+ let(:password) { '' }
70
+
71
+ it 'does not call the #bind_as method on the LDAP connection' do
72
+ connection.should_not_receive(:bind_as)
73
+ subject.validate(username, password)
74
+ end
75
+ end
76
+
68
77
  context 'when validation succeeds for user with missing data' do
69
78
  let(:fullname) { 'Example User' }
70
79
  let(:email) { "#{username}@example.org" }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: casino-ldap_authenticator
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.2
4
+ version: 2.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: