devise_ldap_authenticatable 0.8.1 → 0.8.7
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.
- checksums.yaml +5 -5
- data/.gitignore +2 -1
- data/README.md +36 -32
- data/devise_ldap_authenticatable.gemspec +9 -9
- data/lib/devise_ldap_authenticatable.rb +20 -8
- data/lib/devise_ldap_authenticatable/ldap/adapter.rb +19 -12
- data/lib/devise_ldap_authenticatable/ldap/connection.rb +94 -28
- data/lib/devise_ldap_authenticatable/model.rb +28 -24
- data/lib/devise_ldap_authenticatable/strategy.rb +25 -4
- data/lib/devise_ldap_authenticatable/version.rb +2 -2
- data/lib/generators/devise_ldap_authenticatable/install_generator.rb +19 -17
- data/lib/generators/devise_ldap_authenticatable/templates/ldap.yml +8 -1
- data/spec/rails_app/config/initializers/devise.rb +5 -0
- data/spec/rails_app/config/ldap.yml +4 -2
- data/spec/rails_app/config/ldap_with_erb.yml +5 -3
- data/spec/rails_app/config/locales/devise.en.yml +1 -0
- data/spec/rails_app/db/migrate/20100708120448_devise_create_users.rb +1 -1
- data/spec/rails_app/db/schema.rb +12 -14
- data/spec/spec_helper.rb +9 -1
- data/spec/unit/adapter_spec.rb +21 -0
- data/spec/unit/connection_spec.rb +121 -0
- data/spec/unit/user_spec.rb +91 -30
- metadata +36 -41
data/spec/unit/user_spec.rb
CHANGED
@@ -16,7 +16,7 @@ describe 'Users' do
|
|
16
16
|
reset_ldap_server!
|
17
17
|
end
|
18
18
|
|
19
|
-
describe "look up
|
19
|
+
describe "look up an ldap user" do
|
20
20
|
it "should return true for a user that does exist in LDAP" do
|
21
21
|
assert_equal true, ::Devise::LDAP::Adapter.valid_login?('example.user@test.com')
|
22
22
|
end
|
@@ -48,7 +48,7 @@ describe 'Users' do
|
|
48
48
|
should_be_validated @user, "secret"
|
49
49
|
@user.password = "changed"
|
50
50
|
@user.change_password!("secret")
|
51
|
-
should_be_validated @user, "changed", "password was not changed properly on the LDAP
|
51
|
+
should_be_validated @user, "changed", "password was not changed properly on the LDAP server"
|
52
52
|
end
|
53
53
|
|
54
54
|
it "should not allow to change password if setting is false" do
|
@@ -66,9 +66,10 @@ describe 'Users' do
|
|
66
66
|
assert(User.all.blank?, "There shouldn't be any users in the database")
|
67
67
|
end
|
68
68
|
|
69
|
-
it "should
|
70
|
-
@user = User.
|
69
|
+
it "should not create user in the database" do
|
70
|
+
@user = User.find_for_ldap_authentication(:email => "example.user@test.com", :password => "secret")
|
71
71
|
assert(User.all.blank?)
|
72
|
+
assert(@user.new_record?)
|
72
73
|
end
|
73
74
|
|
74
75
|
describe "creating users is enabled" do
|
@@ -77,18 +78,19 @@ describe 'Users' do
|
|
77
78
|
end
|
78
79
|
|
79
80
|
it "should create a user in the database" do
|
80
|
-
@user = User.
|
81
|
+
@user = User.find_for_ldap_authentication(:email => "example.user@test.com", :password => "secret")
|
81
82
|
assert_equal(User.all.size, 1)
|
82
|
-
User.all.collect(&:email).
|
83
|
+
expect(User.all.collect(&:email)).to include("example.user@test.com")
|
84
|
+
assert(@user.persisted?)
|
83
85
|
end
|
84
86
|
|
85
87
|
it "should not create a user in the database if the password is wrong_secret" do
|
86
|
-
@user = User.
|
88
|
+
@user = User.find_for_ldap_authentication(:email => "example.user", :password => "wrong_secret")
|
87
89
|
assert(User.all.blank?, "There's users in the database")
|
88
90
|
end
|
89
91
|
|
90
|
-
it "should create a user if the user is not in LDAP" do
|
91
|
-
@user = User.
|
92
|
+
it "should not create a user if the user is not in LDAP" do
|
93
|
+
@user = User.find_for_ldap_authentication(:email => "wrong_secret.user@test.com", :password => "wrong_secret")
|
92
94
|
assert(User.all.blank?, "There's users in the database")
|
93
95
|
end
|
94
96
|
|
@@ -97,7 +99,7 @@ describe 'Users' do
|
|
97
99
|
@user = Factory.create(:user)
|
98
100
|
|
99
101
|
expect do
|
100
|
-
User.
|
102
|
+
User.find_for_ldap_authentication(:email => "EXAMPLE.user@test.com", :password => "secret")
|
101
103
|
end.to change { User.count }.by(1)
|
102
104
|
end
|
103
105
|
|
@@ -106,15 +108,15 @@ describe 'Users' do
|
|
106
108
|
@user = Factory.create(:user)
|
107
109
|
|
108
110
|
expect do
|
109
|
-
User.
|
111
|
+
User.find_for_ldap_authentication(:email => "EXAMPLE.user@test.com", :password => "secret")
|
110
112
|
end.to_not change { User.count }
|
111
113
|
end
|
112
114
|
|
113
115
|
it "should create a user with downcased email in the database if case insensitivity matters" do
|
114
116
|
::Devise.case_insensitive_keys = [:email]
|
115
117
|
|
116
|
-
@user = User.
|
117
|
-
User.all.collect(&:email).
|
118
|
+
@user = User.find_for_ldap_authentication(:email => "EXAMPLE.user@test.com", :password => "secret")
|
119
|
+
expect(User.all.collect(&:email)).to include("example.user@test.com")
|
118
120
|
end
|
119
121
|
end
|
120
122
|
|
@@ -133,32 +135,55 @@ describe 'Users' do
|
|
133
135
|
end
|
134
136
|
|
135
137
|
it "should admin should have the proper groups set" do
|
136
|
-
@admin.ldap_groups.
|
138
|
+
expect(@admin.ldap_groups).to include('cn=admins,ou=groups,dc=test,dc=com')
|
137
139
|
end
|
138
140
|
|
139
141
|
it "should user should not be allowed in" do
|
140
142
|
should_not_be_validated @user, "secret"
|
141
143
|
end
|
142
144
|
end
|
143
|
-
|
145
|
+
|
144
146
|
describe "check group membership" do
|
145
147
|
before do
|
146
148
|
@admin = Factory.create(:admin)
|
147
149
|
@user = Factory.create(:user)
|
148
150
|
end
|
149
|
-
|
151
|
+
|
150
152
|
it "should return true for admin being in the admins group" do
|
151
153
|
assert_equal true, @admin.in_ldap_group?('cn=admins,ou=groups,dc=test,dc=com')
|
152
154
|
end
|
153
|
-
|
155
|
+
|
154
156
|
it "should return false for admin being in the admins group using the 'foobar' group attribute" do
|
155
157
|
assert_equal false, @admin.in_ldap_group?('cn=admins,ou=groups,dc=test,dc=com', 'foobar')
|
156
158
|
end
|
157
|
-
|
159
|
+
|
160
|
+
it "should return true for user being in the users group" do
|
161
|
+
assert_equal true, @user.in_ldap_group?('cn=users,ou=groups,dc=test,dc=com')
|
162
|
+
end
|
163
|
+
|
164
|
+
it "should return false for user being in the admins group" do
|
165
|
+
assert_equal false, @user.in_ldap_group?('cn=admins,ou=groups,dc=test,dc=com')
|
166
|
+
end
|
167
|
+
|
168
|
+
it "should return false for a user being in a nonexistent group" do
|
169
|
+
assert_equal false, @user.in_ldap_group?('cn=thisgroupdoesnotexist,ou=groups,dc=test,dc=com')
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
describe "check group membership w/out admin bind" do
|
174
|
+
before do
|
175
|
+
@user = Factory.create(:user)
|
176
|
+
::Devise.ldap_check_group_membership_without_admin = true
|
177
|
+
end
|
178
|
+
|
179
|
+
after do
|
180
|
+
::Devise.ldap_check_group_membership_without_admin = false
|
181
|
+
end
|
182
|
+
|
158
183
|
it "should return true for user being in the users group" do
|
159
184
|
assert_equal true, @user.in_ldap_group?('cn=users,ou=groups,dc=test,dc=com')
|
160
|
-
end
|
161
|
-
|
185
|
+
end
|
186
|
+
|
162
187
|
it "should return false for user being in the admins group" do
|
163
188
|
assert_equal false, @user.in_ldap_group?('cn=admins,ou=groups,dc=test,dc=com')
|
164
189
|
end
|
@@ -166,8 +191,15 @@ describe 'Users' do
|
|
166
191
|
it "should return false for a user being in a nonexistent group" do
|
167
192
|
assert_equal false, @user.in_ldap_group?('cn=thisgroupdoesnotexist,ou=groups,dc=test,dc=com')
|
168
193
|
end
|
194
|
+
|
195
|
+
# TODO: add a test that confirms the user's own binding is used rather
|
196
|
+
# than the admin binding by creating an LDAP user who can't do group
|
197
|
+
# lookups perhaps?
|
198
|
+
|
199
|
+
# TODO: add a test to demonstrate this function won't work on a user
|
200
|
+
# after the initial login request if the password isn't available. This
|
201
|
+
# might have to be more of a full stack test.
|
169
202
|
end
|
170
|
-
|
171
203
|
|
172
204
|
describe "use role attribute for authorization" do
|
173
205
|
before do
|
@@ -185,6 +217,26 @@ describe 'Users' do
|
|
185
217
|
end
|
186
218
|
end
|
187
219
|
|
220
|
+
describe "use attribute presence for authorization" do
|
221
|
+
before do
|
222
|
+
@admin = Factory.create(:admin)
|
223
|
+
@user = Factory.create(:user)
|
224
|
+
::Devise.ldap_check_attributes_presence = true
|
225
|
+
end
|
226
|
+
|
227
|
+
after do
|
228
|
+
::Devise.ldap_check_attributes_presence = false
|
229
|
+
end
|
230
|
+
|
231
|
+
it "should admin should not be allowed in" do
|
232
|
+
should_not_be_validated @admin, "admin_secret"
|
233
|
+
end
|
234
|
+
|
235
|
+
it "should user should be allowed in" do
|
236
|
+
should_be_validated @user, "secret"
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
188
240
|
describe "use admin setting to bind" do
|
189
241
|
before do
|
190
242
|
@admin = Factory.create(:admin)
|
@@ -197,6 +249,19 @@ describe 'Users' do
|
|
197
249
|
end
|
198
250
|
end
|
199
251
|
|
252
|
+
describe 'check password expiration' do
|
253
|
+
before { allow_any_instance_of(Devise::LDAP::Connection).to receive(:authenticated?).and_return(false) }
|
254
|
+
|
255
|
+
it 'should return false for a user that has a fresh password' do
|
256
|
+
allow_any_instance_of(Devise::LDAP::Connection).to receive(:last_message_expired_credentials?).and_return(false)
|
257
|
+
assert_equal false, ::Devise::LDAP::Adapter.expired_valid_credentials?('example.user@test.com','secret')
|
258
|
+
end
|
259
|
+
|
260
|
+
it 'should return true for a user that has an expired password' do
|
261
|
+
allow_any_instance_of(Devise::LDAP::Connection).to receive(:last_message_expired_credentials?).and_return(true)
|
262
|
+
assert_equal true, ::Devise::LDAP::Adapter.expired_valid_credentials?('example.user@test.com','secret')
|
263
|
+
end
|
264
|
+
end
|
200
265
|
end
|
201
266
|
|
202
267
|
describe "use uid for login" do
|
@@ -225,9 +290,9 @@ describe 'Users' do
|
|
225
290
|
end
|
226
291
|
|
227
292
|
it "should create a user in the database" do
|
228
|
-
@user = User.
|
293
|
+
@user = User.find_for_ldap_authentication(:uid => "example_user", :password => "secret")
|
229
294
|
assert_equal(User.all.size, 1)
|
230
|
-
User.all.collect(&:uid).
|
295
|
+
expect(User.all.collect(&:uid)).to include("example_user")
|
231
296
|
end
|
232
297
|
|
233
298
|
it "should call ldap_before_save hooks" do
|
@@ -236,7 +301,7 @@ describe 'Users' do
|
|
236
301
|
@foobar = 'foobar'
|
237
302
|
end
|
238
303
|
end
|
239
|
-
user = User.
|
304
|
+
user = User.find_for_ldap_authentication(:uid => "example_user", :password => "secret")
|
240
305
|
assert_equal 'foobar', user.instance_variable_get(:"@foobar")
|
241
306
|
User.class_eval do
|
242
307
|
undef ldap_before_save
|
@@ -244,9 +309,7 @@ describe 'Users' do
|
|
244
309
|
end
|
245
310
|
|
246
311
|
it "should not call ldap_before_save hook if not defined" do
|
247
|
-
|
248
|
-
should_be_validated Factory.create(:user, :uid => "example_user"), "secret"
|
249
|
-
end
|
312
|
+
should_be_validated Factory.create(:user, :uid => "example_user"), "secret"
|
250
313
|
end
|
251
314
|
end
|
252
315
|
end
|
@@ -279,9 +342,7 @@ describe 'Users' do
|
|
279
342
|
end
|
280
343
|
|
281
344
|
it "should not fail if config file has ssl: true" do
|
282
|
-
|
283
|
-
Devise::LDAP::Connection.new
|
284
|
-
end
|
345
|
+
Devise::LDAP::Connection.new
|
285
346
|
end
|
286
347
|
end
|
287
348
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: devise_ldap_authenticatable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Curtis Schiewek
|
@@ -10,180 +10,174 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2020-07-23 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: devise
|
17
17
|
requirement: !ruby/object:Gem::Requirement
|
18
18
|
requirements:
|
19
|
-
- -
|
19
|
+
- - ">="
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
21
|
+
version: 3.4.1
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
|
-
- -
|
26
|
+
- - ">="
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
version:
|
28
|
+
version: 3.4.1
|
29
29
|
- !ruby/object:Gem::Dependency
|
30
30
|
name: net-ldap
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
32
32
|
requirements:
|
33
|
-
- -
|
33
|
+
- - ">="
|
34
34
|
- !ruby/object:Gem::Version
|
35
|
-
version: 0.
|
36
|
-
- - <
|
37
|
-
- !ruby/object:Gem::Version
|
38
|
-
version: 0.6.0
|
35
|
+
version: 0.16.0
|
39
36
|
type: :runtime
|
40
37
|
prerelease: false
|
41
38
|
version_requirements: !ruby/object:Gem::Requirement
|
42
39
|
requirements:
|
43
|
-
- -
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version: 0.3.1
|
46
|
-
- - <
|
40
|
+
- - ">="
|
47
41
|
- !ruby/object:Gem::Version
|
48
|
-
version: 0.
|
42
|
+
version: 0.16.0
|
49
43
|
- !ruby/object:Gem::Dependency
|
50
44
|
name: rake
|
51
45
|
requirement: !ruby/object:Gem::Requirement
|
52
46
|
requirements:
|
53
|
-
- -
|
47
|
+
- - ">="
|
54
48
|
- !ruby/object:Gem::Version
|
55
49
|
version: '0.9'
|
56
50
|
type: :development
|
57
51
|
prerelease: false
|
58
52
|
version_requirements: !ruby/object:Gem::Requirement
|
59
53
|
requirements:
|
60
|
-
- -
|
54
|
+
- - ">="
|
61
55
|
- !ruby/object:Gem::Version
|
62
56
|
version: '0.9'
|
63
57
|
- !ruby/object:Gem::Dependency
|
64
58
|
name: rdoc
|
65
59
|
requirement: !ruby/object:Gem::Requirement
|
66
60
|
requirements:
|
67
|
-
- -
|
61
|
+
- - ">="
|
68
62
|
- !ruby/object:Gem::Version
|
69
63
|
version: '3'
|
70
64
|
type: :development
|
71
65
|
prerelease: false
|
72
66
|
version_requirements: !ruby/object:Gem::Requirement
|
73
67
|
requirements:
|
74
|
-
- -
|
68
|
+
- - ">="
|
75
69
|
- !ruby/object:Gem::Version
|
76
70
|
version: '3'
|
77
71
|
- !ruby/object:Gem::Dependency
|
78
72
|
name: rails
|
79
73
|
requirement: !ruby/object:Gem::Requirement
|
80
74
|
requirements:
|
81
|
-
- -
|
75
|
+
- - ">="
|
82
76
|
- !ruby/object:Gem::Version
|
83
77
|
version: '4.0'
|
84
78
|
type: :development
|
85
79
|
prerelease: false
|
86
80
|
version_requirements: !ruby/object:Gem::Requirement
|
87
81
|
requirements:
|
88
|
-
- -
|
82
|
+
- - ">="
|
89
83
|
- !ruby/object:Gem::Version
|
90
84
|
version: '4.0'
|
91
85
|
- !ruby/object:Gem::Dependency
|
92
86
|
name: sqlite3
|
93
87
|
requirement: !ruby/object:Gem::Requirement
|
94
88
|
requirements:
|
95
|
-
- -
|
89
|
+
- - ">="
|
96
90
|
- !ruby/object:Gem::Version
|
97
91
|
version: '0'
|
98
92
|
type: :development
|
99
93
|
prerelease: false
|
100
94
|
version_requirements: !ruby/object:Gem::Requirement
|
101
95
|
requirements:
|
102
|
-
- -
|
96
|
+
- - ">="
|
103
97
|
- !ruby/object:Gem::Version
|
104
98
|
version: '0'
|
105
99
|
- !ruby/object:Gem::Dependency
|
106
100
|
name: factory_girl_rails
|
107
101
|
requirement: !ruby/object:Gem::Requirement
|
108
102
|
requirements:
|
109
|
-
- - ~>
|
103
|
+
- - "~>"
|
110
104
|
- !ruby/object:Gem::Version
|
111
105
|
version: '1.0'
|
112
106
|
type: :development
|
113
107
|
prerelease: false
|
114
108
|
version_requirements: !ruby/object:Gem::Requirement
|
115
109
|
requirements:
|
116
|
-
- - ~>
|
110
|
+
- - "~>"
|
117
111
|
- !ruby/object:Gem::Version
|
118
112
|
version: '1.0'
|
119
113
|
- !ruby/object:Gem::Dependency
|
120
114
|
name: factory_girl
|
121
115
|
requirement: !ruby/object:Gem::Requirement
|
122
116
|
requirements:
|
123
|
-
- - ~>
|
117
|
+
- - "~>"
|
124
118
|
- !ruby/object:Gem::Version
|
125
119
|
version: '2.0'
|
126
120
|
type: :development
|
127
121
|
prerelease: false
|
128
122
|
version_requirements: !ruby/object:Gem::Requirement
|
129
123
|
requirements:
|
130
|
-
- - ~>
|
124
|
+
- - "~>"
|
131
125
|
- !ruby/object:Gem::Version
|
132
126
|
version: '2.0'
|
133
127
|
- !ruby/object:Gem::Dependency
|
134
128
|
name: rspec-rails
|
135
129
|
requirement: !ruby/object:Gem::Requirement
|
136
130
|
requirements:
|
137
|
-
- -
|
131
|
+
- - ">="
|
138
132
|
- !ruby/object:Gem::Version
|
139
133
|
version: '0'
|
140
134
|
type: :development
|
141
135
|
prerelease: false
|
142
136
|
version_requirements: !ruby/object:Gem::Requirement
|
143
137
|
requirements:
|
144
|
-
- -
|
138
|
+
- - ">="
|
145
139
|
- !ruby/object:Gem::Version
|
146
140
|
version: '0'
|
147
141
|
- !ruby/object:Gem::Dependency
|
148
142
|
name: database_cleaner
|
149
143
|
requirement: !ruby/object:Gem::Requirement
|
150
144
|
requirements:
|
151
|
-
- -
|
145
|
+
- - ">="
|
152
146
|
- !ruby/object:Gem::Version
|
153
147
|
version: '0'
|
154
148
|
type: :development
|
155
149
|
prerelease: false
|
156
150
|
version_requirements: !ruby/object:Gem::Requirement
|
157
151
|
requirements:
|
158
|
-
- -
|
152
|
+
- - ">="
|
159
153
|
- !ruby/object:Gem::Version
|
160
154
|
version: '0'
|
161
155
|
- !ruby/object:Gem::Dependency
|
162
156
|
name: capybara
|
163
157
|
requirement: !ruby/object:Gem::Requirement
|
164
158
|
requirements:
|
165
|
-
- -
|
159
|
+
- - ">="
|
166
160
|
- !ruby/object:Gem::Version
|
167
161
|
version: '0'
|
168
162
|
type: :development
|
169
163
|
prerelease: false
|
170
164
|
version_requirements: !ruby/object:Gem::Requirement
|
171
165
|
requirements:
|
172
|
-
- -
|
166
|
+
- - ">="
|
173
167
|
- !ruby/object:Gem::Version
|
174
168
|
version: '0'
|
175
169
|
- !ruby/object:Gem::Dependency
|
176
170
|
name: launchy
|
177
171
|
requirement: !ruby/object:Gem::Requirement
|
178
172
|
requirements:
|
179
|
-
- -
|
173
|
+
- - ">="
|
180
174
|
- !ruby/object:Gem::Version
|
181
175
|
version: '0'
|
182
176
|
type: :development
|
183
177
|
prerelease: false
|
184
178
|
version_requirements: !ruby/object:Gem::Requirement
|
185
179
|
requirements:
|
186
|
-
- -
|
180
|
+
- - ">="
|
187
181
|
- !ruby/object:Gem::Version
|
188
182
|
version: '0'
|
189
183
|
description: Devise extension to allow authentication via LDAP
|
@@ -192,7 +186,7 @@ executables: []
|
|
192
186
|
extensions: []
|
193
187
|
extra_rdoc_files: []
|
194
188
|
files:
|
195
|
-
- .gitignore
|
189
|
+
- ".gitignore"
|
196
190
|
- CHANGELOG.md
|
197
191
|
- Gemfile
|
198
192
|
- MIT-LICENSE
|
@@ -277,6 +271,8 @@ files:
|
|
277
271
|
- spec/rails_app/script/rails
|
278
272
|
- spec/spec_helper.rb
|
279
273
|
- spec/support/factories.rb
|
274
|
+
- spec/unit/adapter_spec.rb
|
275
|
+
- spec/unit/connection_spec.rb
|
280
276
|
- spec/unit/user_spec.rb
|
281
277
|
homepage: https://github.com/cschiewek/devise_ldap_authenticatable
|
282
278
|
licenses:
|
@@ -288,17 +284,16 @@ require_paths:
|
|
288
284
|
- lib
|
289
285
|
required_ruby_version: !ruby/object:Gem::Requirement
|
290
286
|
requirements:
|
291
|
-
- -
|
287
|
+
- - ">="
|
292
288
|
- !ruby/object:Gem::Version
|
293
289
|
version: '0'
|
294
290
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
295
291
|
requirements:
|
296
|
-
- -
|
292
|
+
- - ">="
|
297
293
|
- !ruby/object:Gem::Version
|
298
294
|
version: '0'
|
299
295
|
requirements: []
|
300
|
-
|
301
|
-
rubygems_version: 2.0.3
|
296
|
+
rubygems_version: 3.1.2
|
302
297
|
signing_key:
|
303
298
|
specification_version: 4
|
304
299
|
summary: Devise extension to allow authentication via LDAP
|