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 +4 -4
- data/doc/text/news.textile +18 -0
- data/lib/active_ldap/base.rb +19 -2
- data/lib/active_ldap/schema/syntaxes.rb +8 -4
- data/lib/active_ldap/version.rb +1 -1
- data/test/test_base.rb +110 -4
- data/test/test_syntax.rb +5 -0
- metadata +3 -3
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: c13c85afc7e4d89ae99b34594d827b7970112e8a27cf011f484d2e8ec8708a6a
         | 
| 4 | 
            +
              data.tar.gz: b6918bc5db92871b7e395911f08ca6f443a9dd4b6dd2a800716e07084f70b26e
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 5a3724db64fcd07d42fa7bf11bbddd646d72f2ece01de634abac1c7cf038ab36a209359768bd252d19b64b3fe99a370c53d96947ec87f8ef159a985228f421f1
         | 
| 7 | 
            +
              data.tar.gz: caa6c1a7f32a8899f36dd9ce5e8996fe46838b78a1ba00dcd661d4480b15ac7763d0bead0c896c81f4afda80839c8dbe48dfc554a5c3a12920e479b26f68a4fc
         | 
    
        data/doc/text/news.textile
    CHANGED
    
    | @@ -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
         | 
    
        data/lib/active_ldap/base.rb
    CHANGED
    
    | @@ -1372,7 +1372,14 @@ module ActiveLdap | |
| 1372 1372 | 
             
                    if k == _dn_attribute
         | 
| 1373 1373 | 
             
                      new_dn_value = value[0]
         | 
| 1374 1374 | 
             
                    else
         | 
| 1375 | 
            -
                       | 
| 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 | 
            -
                     | 
| 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 ==  | 
| 199 | 
            -
                          arguments | 
| 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 | 
            -
                           | 
| 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
         | 
    
        data/lib/active_ldap/version.rb
    CHANGED
    
    
    
        data/test/test_base.rb
    CHANGED
    
    | @@ -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 | 
            -
                   | 
| 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 | 
            -
                   | 
| 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 =  | 
| 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 | 
            -
                 | 
| 1310 | 
            +
                {
         | 
| 1311 | 
            +
                  :modified => modify_called,
         | 
| 1312 | 
            +
                  :entries => entries,
         | 
| 1313 | 
            +
                }
         | 
| 1208 1314 | 
             
              end
         | 
| 1209 1315 |  | 
| 1210 1316 | 
             
              def assert_to_ldif(entry)
         | 
    
        data/test/test_syntax.rb
    CHANGED
    
    | @@ -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. | 
| 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:  | 
| 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:  | 
| 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
         |