activeldap 5.2.2 → 5.2.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.
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