activeldap 5.2.2 → 5.2.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6d6b5227689af0fea86d9e29d3fc76165038dafb71ff7962780647b83f5d973c
4
- data.tar.gz: 3a645873ff56846dab7e85adc7cc1a99b4e904b72f2e28fb61297e4a5e70add2
3
+ metadata.gz: c13c85afc7e4d89ae99b34594d827b7970112e8a27cf011f484d2e8ec8708a6a
4
+ data.tar.gz: b6918bc5db92871b7e395911f08ca6f443a9dd4b6dd2a800716e07084f70b26e
5
5
  SHA512:
6
- metadata.gz: 2eeacfd5b6f4d6e109299b1a59efd19a154845b11d192611575e95ce7c9585c68b366bf2844cb800474377b0efe83e4a5c9fac6a4b7c366c9222537300d88eb9
7
- data.tar.gz: 7aaf91753784bd19d10ef86e8b720785c96b0ba8e5b7c072cb0e6f88a31d4f458525dc23d610d7ab679d1389e5db87d1cfc9f189f2cf48d7cb2ebdb1faab3974
6
+ metadata.gz: 5a3724db64fcd07d42fa7bf11bbddd646d72f2ece01de634abac1c7cf038ab36a209359768bd252d19b64b3fe99a370c53d96947ec87f8ef159a985228f421f1
7
+ data.tar.gz: caa6c1a7f32a8899f36dd9ce5e8996fe46838b78a1ba00dcd661d4480b15ac7763d0bead0c896c81f4afda80839c8dbe48dfc554a5c3a12920e479b26f68a4fc
@@ -1,5 +1,23 @@
1
1
  h1. News
2
2
 
3
+ h2(#release-5-2-3). 5.2.3: 2019-02-15
4
+
5
+ h3. Improvements
6
+
7
+ * Changed to use add and delete for modify if it's needed.
8
+ [GitHub#156][Patch by David Klotz]
9
+
10
+ * Added support for timezone with munites offset such as @0530@.
11
+ [GitHub#160][GitHub#161][Patch by Neng Xu]
12
+
13
+ * Added support for Ruby 2.6.
14
+
15
+ h3. Thanks
16
+
17
+ * David Klotz
18
+
19
+ * Neng Xu
20
+
3
21
  h2(#release-5-2-2). 5.2.2: 2018-07-12
4
22
 
5
23
  h3. Improvements
@@ -1372,7 +1372,14 @@ module ActiveLdap
1372
1372
  if k == _dn_attribute
1373
1373
  new_dn_value = value[0]
1374
1374
  else
1375
- attributes.push([:replace, k, value])
1375
+ if (v.size == 1 and value.size == 1) or force_replace?(k)
1376
+ attributes.push([:replace, k, value])
1377
+ else
1378
+ removed_values = v - value
1379
+ added_values = value - v
1380
+ attributes.push([:delete, k, removed_values]) unless removed_values.empty?
1381
+ attributes.push([:add, k, added_values]) unless added_values.empty?
1382
+ end
1376
1383
  end
1377
1384
  end
1378
1385
 
@@ -1386,12 +1393,22 @@ module ActiveLdap
1386
1393
  # Detect subtypes and account for them
1387
1394
  # REPLACE will function like ADD, but doesn't hit EQUALITY problems
1388
1395
  # TODO: Added equality(attr) to Schema
1389
- attributes.push([:replace, k, value])
1396
+ if force_replace?(k)
1397
+ attributes.push([:replace, k, value])
1398
+ else
1399
+ attributes.push([:add, k, value])
1400
+ end
1390
1401
  end
1391
1402
 
1392
1403
  [new_dn_value, attributes]
1393
1404
  end
1394
1405
 
1406
+ def force_replace?(k)
1407
+ attribute = schema.attribute(k)
1408
+ attribute.single_value? or
1409
+ attribute.binary? # TODO: this should probably explicitly check for fields with no equality matching rule instead
1410
+ end
1411
+
1395
1412
  def collect_all_attributes(data)
1396
1413
  dn_attr = dn_attribute
1397
1414
  dn_value = data[dn_attr]
@@ -192,11 +192,11 @@ module ActiveLdap
192
192
  fraction = fraction.to_f if fraction
193
193
  time_zone = match_data[-1]
194
194
  arguments = [
195
- year, month, day, hour, minute, second, fraction, time_zone,
195
+ value, year, month, day, hour, minute, second, fraction, time_zone,
196
196
  Time.now,
197
197
  ]
198
- if Time.method(:make_time).arity == 10
199
- arguments.unshift(value)
198
+ if Time.method(:make_time).arity == 11
199
+ arguments[2, 0] = nil
200
200
  end
201
201
  begin
202
202
  Time.send(:make_time, *arguments)
@@ -222,7 +222,11 @@ module ActiveLdap
222
222
  if value.gmt?
223
223
  normalized_value + "Z"
224
224
  else
225
- normalized_value + ("%+03d%02d" % value.gmtoff.divmod(3600))
225
+ # for timezones with non-zero minutes, such as IST which is +0530,
226
+ # divmod(3600) will give wrong value of 1800
227
+
228
+ offset = value.gmtoff / 60 # in minutes
229
+ normalized_value + ("%+03d%02d" % offset.divmod(60))
226
230
  end
227
231
  else
228
232
  value
@@ -1,3 +1,3 @@
1
1
  module ActiveLdap
2
- VERSION = "5.2.2"
2
+ VERSION = "5.2.3"
3
3
  end
@@ -252,6 +252,94 @@ class TestBase < Test::Unit::TestCase
252
252
  end
253
253
  end
254
254
 
255
+ def test_set_single_valued_attribute_uses_replace
256
+ make_temporary_user(:simple => true) do |user,|
257
+ assert_not_nil(user.homeDirectory)
258
+ assert_not_equal("/home/foo", user.homeDirectory)
259
+
260
+ user.homeDirectory = "/home/foo"
261
+ assert_equal({
262
+ :modified => true,
263
+ :entries => [
264
+ [
265
+ :replace,
266
+ "homeDirectory",
267
+ {"homeDirectory" => ["/home/foo"]},
268
+ ]
269
+ ]
270
+ },
271
+ detect_modify(user) {user.save})
272
+ assert_equal("/home/foo", user.homeDirectory)
273
+ end
274
+ end
275
+
276
+ def test_set_attribute_uses_add_for_completely_new_value
277
+ make_temporary_user(:simple => true) do |user,|
278
+ assert_nil(user.description)
279
+
280
+ user.description = "x"
281
+ assert_equal({
282
+ :modified => true,
283
+ :entries => [
284
+ [:add, "description", {"description" => ["x"]}],
285
+ ],
286
+ },
287
+ detect_modify(user) {user.save})
288
+ assert_equal("x", user.description)
289
+ end
290
+ end
291
+
292
+ def test_set_attribute_uses_add_for_added_value
293
+ make_temporary_user(:simple => true) do |user,|
294
+ user.description = ["a", "b"]
295
+ assert(user.save)
296
+
297
+ user.description = ["a", "b", "c"]
298
+ assert_equal({
299
+ :modified => true,
300
+ :entries => [
301
+ [:add, "description", {"description" => ["c"]}],
302
+ ],
303
+ },
304
+ capture = detect_modify(user) {user.save})
305
+ assert_equal(["a", "b", "c"], user.description)
306
+ end
307
+ end
308
+
309
+ def test_set_attribute_uses_delete_for_deleted_value
310
+ make_temporary_user(:simple => true) do |user,|
311
+ user.description = ["a", "b", "c"]
312
+ assert(user.save)
313
+
314
+ user.description = ["a", "c"]
315
+ assert_equal({
316
+ :modified => true,
317
+ :entries => [
318
+ [:delete, "description", {"description" => ["b"]}],
319
+ ],
320
+ },
321
+ detect_modify(user) {user.save})
322
+ assert_equal(["a", "c"], user.description)
323
+ end
324
+ end
325
+
326
+ def test_set_attribute_uses_delete_for_unset_value
327
+ make_temporary_user(:simple => true) do |user,|
328
+ user.description = "x"
329
+ assert(user.save)
330
+
331
+ user.description = nil
332
+ assert_equal({
333
+ :modified => true,
334
+ :entries => [
335
+ [:delete, "description", {"description" => ["x"]}],
336
+ ],
337
+ },
338
+ detect_modify(user) {user.save})
339
+ assert_nil(user.description)
340
+ end
341
+ end
342
+
255
343
  def test_set_attributes_with_a_blank_value_in_values
256
344
  make_temporary_user(:simple => true) do |user,|
257
345
  user.attributes = {"description" => ["a", "b", ""]}
@@ -354,14 +442,25 @@ class TestBase < Test::Unit::TestCase
354
442
 
355
443
  def test_save_with_changes
356
444
  make_temporary_user do |user, password|
445
+ cn = user.cn
357
446
  user.cn += "!!!"
358
- assert_true(detect_modify(user) {user.save})
447
+ assert_equal({
448
+ :modified => true,
449
+ :entries => [
450
+ [:replace, "cn", {"cn" => ["#{cn}!!!"]}],
451
+ ],
452
+ },
453
+ detect_modify(user) {user.save})
359
454
  end
360
455
  end
361
456
 
362
457
  def test_save_without_changes
363
458
  make_temporary_user do |user, password|
364
- assert_false(detect_modify(user) {user.save})
459
+ assert_equal({
460
+ :modified => false,
461
+ :entries => [],
462
+ },
463
+ detect_modify(user) {user.save})
365
464
  end
366
465
  end
367
466
 
@@ -1188,23 +1287,30 @@ EOX
1188
1287
 
1189
1288
  private
1190
1289
  def detect_modify(object)
1191
- modify_called = false
1290
+ modify_called = nil
1291
+ entries = nil
1192
1292
  singleton_class = class << object; self; end
1193
1293
  singleton_class.send(:define_method, :modify_entry) do |*args|
1194
1294
  dn, attributes, options = args
1195
1295
  options ||= {}
1196
1296
  modify_detector = Object.new
1197
1297
  modify_detector.instance_variable_set("@called", false)
1298
+ modify_detector.instance_variable_set("@entries", [])
1198
1299
  def modify_detector.modify(dn, entries, options)
1199
1300
  @called = true
1301
+ @entries = entries
1200
1302
  end
1201
1303
  options[:connection] = modify_detector
1202
1304
  result = super(dn, attributes, options)
1203
1305
  modify_called = modify_detector.instance_variable_get("@called")
1306
+ entries = modify_detector.instance_variable_get("@entries")
1204
1307
  result
1205
1308
  end
1206
1309
  yield
1207
- modify_called
1310
+ {
1311
+ :modified => modify_called,
1312
+ :entries => entries,
1313
+ }
1208
1314
  end
1209
1315
 
1210
1316
  def assert_to_ldif(entry)
@@ -117,6 +117,11 @@ class TestSyntax < Test::Unit::TestCase
117
117
  "19941216103212.345+0900")
118
118
  end
119
119
 
120
+ def test_timezone_difference_with_minutes
121
+ assert_type_cast(Time.parse("2019-02-13 15:54:23 +0530"),
122
+ "20190213155423+0530")
123
+ end
124
+
120
125
  def test_year_month_day_hour_minute
121
126
  assert_type_cast(Time.parse("2008/01/07 03:46:00"),
122
127
  "200801070346")
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activeldap
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.2.2
4
+ version: 5.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Will Drewry
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-07-12 00:00:00.000000000 Z
12
+ date: 2019-02-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activemodel
@@ -360,7 +360,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
360
360
  version: '0'
361
361
  requirements: []
362
362
  rubyforge_project: ruby-activeldap
363
- rubygems_version: 3.0.0.beta1
363
+ rubygems_version: 2.7.6
364
364
  signing_key:
365
365
  specification_version: 4
366
366
  summary: ActiveLdap is a object-oriented API to LDAP