ruby-activeldap 0.8.1 → 0.8.2
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.
- data/CHANGES +5 -0
- data/Manifest.txt +91 -25
- data/README +22 -0
- data/Rakefile +41 -8
- data/TODO +1 -6
- data/examples/config.yaml.example +5 -0
- data/examples/example.der +0 -0
- data/examples/example.jpg +0 -0
- data/examples/groupadd +41 -0
- data/examples/groupdel +35 -0
- data/examples/groupls +49 -0
- data/examples/groupmod +42 -0
- data/examples/lpasswd +55 -0
- data/examples/objects/group.rb +13 -0
- data/examples/objects/ou.rb +4 -0
- data/examples/objects/user.rb +20 -0
- data/examples/ouadd +38 -0
- data/examples/useradd +45 -0
- data/examples/useradd-binary +50 -0
- data/examples/userdel +34 -0
- data/examples/userls +50 -0
- data/examples/usermod +42 -0
- data/examples/usermod-binary-add +47 -0
- data/examples/usermod-binary-add-time +51 -0
- data/examples/usermod-binary-del +48 -0
- data/examples/usermod-lang-add +43 -0
- data/lib/active_ldap.rb +213 -214
- data/lib/active_ldap/adapter/base.rb +461 -0
- data/lib/active_ldap/adapter/ldap.rb +232 -0
- data/lib/active_ldap/adapter/ldap_ext.rb +69 -0
- data/lib/active_ldap/adapter/net_ldap.rb +288 -0
- data/lib/active_ldap/adapter/net_ldap_ext.rb +29 -0
- data/lib/active_ldap/association/belongs_to.rb +3 -1
- data/lib/active_ldap/association/belongs_to_many.rb +5 -6
- data/lib/active_ldap/association/has_many.rb +9 -17
- data/lib/active_ldap/association/has_many_wrap.rb +4 -5
- data/lib/active_ldap/attributes.rb +4 -0
- data/lib/active_ldap/base.rb +201 -56
- data/lib/active_ldap/configuration.rb +11 -1
- data/lib/active_ldap/connection.rb +15 -9
- data/lib/active_ldap/distinguished_name.rb +246 -0
- data/lib/active_ldap/ldap_error.rb +74 -0
- data/lib/active_ldap/object_class.rb +9 -5
- data/lib/active_ldap/schema.rb +50 -9
- data/lib/active_ldap/validations.rb +11 -13
- data/rails/plugin/active_ldap/generators/scaffold_al/scaffold_al_generator.rb +7 -0
- data/rails/plugin/active_ldap/generators/scaffold_al/templates/ldap.yml +21 -0
- data/rails/plugin/active_ldap/init.rb +10 -4
- data/test/al-test-utils.rb +46 -3
- data/test/run-test.rb +16 -4
- data/test/test-unit-ext/always-show-result.rb +28 -0
- data/test/test-unit-ext/priority.rb +163 -0
- data/test/test_adapter.rb +81 -0
- data/test/test_attributes.rb +8 -1
- data/test/test_base.rb +132 -3
- data/test/test_base_per_instance.rb +14 -3
- data/test/test_connection.rb +19 -0
- data/test/test_dn.rb +161 -0
- data/test/test_find.rb +24 -0
- data/test/test_object_class.rb +15 -2
- data/test/test_schema.rb +108 -1
- metadata +111 -41
- data/lib/active_ldap/adaptor/base.rb +0 -29
- data/lib/active_ldap/adaptor/ldap.rb +0 -466
- data/lib/active_ldap/ldap.rb +0 -113
    
        data/test/test_attributes.rb
    CHANGED
    
    | @@ -4,6 +4,14 @@ class TestAttributes < Test::Unit::TestCase | |
| 4 4 | 
             
              include AlTestUtils
         | 
| 5 5 |  | 
| 6 6 | 
             
              priority :must
         | 
| 7 | 
            +
              def test_to_real_attribute_name
         | 
| 8 | 
            +
                user = @user_class.new("user")
         | 
| 9 | 
            +
                assert_nil(user.__send__(:to_real_attribute_name, "objectclass"))
         | 
| 10 | 
            +
                assert_equal("objectClass",
         | 
| 11 | 
            +
                             user.__send__(:to_real_attribute_name, "objectclass", true))
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              priority :normal
         | 
| 7 15 | 
             
              def test_protect_object_class_from_mass_assignment
         | 
| 8 16 | 
             
                classes = @user_class.required_classes + ["inetOrgPerson"]
         | 
| 9 17 | 
             
                user = @user_class.new(:uid => "XXX", :object_class => classes)
         | 
| @@ -20,7 +28,6 @@ class TestAttributes < Test::Unit::TestCase | |
| 20 28 | 
             
                assert_equal([], user.classes -  @user_class.required_classes)
         | 
| 21 29 | 
             
              end
         | 
| 22 30 |  | 
| 23 | 
            -
              priority :normal
         | 
| 24 31 | 
             
              def test_normalize_attribute
         | 
| 25 32 | 
             
                assert_equal(["usercertificate", [{"binary" => []}]],
         | 
| 26 33 | 
             
                             ActiveLdap::Base.normalize_attribute("userCertificate", []))
         | 
    
        data/test/test_base.rb
    CHANGED
    
    | @@ -4,6 +4,117 @@ class TestBase < Test::Unit::TestCase | |
| 4 4 | 
             
              include AlTestUtils
         | 
| 5 5 |  | 
| 6 6 | 
             
              priority :must
         | 
| 7 | 
            +
              def test_case_insensitive_nested_ou
         | 
| 8 | 
            +
                ou_class("ou=Users").new("Sub").save!
         | 
| 9 | 
            +
                make_temporary_user(:uid => "test-user,ou=SUB") do |user, password|
         | 
| 10 | 
            +
                  sub_user_class = Class.new(@user_class)
         | 
| 11 | 
            +
                  sub_user_class.ldap_mapping :prefix => "ou=sub"
         | 
| 12 | 
            +
                  assert_equal("uid=test-user,ou=sub,#{@user_class.base}",
         | 
| 13 | 
            +
                               sub_user_class.find(user.uid).dn)
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              priority :normal
         | 
| 18 | 
            +
              def test_nested_ou
         | 
| 19 | 
            +
                make_ou("units")
         | 
| 20 | 
            +
                units = ou_class("ou=units")
         | 
| 21 | 
            +
                units.new("one").save!
         | 
| 22 | 
            +
                units.new("two").save!
         | 
| 23 | 
            +
                units.new("three").save!
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                ous = units.find(:all, :scope => :sub).collect {|unit| unit.ou}
         | 
| 26 | 
            +
                assert_equal(["one", "two", "three", "units"].sort,  ous.sort)
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                ous = units.find(:all, :scope => :base).collect {|unit| unit.ou}
         | 
| 29 | 
            +
                assert_equal(["units"].sort, ous.sort)
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                ous = units.find(:all, :scope => :one).collect {|unit| unit.ou}
         | 
| 32 | 
            +
                assert_equal(["one", "two", "three"].sort, ous.sort)
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
              def test_initialize_with_recommended_classes
         | 
| 36 | 
            +
                mapping = {
         | 
| 37 | 
            +
                  :dn_attribute => "cn",
         | 
| 38 | 
            +
                  :prefix => "",
         | 
| 39 | 
            +
                  :scope => :one,
         | 
| 40 | 
            +
                  :classes => ["person"],
         | 
| 41 | 
            +
                }
         | 
| 42 | 
            +
                person_class = Class.new(ActiveLdap::Base)
         | 
| 43 | 
            +
                person_class.ldap_mapping mapping
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                person_with_uid_class = Class.new(ActiveLdap::Base)
         | 
| 46 | 
            +
                person_with_uid_mapping =
         | 
| 47 | 
            +
                  mapping.merge(:recommended_classes => ["uidObject"])
         | 
| 48 | 
            +
                person_with_uid_class.ldap_mapping person_with_uid_mapping
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                name = "sample"
         | 
| 51 | 
            +
                name_with_uid = "sample-with-uid"
         | 
| 52 | 
            +
                uid = "1000"
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                person = person_class.new(name)
         | 
| 55 | 
            +
                person.sn = name
         | 
| 56 | 
            +
                assert(person.save)
         | 
| 57 | 
            +
                assert_equal([name, name], [person.cn, person.sn])
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                person_with_uid = person_with_uid_class.new(name_with_uid)
         | 
| 60 | 
            +
                person_with_uid.sn = name_with_uid
         | 
| 61 | 
            +
                assert(!person_with_uid.save)
         | 
| 62 | 
            +
                person_with_uid.uid = uid
         | 
| 63 | 
            +
                assert(person_with_uid.save)
         | 
| 64 | 
            +
                assert_equal([name_with_uid, name_with_uid],
         | 
| 65 | 
            +
                             [person_with_uid.cn, person_with_uid.sn])
         | 
| 66 | 
            +
                assert_equal(uid, person_with_uid.uid)
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                assert_equal([person.dn, person_with_uid.dn],
         | 
| 69 | 
            +
                             person_class.search.collect {|dn, attrs| dn})
         | 
| 70 | 
            +
                person_class.required_classes += ["uidObject"]
         | 
| 71 | 
            +
                assert_equal([person_with_uid.dn],
         | 
| 72 | 
            +
                             person_class.search.collect {|dn, attrs| dn})
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                assert_equal([person.dn, person_with_uid.dn],
         | 
| 75 | 
            +
                             person_with_uid_class.search.collect {|dn, attrs| dn})
         | 
| 76 | 
            +
              end
         | 
| 77 | 
            +
             | 
| 78 | 
            +
              def test_search_with_object_class
         | 
| 79 | 
            +
                ou_class = Class.new(ActiveLdap::Base)
         | 
| 80 | 
            +
                ou_class.ldap_mapping :dn_attribute => "ou",
         | 
| 81 | 
            +
                                      :prefix => "",
         | 
| 82 | 
            +
                                      :scope => :one,
         | 
| 83 | 
            +
                                      :classes => ["organizationalUnit"]
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                name = "sample"
         | 
| 86 | 
            +
                ou = ou_class.new(name)
         | 
| 87 | 
            +
                assert(ou.save)
         | 
| 88 | 
            +
                assert_equal(name, ou.ou)
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                assert_equal([ou.dn],
         | 
| 91 | 
            +
                             ou_class.search(:value => name).collect {|dn, attrs| dn})
         | 
| 92 | 
            +
                ou_class.required_classes += ["organization"]
         | 
| 93 | 
            +
                assert_equal([],
         | 
| 94 | 
            +
                             ou_class.search(:value => name).collect {|dn, attrs| dn})
         | 
| 95 | 
            +
              end
         | 
| 96 | 
            +
             | 
| 97 | 
            +
              def test_new_without_argument
         | 
| 98 | 
            +
                user = @user_class.new
         | 
| 99 | 
            +
                assert_equal(@user_class_classes, user.classes)
         | 
| 100 | 
            +
                assert(user.respond_to?(:cn))
         | 
| 101 | 
            +
              end
         | 
| 102 | 
            +
             | 
| 103 | 
            +
              def test_new_with_invalid_argument
         | 
| 104 | 
            +
                user = @user_class.new
         | 
| 105 | 
            +
                assert_raises(ArgumentError) do
         | 
| 106 | 
            +
                  @user_class.new(100)
         | 
| 107 | 
            +
                end
         | 
| 108 | 
            +
              end
         | 
| 109 | 
            +
             | 
| 110 | 
            +
              def test_loose_dn
         | 
| 111 | 
            +
                make_temporary_user do |user,|
         | 
| 112 | 
            +
                  assert(user.class.exists?(user.dn))
         | 
| 113 | 
            +
                  assert(user.class.exists?(user.dn.gsub(/,/, " , ")))
         | 
| 114 | 
            +
                  assert(user.class.exists?(user.dn.gsub(/=/, " = ")))
         | 
| 115 | 
            +
                end
         | 
| 116 | 
            +
              end
         | 
| 117 | 
            +
             | 
| 7 118 | 
             
              def test_new_without_class
         | 
| 8 119 | 
             
                no_class_class = Class.new(ActiveLdap::Base)
         | 
| 9 120 | 
             
                no_class_class.ldap_mapping :dn_attribute => "dc", :prefix => "",
         | 
| @@ -13,7 +124,6 @@ class TestBase < Test::Unit::TestCase | |
| 13 124 | 
             
                end
         | 
| 14 125 | 
             
              end
         | 
| 15 126 |  | 
| 16 | 
            -
              priority :normal
         | 
| 17 127 | 
             
              def test_save_for_dNSDomain
         | 
| 18 128 | 
             
                domain_class = Class.new(ActiveLdap::Base)
         | 
| 19 129 | 
             
                domain_class.ldap_mapping :dn_attribute => "dc", :prefix => "",
         | 
| @@ -144,13 +254,32 @@ class TestBase < Test::Unit::TestCase | |
| 144 254 |  | 
| 145 255 | 
             
                  assert(@user_class.exists?(user.dn))
         | 
| 146 256 | 
             
                  @user_class.required_classes += ["posixAccount"]
         | 
| 147 | 
            -
                  assert( | 
| 148 | 
            -
                  assert_raises(ActiveLdap:: | 
| 257 | 
            +
                  assert(!@user_class.exists?(user.dn))
         | 
| 258 | 
            +
                  assert_raises(ActiveLdap::EntryNotFound) do
         | 
| 149 259 | 
             
                    @user_class.find(user.dn)
         | 
| 150 260 | 
             
                  end
         | 
| 151 261 | 
             
                end
         | 
| 152 262 | 
             
              end
         | 
| 153 263 |  | 
| 264 | 
            +
              def test_find_dns_without_required_object_class
         | 
| 265 | 
            +
                make_temporary_user do |user1,|
         | 
| 266 | 
            +
                  make_temporary_user do |user2,|
         | 
| 267 | 
            +
                    make_temporary_user do |user3,|
         | 
| 268 | 
            +
                      @user_class.required_classes -= ["posixAccount"]
         | 
| 269 | 
            +
                      user1.remove_class("posixAccount")
         | 
| 270 | 
            +
                      assert(user1.save)
         | 
| 271 | 
            +
             | 
| 272 | 
            +
                      @user_class.required_classes += ["posixAccount"]
         | 
| 273 | 
            +
                      assert_raises(ActiveLdap::EntryNotFound) do
         | 
| 274 | 
            +
                        @user_class.find(user1.dn, user2.dn, user3.dn)
         | 
| 275 | 
            +
                      end
         | 
| 276 | 
            +
                      assert_equal([user2.dn, user3.dn],
         | 
| 277 | 
            +
                                   @user_class.find(user2.dn, user3.dn).collect {|u| u.dn})
         | 
| 278 | 
            +
                    end
         | 
| 279 | 
            +
                  end
         | 
| 280 | 
            +
                end
         | 
| 281 | 
            +
              end
         | 
| 282 | 
            +
             | 
| 154 283 | 
             
              def test_reload
         | 
| 155 284 | 
             
                make_temporary_user do |user1,|
         | 
| 156 285 | 
             
                  user2 = @user_class.find(user1.uid)
         | 
| @@ -3,9 +3,22 @@ require 'al-test-utils' | |
| 3 3 | 
             
            class TestBasePerInstance < Test::Unit::TestCase
         | 
| 4 4 | 
             
              include AlTestUtils
         | 
| 5 5 |  | 
| 6 | 
            +
              def setup
         | 
| 7 | 
            +
                super
         | 
| 8 | 
            +
                ou_class("ou=Users").new("Sub").save!
         | 
| 9 | 
            +
              end
         | 
| 10 | 
            +
             | 
| 6 11 | 
             
              priority :must
         | 
| 12 | 
            +
              def test_loose_dn
         | 
| 13 | 
            +
                user = @user_class.new("test-user , ou = Sub")
         | 
| 14 | 
            +
                assert_equal("uid=test-user,ou=Sub,#{@user_class.base}", user.dn)
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                user = @user_class.new("test-user , ou = Sub, #{@user_class.base}")
         | 
| 17 | 
            +
                assert_equal("uid=test-user,ou=Sub,#{@user_class.base}", user.dn)
         | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              priority :normal
         | 
| 7 21 | 
             
              def test_exists?
         | 
| 8 | 
            -
                ou_class("ou=Users").new("Sub").save
         | 
| 9 22 | 
             
                make_temporary_user(:uid => "test-user,ou=Sub") do |user, password|
         | 
| 10 23 | 
             
                  assert(@user_class.exists?(user.uid))
         | 
| 11 24 | 
             
                  assert(@user_class.exists?("uid=#{user.uid}"))
         | 
| @@ -16,9 +29,7 @@ class TestBasePerInstance < Test::Unit::TestCase | |
| 16 29 | 
             
                end
         | 
| 17 30 | 
             
              end
         | 
| 18 31 |  | 
| 19 | 
            -
              priority :normal
         | 
| 20 32 | 
             
              def test_add
         | 
| 21 | 
            -
                ou_class("ou=Users").new("Sub").save
         | 
| 22 33 | 
             
                make_temporary_user(:uid => "test-user,ou=Sub") do |user, password|
         | 
| 23 34 | 
             
                  assert_equal("uid=test-user,ou=Sub,#{@user_class.base}", user.dn)
         | 
| 24 35 | 
             
                  assert_equal("test-user", user.uid)
         | 
    
        data/test/test_connection.rb
    CHANGED
    
    | @@ -2,6 +2,7 @@ require 'al-test-utils' | |
| 2 2 |  | 
| 3 3 | 
             
            class TestConnection < Test::Unit::TestCase
         | 
| 4 4 | 
             
              include AlTestUtils::Config
         | 
| 5 | 
            +
              include AlTestUtils::MockLogger
         | 
| 5 6 |  | 
| 6 7 | 
             
              def setup
         | 
| 7 8 | 
             
                super
         | 
| @@ -12,6 +13,24 @@ class TestConnection < Test::Unit::TestCase | |
| 12 13 | 
             
                super
         | 
| 13 14 | 
             
              end
         | 
| 14 15 |  | 
| 16 | 
            +
              priority :must
         | 
| 17 | 
            +
              def test_bind_format_check
         | 
| 18 | 
            +
                connector = Class.new(ActiveLdap::Base)
         | 
| 19 | 
            +
                assert(!connector.connected?)
         | 
| 20 | 
            +
                exception = nil
         | 
| 21 | 
            +
                assert_raises(ArgumentError) do
         | 
| 22 | 
            +
                  begin
         | 
| 23 | 
            +
                    connector.establish_connection(:bind_format => "uid=%s,dc=test",
         | 
| 24 | 
            +
                                                   :allow_anonymous => false)
         | 
| 25 | 
            +
                  rescue Exception
         | 
| 26 | 
            +
                    exception = $!
         | 
| 27 | 
            +
                    raise
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
                assert_equal("Unknown key(s): bind_format", exception.message)
         | 
| 31 | 
            +
              end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
              priority :normal
         | 
| 15 34 | 
             
              def test_can_reconnect?
         | 
| 16 35 | 
             
                assert(!ActiveLdap::Base.connected?)
         | 
| 17 36 |  | 
    
        data/test/test_dn.rb
    ADDED
    
    | @@ -0,0 +1,161 @@ | |
| 1 | 
            +
            require 'al-test-utils'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class TestDN < Test::Unit::TestCase
         | 
| 4 | 
            +
              include AlTestUtils
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              def setup
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              def teardown
         | 
| 10 | 
            +
              end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              priority :must
         | 
| 13 | 
            +
              def test_case_insensitive_dn_minus
         | 
| 14 | 
            +
                assert_dn_minus("dc=xxx", "dc=xxx,dc=LoCaL,dc=net", "dc=LOCAL,dc=net")
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              priority :normal
         | 
| 18 | 
            +
              def test_dn_hash
         | 
| 19 | 
            +
                dn1 = ActiveLdap::DN.parse("o=xxx,dc=local,dc=net")
         | 
| 20 | 
            +
                dn2 = ActiveLdap::DN.parse("O = xxx , DC = local , DC = net")
         | 
| 21 | 
            +
                assert_equal(dn1.hash, dn2.hash)
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                hash = {dn1 => :dn}
         | 
| 24 | 
            +
                assert_equal(:dn, hash[dn2])
         | 
| 25 | 
            +
              end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
              def test_dn_to_s
         | 
| 28 | 
            +
                assert_dn_to_s("dc=xxx,dc=local,dc=net",
         | 
| 29 | 
            +
                               "dc = xxx, dc = \"local\",dc=net")
         | 
| 30 | 
            +
                assert_dn_to_s("dc=l\\,o\\=c\\+a\\<l\\>,dc=\\#n\\;e\\\\t",
         | 
| 31 | 
            +
                               "dc = \"l,o=c+a<l>\" , dc=\"#n;e\\\\t\"")
         | 
| 32 | 
            +
                assert_dn_to_s("dc=\" l\\\"o c\\\\a l \",dc=\" n e t \"",
         | 
| 33 | 
            +
                               "dc = \" l\\\"o c\\\\a l \" , dc= \\20n\\20e\\20t\\20")
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
              def test_dn_minus
         | 
| 37 | 
            +
                assert_dn_minus("dc=xxx", "dc=xxx,dc=local,dc=net", "dc=local,dc=net")
         | 
| 38 | 
            +
                assert_dn_minus_raise("dc=xxx,dc=net", "dc=local,dc=net")
         | 
| 39 | 
            +
              end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
              def test_parse_good_manner_dn
         | 
| 42 | 
            +
                assert_dn([["dc", "local"], ["dc", "net"]], "dc=local,dc=net")
         | 
| 43 | 
            +
                assert_dn([["dc", "net"]], "dc=net")
         | 
| 44 | 
            +
                assert_dn([], "")
         | 
| 45 | 
            +
              end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
              def test_parse_dn_with_space
         | 
| 48 | 
            +
                assert_dn([["dc", "net"]], "dc =net")
         | 
| 49 | 
            +
                assert_dn([["dc", "net"]], "dc = net")
         | 
| 50 | 
            +
                assert_dn([["dc", "local"], ["dc", "net"]], "dc = local , dc = net")
         | 
| 51 | 
            +
                assert_dn([["dc", "local"], ["dc", "net "]], "dc = local , dc = net ")
         | 
| 52 | 
            +
              end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
              def test_parse_dn_with_hex_pairs
         | 
| 55 | 
            +
                assert_dn([["dc", "local"], ["dc", "net"]],
         | 
| 56 | 
            +
                          "dc = #6C6f63616C , dc = net")
         | 
| 57 | 
            +
                assert_dn([["dc", "lo cal "], ["dc", "net"]],
         | 
| 58 | 
            +
                          "dc = #6C6f2063616C20 ,dc=net")
         | 
| 59 | 
            +
              end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
              def test_parse_dn_with_quoted_attribute_value
         | 
| 62 | 
            +
                assert_dn([["dc", " l o c a l "], ["dc", "+n,\"e\";t"]],
         | 
| 63 | 
            +
                          "dc = \" l o c a l \" , dc = \"+n,\\\"e\\\";t\"")
         | 
| 64 | 
            +
              end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
              def test_parse_dn_in_rfc2253
         | 
| 67 | 
            +
                assert_dn([
         | 
| 68 | 
            +
                           {"cn" => "Steve Kille"},
         | 
| 69 | 
            +
                           {"o" => "Isode Limited"},
         | 
| 70 | 
            +
                           {"c" => "GB"}
         | 
| 71 | 
            +
                          ],
         | 
| 72 | 
            +
                          "CN=Steve Kille,O=Isode Limited,C=GB")
         | 
| 73 | 
            +
                assert_dn([
         | 
| 74 | 
            +
                           {"ou" => "Sales", "cn" => "J. Smith"},
         | 
| 75 | 
            +
                           {"o" => "Widget Inc."},
         | 
| 76 | 
            +
                           {"c" => "US"},
         | 
| 77 | 
            +
                          ],
         | 
| 78 | 
            +
                          "OU=Sales+CN=J. Smith,O=Widget Inc.,C=US")
         | 
| 79 | 
            +
                assert_dn([
         | 
| 80 | 
            +
                           {"cn" => "L. Eagle"},
         | 
| 81 | 
            +
                           {"o" => "Sue, Grabbit and Runn"},
         | 
| 82 | 
            +
                           {"c" => "GB"},
         | 
| 83 | 
            +
                          ],
         | 
| 84 | 
            +
                          "CN=L. Eagle,O=Sue\\, Grabbit and Runn,C=GB")
         | 
| 85 | 
            +
                assert_dn([
         | 
| 86 | 
            +
                           {"cn" => "Before\rAfter"},
         | 
| 87 | 
            +
                           {"o" => "Test"},
         | 
| 88 | 
            +
                           {"c" => "GB"}
         | 
| 89 | 
            +
                          ],
         | 
| 90 | 
            +
                          "CN=Before\\0DAfter,O=Test,C=GB")
         | 
| 91 | 
            +
                assert_dn([
         | 
| 92 | 
            +
                           {"1.3.6.1.4.1.1466.0" => [0x04, 0x02, 0x48, 0x69].pack("C*")},
         | 
| 93 | 
            +
                           {"o" => "Test"},
         | 
| 94 | 
            +
                           {"c" => "GB"}
         | 
| 95 | 
            +
                          ],
         | 
| 96 | 
            +
                          "1.3.6.1.4.1.1466.0=#04024869,O=Test,C=GB")
         | 
| 97 | 
            +
                assert_dn([{"sn" => "Lučić"}], "SN=Lu\\C4\\8Di\\C4\\87")
         | 
| 98 | 
            +
              end
         | 
| 99 | 
            +
             | 
| 100 | 
            +
              def test_parse_invalid_dn
         | 
| 101 | 
            +
                assert_invalid_dn("attribute value is missing", "net")
         | 
| 102 | 
            +
                assert_invalid_dn("attribute value is missing", "local,dc=net")
         | 
| 103 | 
            +
                assert_invalid_dn("attribute value is missing", "dc=,dc=net")
         | 
| 104 | 
            +
                assert_invalid_dn("attribute type is missing", "=local,dc=net")
         | 
| 105 | 
            +
                assert_invalid_dn("name component is missing", ",dc=net")
         | 
| 106 | 
            +
                assert_invalid_dn("name component is missing", "dc=local,")
         | 
| 107 | 
            +
                assert_invalid_dn("found unmatched quotation", "dc=\"local")
         | 
| 108 | 
            +
                assert_invalid_dn("found unmatched quotation", "dc=\"loc\\al\"")
         | 
| 109 | 
            +
              end
         | 
| 110 | 
            +
             | 
| 111 | 
            +
              def test_parse_quoted_comma_dn
         | 
| 112 | 
            +
                assert_dn([["dc", "local,"]], "dc=local\\,")
         | 
| 113 | 
            +
              end
         | 
| 114 | 
            +
             | 
| 115 | 
            +
              def test_parser_collect_pairs
         | 
| 116 | 
            +
                assert_dn_parser_collect_pairs(",", "\\,")
         | 
| 117 | 
            +
              end
         | 
| 118 | 
            +
             | 
| 119 | 
            +
              priority :normal
         | 
| 120 | 
            +
             | 
| 121 | 
            +
              private
         | 
| 122 | 
            +
              def assert_dn(expected, dn)
         | 
| 123 | 
            +
                assert_equal(ActiveLdap::DN.new(*expected), ActiveLdap::DN.parse(dn))
         | 
| 124 | 
            +
              end
         | 
| 125 | 
            +
             | 
| 126 | 
            +
              def assert_invalid_dn(reason, dn)
         | 
| 127 | 
            +
                exception = nil
         | 
| 128 | 
            +
                assert_raise(ActiveLdap::DistinguishedNameInvalid) do
         | 
| 129 | 
            +
                  begin
         | 
| 130 | 
            +
                    ActiveLdap::DN.parse(dn)
         | 
| 131 | 
            +
                  rescue Exception
         | 
| 132 | 
            +
                    exception = $!
         | 
| 133 | 
            +
                    raise
         | 
| 134 | 
            +
                  end
         | 
| 135 | 
            +
                end
         | 
| 136 | 
            +
                assert_not_nil(exception)
         | 
| 137 | 
            +
                assert_equal(dn, exception.dn)
         | 
| 138 | 
            +
                assert_equal(reason, exception.reason)
         | 
| 139 | 
            +
              end
         | 
| 140 | 
            +
             | 
| 141 | 
            +
              def assert_dn_parser_collect_pairs(expected, source)
         | 
| 142 | 
            +
                parser = ActiveLdap::DN::Parser.new(source)
         | 
| 143 | 
            +
                assert_equal(expected,
         | 
| 144 | 
            +
                             parser.send(:collect_pairs, StringScanner.new(source)))
         | 
| 145 | 
            +
              end
         | 
| 146 | 
            +
             | 
| 147 | 
            +
              def assert_dn_minus(expected, subtrahend, minuend)
         | 
| 148 | 
            +
                result = ActiveLdap::DN.parse(subtrahend) - ActiveLdap::DN.parse(minuend)
         | 
| 149 | 
            +
                assert_equal(ActiveLdap::DN.parse(expected), result)
         | 
| 150 | 
            +
              end
         | 
| 151 | 
            +
             | 
| 152 | 
            +
              def assert_dn_minus_raise(subtrahend, minuend)
         | 
| 153 | 
            +
                assert_raise(ArgumentError) do
         | 
| 154 | 
            +
                  ActiveLdap::DN.parse(subtrahend) - ActiveLdap::DN.parse(minuend)
         | 
| 155 | 
            +
                end
         | 
| 156 | 
            +
              end
         | 
| 157 | 
            +
             | 
| 158 | 
            +
              def assert_dn_to_s(expected, dn)
         | 
| 159 | 
            +
                assert_equal(expected, ActiveLdap::DN.parse(dn).to_s)
         | 
| 160 | 
            +
              end
         | 
| 161 | 
            +
            end
         | 
    
        data/test/test_find.rb
    CHANGED
    
    | @@ -3,6 +3,29 @@ require 'al-test-utils' | |
| 3 3 | 
             
            class TestFind < Test::Unit::TestCase
         | 
| 4 4 | 
             
              include AlTestUtils
         | 
| 5 5 |  | 
| 6 | 
            +
              priority :must
         | 
| 7 | 
            +
              def test_find_with_sort
         | 
| 8 | 
            +
                make_temporary_user(:uid => "user1") do |user1,|
         | 
| 9 | 
            +
                  make_temporary_user(:uid => "user2") do |user2,|
         | 
| 10 | 
            +
                    users = @user_class.find(:all, :sort_by => "uid", :order => 'asc')
         | 
| 11 | 
            +
                    assert_equal(["user1", "user2"], users.collect {|u| u.uid})
         | 
| 12 | 
            +
                    users = @user_class.find(:all, :sort_by => "uid", :order => 'desc')
         | 
| 13 | 
            +
                    assert_equal(["user2", "user1"], users.collect {|u| u.uid})
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                    users = @user_class.find(:all, :order => 'asc')
         | 
| 16 | 
            +
                    assert_equal(["user1", "user2"], users.collect {|u| u.uid})
         | 
| 17 | 
            +
                    users = @user_class.find(:all, :order => 'desc')
         | 
| 18 | 
            +
                    assert_equal(["user2", "user1"], users.collect {|u| u.uid})
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                    users = @user_class.find(:all, :order => 'asc', :limit => 1)
         | 
| 21 | 
            +
                    assert_equal(["user1"], users.collect {|u| u.uid})
         | 
| 22 | 
            +
                    users = @user_class.find(:all, :order => 'desc', :limit => 1)
         | 
| 23 | 
            +
                    assert_equal(["user2"], users.collect {|u| u.uid})
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
              priority :normal
         | 
| 6 29 | 
             
              def test_split_search_value
         | 
| 7 30 | 
             
                assert_split_search_value([nil, "test-user", nil], "test-user")
         | 
| 8 31 | 
             
                assert_split_search_value([nil, "test-user", "ou=Sub"], "test-user,ou=Sub")
         | 
| @@ -17,6 +40,7 @@ class TestFind < Test::Unit::TestCase | |
| 17 40 | 
             
                  assert_equal(user.uid, @user_class.find(user.uid).uid)
         | 
| 18 41 | 
             
                  options = {:attribute => "cn", :value => user.cn}
         | 
| 19 42 | 
             
                  assert_equal(user.uid, @user_class.find(:first, options).uid)
         | 
| 43 | 
            +
                  assert_equal(user.uid, @user_class.find(options).uid)
         | 
| 20 44 | 
             
                  assert_equal(user.to_ldif, @user_class.find(:first).to_ldif)
         | 
| 21 45 | 
             
                  assert_equal([user.uid], @user_class.find(:all).collect {|u| u.uid})
         | 
| 22 46 |  |